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的安装和使用