https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec
一、微服务介绍
单体架构所有功能集群在一个架构中,难以维护复杂需求
微服务之间是不同的TomCat要跨服务查询,
学习是如何拆分单体架构为微服务
二、MybatisPlus
1.快速入门
①入门案例
这个mapper继承BaseMapper后就可以直接使用它的方法,增删改查。
②常见注解
继承就可以直接操作对应的数据表原因在于实体类,我们需要遵循一些约定才能自动实现
如果有不想遵循这些约定的内容就需要在实体类中注解。
③常见配置
除了实体包名和mapper地址,其余都是默认设置即可。
MyBatisPlus适合单表查询,多表还是需要自己写SQL
2.核心功能
①条件构造器
where的条件不一定是id可能更加负责,Wrapper
案例:
上述查询例子可以改成如下Lambda形式,避免了硬编码
②自定义SQL
使用MP违反了在逻辑层操作数据库的规则
自定义SQL,where条件过于复杂时采用Wrapper构建where条件,然后传入mapper,然后只需要写除where条件以外的内容就行,注解或者xml都行
注意:mapper层接收时wrapper必须有如下注解
③Service接口
基础用法
查一个get,查多个list
自定义接口继承IService,自定义实现类继承ServiceImpl
在继承ServiceImpl时要确定mapper和实体类
使用时在serviceImp中注入对应service类
案例-基础业务和复杂业务
如果没有涉及到逻辑操作,只是对数据库进行增删改查直接只需要controller即可:
第5个业务代码可以判读是否状态正常,正常再扣钱,需要自定义service和mapper
controller:
这里的userService是,不推荐Autowired注入。
构造函数:(这种写起来太复杂)
可以通过final定义常量以及加RequiredArgsConstructor注解来通过构造函数实现注入。
lombok注解可以生成构造函数,定义为常量后就必须在初始化的时候注入使用RequiredArgsConstructor只会注入常量的
service:
案例-IService的Lambda查询
原生Mybatis
controller:
service:这里参数中前面condition中填入SQL中if条件
最后的.list()可以改成.one(),.page(),.count(),来操作得到的不同的数据。
这里如果有多个线程的话可能会造成并发,可以加一个判断我的查询的余额是否和之前得到的余额相同,相同才扣钱。乐观锁
案例-IService批量新增
减少了网络请求,但是如果没设置为true,sql驱动还是一条一条语句插入
在数据库配置文件这里url后面加上设置参数为true,SQL驱动就会将很多条插入语句拼成下述语句
3.扩展功能
①代码生成
使用MybatisPlus一些基础步骤,实体类,mapper,service,serviceImpl继承类
代码生成就可以根据数据库中的表生成这些代码
步骤:
下载插件
下载好后点击Other中的Config Database将数据库信息填进去
第二步,点击这里设置生成代码的配置,点击generate就可以生成
②静态工具
需要传入Class字节码,除了save和update
涉及到多表查询可以,注入那个表对应的service,可能会发生循环依赖,这时候可以使用静态工具进行查询,注入mapper没mp,service强大
需求①,在userServiceImpl中涉及到它表查询可以使用使用DB静态工具,指定字节码即可
需求②
这里逻辑就是根据id查询到所有user然后,在地址表中查询到每个userId对应的地址(可能有多个)形成一个地址列表,然后使用stream流中的groupingBy方法根据userId分组形成map数据。最后再根据user的列表遍历封装uservo。
这里有两个stream流的使用:
1.将List列表中对象的某一个字段形成新的列表可以使用
List<Long> userTds = users.stream().map(User ::getId).collect(Collectors.toList());
2.就是对列表中的对象分组。
③逻辑删除
如果采用逻辑删除就要加上额外的逻辑判断
mp中配置一下表中代表逻辑删除的字段名叫什么?这里是flag
④枚举处理器
用枚举类型代表状态,但是表中仍然是Int类型,mybatis有个TypeHandler就可以实现类型转换
对枚举类进行注解EnumValue就代表转化的是哪一个字段,JsonValue加在什么字段上就代表返回的是什么类型的值枚举。
第二步进行配置
⑤JSON处理器
做两步,在字段上加上这个注解开启JSON类型转换器,在类上TableName中加上autoResultMap等于true
4.插件功能
①page分页插件
想要使用什么插件要在配置类中进行配置
pageNo是页码,pageSize是一页有多少数据
②通用分页实体
定义一个通用分页实体类
其他具体实体类继承这个通用类
定义分页查询通用返回类:
controller:
service:
封装page和封装结果与业务不太相关,可以用个工具类,这里是在类中定义
在pageQuery定义方法:
重载一个用creatTime排序的方法
在pageDTO中定义方法:
上述service:
如果说我拷贝的uservo中有字段名与user不一致,需要自己写copy就可以写个重载方法:
这里需要传入一个function函数
三、Docker
快速构建、运行、管理应用的工具,运维的工具
传统linx部署很麻烦,Docker可以一键部署
1.快速入门
docker这里的镜像就类似于绿色安装包,下载好后就可以使用,并且软件镜像之间相互隔离
安装应用后,会在本地下载镜像,运行镜像就会创造容器,一个镜像可以创造多个容器
容器间是相互隔离的,多实例部署,形成集群,没有干扰;一个服务也可以部署多个不同应用的实例
docker在部署的时候忽略了安装的过程,系统的差异,系统间的干扰,应用间的干扰
2.命令解读
docker的命令都以docker开始,docker run和-d一般绑定使用这样就可以不影响其他操作
设置端口映射这里:每一个容器都相当于一个微型的服务器有自己的ip和端口号不对外访问,我们只能访问到外部的虚拟机的ip,然后这里3306:3306就代表访问外部的端口3306就会访问内部这个服务器的3306端口。如果不同容器都要映射那要改变前面的外部的端口号
cd ~ 返回根目录
3.Docker基础
①常见命令
对容器的操作:docker start是对关闭的容器进行启动,docker run是创建并允许容器;docker ps是查看容器运行状况;docker rm是删除容器,docker rmi是删除镜像;docker logs是查看容器日志,docker exec是进入容器。
保存docker,不知道具体命令可以加--help
下载tar文件的镜像
查看log:一般加上-f可以追踪日志,ctrl+c退出
进入容器:bash加上就可以就可以进入类似计算机的base操作面板
可以进入容器再连接应用:(类似计算机里连接mysql)
删除容器:
由于查看容器进程显示东西太多,但是格式化代码太长:
首先:输入
vi ~/.bashrc
进入一个文件这里可以定义命令的别名:这里按 i 进入编辑模式,编辑完按Esc进入命令模式,然后按 :wq 保存并退出
:wq输入地方在esc后
最后激活:
②数据卷
容器只包含了镜像运行所需的命令或者依赖,直接进入容器进行修改行不通
数据卷可以让宿主机中的实体文件和容器中某一文件进行双向绑定,这样就可以在宿主机中对容器进行修改。
容器挂载数据卷:只能在创建的时候挂载
③本地目录挂载
匿名卷代表的是创建容器时自动创建的卷,例如MYSQL就必须挂载到一个卷中进行数据的增删操作
但是匿名卷的话,如果对MYSQL进行版本升级,创建新的MYSQL容器后就会使数据丢失,所以需要跟本地目录进行挂载
本地目录必须以”/“或”./“开头
首先在本地上创建所需目录
再运行docker run命令
④自定义镜像
分层可以共用基础层,把一些镜像公有的部分分层这样制作省略操作,下载也省略操作,也节省体积
有人已经做好了JDK的配置:
from代表了我们从什么基础上扩展
构建Java程序镜像
首先:上传jdk.tar文件,load该tar文件
其次上传自己的jar包以及dockerfile镜像描述文件,并进入目录输入构建镜像命令
⑤网络
springboot需要与mysql,redis等进行连接,虽然容器是独立的,但有一个相同的网关
容器间可以通过网桥进行连接,但是容器自己的ip会发生变化,如果容器关闭启动
由于创建的自定义网桥可以通过容器名互相访问
上述连接网络是容器创建后连接,可以创建时连接:-network
4.项目部署
DockerCompose
格式有点不一致
上传文件后就可以:
运行命令就可以一键部署