从永远到永远-SpringCloud实战-TenSquare

Spring Cloud教程看了千千万了,回头想想还是什么也不会。实践是检验真理的唯一标准,写个项目吧。

1.mysql作为一个微服务,制作mysql容器。需要的虚拟机镜像已经提供,链接地址:

解压后双击如下
在这里插入图片描述
我内存只有8G,只能修改内存给到4G了。
用户名账户开机,xshell连接方便操作,docker没启动,启动。
mysql镜像已经给下载了,直接制作容器:

在这里插入图片描述
在这里插入图片描述
以守护进程方式开启容器,命名为tensquare_mysql,指定端口,指定密码,指定镜像名称。之后查看容器,发现成功。

mysql客户端测试连接成功:
在这里插入图片描述
至此,mysql微服务搭建成功,此服务作为开发数据库。

2.数据库建表,已经有sql脚本,直接执行。
在这里插入图片描述
3.配置一下idea
在这里插入图片描述
jdk:换成自己的jdk用的1.8

maven:
在这里插入图片描述
在这里插入图片描述
4.创建父工程
主要把pom文件贴上:已经提供。
5.创建common模块
前端需要的返回值封装,创建三个类,注意泛型的使用
分布式id,twitter的雪花算法

6.base模块
引入需要的依赖
配置文件增加配置

创建启动类,需要用到common中的雪花算法,将工具类单独注册。(为什么单端是因为有的模块不需要,没必要将其整个注入spring,谁需要谁在启动类中单独加进去即可)
controller方法暂时没有处理失败的情况!!!
单元测试和postman测试浪费时间,省略了。

异常处理,讲道理没看明白,需要再看看!!!

package com.scbg.base.controller;

import entity.Result;
import entity.StatusCode;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @program: tensquare_parent52
 * @description: 异常处理类
 * @author: 三层饼干儿
 * @create: 2019-09-09 19:28
 **/
@RestControllerAdvice
public class BaseExceptionHandler {
	@ExceptionHandler(value = Exception.class)
	public Result exception(Exception e){
		e.printStackTrace();
		return new Result(false, StatusCode.ERROR,e.getMessage(),null);
	}
}

7.条件查询,spring-data-jpa的使用注意与以前命名规则限定查询条件的区别(springboot项目中之恶在dao中使用命名封装了查询条件,与此处效果其实一样的)

public List<Label> findSearch(Label label) {
		//多条件查询
		return labelDao.findAll(new Specification<Label>() {
			/**
			 *
			 * @param root 跟对象,封装条件的对象。例如:where 类名=label.getID
			 * @param query	封装的查询关键字,一般用不着,还不如直接写sql里边呢
			 * @param cb	封装条件查询对象的,不太好解使,结合代码看
			 * @return
			 */
			@Override
			public Predicate toPredicate(Root<Label> root, CriteriaQuery<?>query, CriteriaBuilder cb) {
				//一个list,存放所有条件
				List<Predicate>list= new ArrayList<>();
				if(label.getLabelname()!=null&&!"".equals(label.getLabelname())){
					Predicate predicate = cb.like(root.get("labelname").as(String.class), "%" + label.getLabelname() + "%");//相当于where labelname like "%labename实际值%"
					list.add(predicate);//将这个查询条件放入集合
				}
				if(label.getState()!=null&&!"".equals(label.getState())){
					Predicate predicate = cb.equal(root.get("state").as(String.class), label.getState());
					list.add(predicate);
				}
				//new 一个数组作为最终返回条件,这里为什么需要先有个集合,再转化成数组,是因为cb.and()需要的是可变参。但是new Predicate[]需要指定参数
				Predicate[] parr= new Predicate[list.size()];
				//将list数据转入parr数组中
				list.toArray(parr);
				return cb.and(parr);//
			}
		});
	}

8.分页查询

/**
	 * 分页查询
	 * @param label
	 * @param page
	 * @param size
	 * @return
	 */
	@RequestMapping(value="/search/{page}/{size}",method = RequestMethod.POST)
	public Result pageQuery(@RequestBody Label label,@PathVariable int page,@PathVariable int size){
		Page<Label> pageData =labelService.pageQuery(label,page,size);
		//没有考虑失败的情况
		return new Result(true, StatusCode.OK,"查询成功",new PageResult<Label>(pageData.getTotalElements(),pageData.getContent()));
	}
/**
	 * 分页条件查询
	 * @param label
	 * @param page
	 * @param size
	 * @return
	 */
	public Page<Label> pageQuery(Label label, int page, int size) {
		Pageable pageable= PageRequest.of(page-1,size);
		return labelDao.findAll(new Specification<Label>() {
			/**
			 *
			 * @param root 跟对象,封装条件的对象。例如:where 类名=label.getID
			 * @param query	封装的查询关键字,一般用不着,还不如直接写sql里边呢
			 * @param cb	封装条件查询对象的,不太好解使,结合代码看
			 * @return
			 */
			@Override
			public Predicate toPredicate(Root<Label> root, CriteriaQuery<?>query, CriteriaBuilder cb) {
				//一个list,存放所有条件
				List<Predicate>list= new ArrayList<>();
				if(label.getLabelname()!=null&&!"".equals(label.getLabelname())){
					Predicate predicate = cb.like(root.get("labelname").as(String.class), "%" + label.getLabelname() + "%");//相当于where labelname like "%labename实际值%"
					list.add(predicate);//将这个查询条件放入集合
				}
				if(label.getState()!=null&&!"".equals(label.getState())){
					Predicate predicate = cb.equal(root.get("state").as(String.class), label.getState());
					list.add(predicate);
				}
				//new 一个数组作为最终返回条件,这里为什么需要先有个集合,再转化成数组,是因为cb.and()需要的是可变参。但是new Predicate[]需要指定参数
				Predicate[] parr= new Predicate[list.size()];
				//将list数据转入parr数组中
				list.toArray(parr);
				return cb.and(parr);//
			}
		}, pageable);
	}

9.招聘模块微服务开发,直接使用代码生成器生成,注意修改个别细节
在这里插入图片描述
在这里插入图片描述
复制到父工程下
在这里插入图片描述
颜色不对,再父工程增加module
在这里插入图片描述
修改recruit模块中国父工程名字
在这里插入图片描述
修改端口及url:
在这里插入图片描述
修改启动类名字,要不生成的都是Application,不好辨认。
10.springdatajpa条件查询的热门企业,注意与7中的对比。
在这里插入图片描述
11.查询招聘的热门推荐和最新推荐,没别的看看方法名就好
在这里插入图片描述
12.问答模块,代码生成器生
分析业务
涉及多表查询,无法使用上边的查询方式,手写sql(尽量不用Hsql和sqsql)。注意开启!
在这里插入图片描述
13.代码生成器生成文章模块
在这里插入图片描述
springdatajpa与mybatis最大区别 在于mybatis在夺标联查上有优势,但是springdatajpa用着更方便
注意默认null值的处理。
14.涉及缓存redis
创建redis容器
在这里插入图片描述
加依赖
配置redis
在这里插入图片描述
redisTemplate存入获得,没啥好说的
15.代码生成gaothering模块学习一下spring boot 的缓存,三个注解
启动类开启
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

**

MogonDB

**
严格为非关系型数据库,非严格,介于关系和非关系之间的数据库。跨平台的面向文档,Bson结构(Json的扩展)。
如何让区分是否为关系型数据库:表之间有关系(一对一一对多靠外键,多对多靠中间表)
1.选择条件
1)数据量大
2)价值低
2.结构
在这里插入图片描述
3.windows安装mogonDB,其客户端和server议题的,windows安装主要是将其作为一个客户端使用。
1)安装

2)环境
3)测试启动,选一个文件夹存数据,启动服务端并指明存放数据位置,启动客户端(默认连接本机的)
在这里插入图片描述
在这里插入图片描述
另起一个窗口,启动客户端连接,成功。
在这里插入图片描述
4.docker启动mongoDB容器。
在这里插入图片描述
本机测试连接
在这里插入图片描述
5.各种命令,基本不会用,大多情况下用代码操作此数据库
6.原始Java代码操作数据库
在这里插入图片描述
复杂一点的查询
在这里插入图片描述
7.使用SpringDataMongoDB操作MongoDB数据库
创建数据库,创建集合(类似于关系型数据库的表)
在这里插入图片描述
创建吐槽微服务模块,不适用代码生成器,因为生成器生成的模块使用的是SpringDataJPA
加入依赖

 <dependencies>
        <dependency>
            <groupId>com.scbg</groupId>
            <artifactId>tensquare_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>

配置文件:
在这里插入图片描述
创建启动类,mongodb存数据不设置主键,其会帮我们默认生成,不便于查询。所以启动类加入id生成器
看到53了!!!

elasticsearch

补充elastic search 理论及使用postman调用restAPI原始操作内容,断了一次网丢掉了。

2.head插件操作
1)安装head插件,直接解压用就可以。
2)安装nodejs,head插件底层使用nodejs开发,需要安装nodejs
直接下一步下一步。
3)安装cnpm,相当于国内镜像

npm install -g cnpm --registry=https://registry.npm.taobao.org

4)安装grunt,做成全局。
npm install -g grunt-cli
5)安装依赖,是给head插件安装依赖,要进入他的目录下!
在这里插入图片描述
6)进入head目录启动
在这里插入图片描述
7)浏览器打开
在这里插入图片描述
8)修改elasticsearch,使其能够被跨域访问,否则上边那个玩意访问不了。
在配置文件增加如下:
在这里插入图片描述

http.cors.enabled: true
http.cors.allow-origin: "*"

重启,并且保证elastic search在启动状态!
在这里插入图片描述
9)利用其增删改查,low到爆,自己爱玩就玩玩没啥用。
查询:
在这里插入图片描述

3.装ik分词器,解压扔到elastic search的plugins文件夹,重启即可。
向词库添加分词
在这里插入图片描述
4.搜索微服务开发
创建模块
依赖

 <dependencies>
        <dependency>
            <groupId>com.scbg</groupId>
            <artifactId>tensquare_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.0.6.RELEASE</version>
        </dependency>
    </dependencies>

配置文件:暂时配置Windows的,linux比较复杂,Windows跑通再处理linux。

server:
  port: 9007
spring:
  application:
    name: tensquare-search
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300

文章搜索类:注意三个是否
在这里插入图片描述
补全dao层,service和controller
5.搜索,基本上搜索模块主要就是该方法,以上的save就是写一下而已,毕竟数据基本是数据库同步到搜索库
dao:搜索给的参数可能只有一个,但是他应该在我们的n个字段中去匹配。(标题可以匹配,简介也可以匹配)
在这里插入图片描述
补全其他
在这里插入图片描述
6.安装同步数据库软件logstash
1)直接解压可用
2)测试,输入命令,成功后输入内容,直接在下边显示出来。-e表示后边直接跟命令,一般开发都是跟-f 命令一般比较长,放在文件中。在这里插入图片描述代表键盘输入,窗口直接输出。
在这里插入图片描述
3)mysql同步文件配置
在这里插入图片描述
启动logstash同步,并指明命令目录。
在这里插入图片描述
差不多一分钟时间(跟配置文件设置有关),查看elasticsearch,发现数据已经同步。
在这里插入图片描述
与数据库数据一致
在这里插入图片描述

7.elasticsearch在本地Windows下的测试基本都完成了,下边往linux上部署服务。
1)创建elastic search容器
在这里插入图片描述
在这里插入图片描述
9200端口已经可以访问,但是9300不行徐奥修改配置。
在这里插入图片描述
3)
1》
在这里插入图片描述
为了解决这个问题,需要将容器文件复制到宿主机,并让容器文件挂载到宿主机。以后修改宿主机上的文件久相当于修改容器内的文件。
2》复制文件至宿主机:
在这里插入图片描述
注意复制docker容器命令要加上容器名称前缀。
3》原来的容器没有设置文件挂载,我们无法使用,停掉并删除。
在这里插入图片描述
4》创建一个带有文件挂载的新容器
在这里插入图片描述
5》修改宿主机的文件
在这里插入图片描述
跨域稍等再处理
5》重启容器是配置生效
在这里插入图片描述
重启成功发现其并无此容器,是因为宿主机默认放开了ip后,宿主机要求我们必须给容器更多的内存和硬件。所以报错了。。。
6》在这里插入图片描述
在这里插入图片描述
重启容器(教程是这么说,但是我测试过需要重启docker,实在不行重启虚拟机)
4)修改下application.yml用Java代码测试一下(必须用代码,因为测的9300端口)
在这里插入图片描述
成了!!!
5)安装分词器IK
ik上传到虚拟机
复制到容器plugins文件夹下(与Windows一样的道理)
在这里插入图片描述
可以测试一下,太麻烦,我没测。。。
在这里插入图片描述
6)安装head插件
保证跨域请求(跟Windows一个道理),改配置:
在这里插入图片描述
创建head容器
在这里插入图片描述
6)浏览器测试一下通过容器中的head连接容器中的elasticsearch
在这里插入图片描述
09-12
在这里插入图片描述

RabbitMQ

在这里插入图片描述
在这里插入图片描述
rabbitMQ的安装和使用
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值