单体架构
将业务的所有功能集中在一个项目中开发,打包成一个部署
根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务
分布式架构需要考虑的问题
微服务
是一种经过良好架构设计的分布式架构方案
微服务特征
微服务结构
国内知名微服务技术:SpringCloud ,阿里巴巴的Dubbo
springcloud实现各种微服务组件,并实现了自动装配,开箱即用
springcloud与springboot版本一一对应
服务拆分注意事项
远程调用方式分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOPxK1wk-1662454500891)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662345002730.png)]
注册RestTemplate
调用方法,发送远程调用服务
微服务调用方式
提供者与消费者
服务消费者如何获取服务提供者的地址信息
如果有多个服务提供者,消费者该如何选择
服务消费者利用负载均衡算法(nginx),从服务列表中挑选一个
消费者如何得知服务提供者的健康状态
创建项目,引入依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQNtIGFW-1662454500892)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662346473502.png)]
编写启动类,添加@EnableEurekaServer注解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOvxkZZf-1662454500892)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662346700567.png)]
添加application.yml文件,编写配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JX8eaYz-1662454500893)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662346548174.png)]
在客户端中添加客户端依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lya9iUhm-1662454500893)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662346985149.png)]
在application.yml文件中,编写配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h1F5kwvy-1662454500893)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662347041077.png)]
服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡
访问的url路径中,服务名代替ip和端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQgMbBDT-1662454500894)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662348195331.png)]
在服务消费者的项目启动类中的RestTemplate中添加负载均衡注解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8887ebOX-1662454500894)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662348320004.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVjPQggA-1662454500894)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662348674216.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kttCdMYB-1662454500895)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662349270405.png)]
Ribbon的负载均衡规则是IRule接口定义的,每一个子接口都是一种规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P1oDX3La-1662454500895)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662349425604.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xTgipAkb-1662454500895)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662349454253.png)]
调整负载均衡策略的两种方式
代码方式,全局配置:在客户端的启动类中,定义一个新的IRule
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ySeFaOG-1662454500896)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662349582698.png)]
配置文件方式,局部配置:可指定服务名,针对某个服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-74bMXuL8-1662454500896)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662349843555.png)]
引入springcloudAlibaba的管理依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yD2ON4NH-1662454500896)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662351325616.png)]
添加nacos客户端依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtnYkKKy-1662454500897)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662351379840.png)]
配置nacos地址信息
一级服务、二级集群、三级实例
服务跨集群调用问题
服务集群属性
修改application.yml,添加相应配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpebLWdg-1662454500897)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662356689016.png)]
在nacos控制台可以看到集群变化
修改客户端的application.yml,设置集群名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6odIFuT-1662454500897)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662357206547.png)]
修改客户端的负载均衡Irule为NacosRule,这个规则会优先寻找与自己同集群的服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-772I3fr6-1662454500898)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662357311562.png)]
注意将该客户端的权重都设置为1
实际情况
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
在nacos控制台可以设置实例的权重值,一般为0-1之间
nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRKhwGrd-1662454500898)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662358315331.png)]
修改服务的命名空间
在配置文件中添加命名空间的id
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqElA0yH-1662454500898)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662358489132.png)]
不同namespace中的服务互相不可见
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbjsTChM-1662454500898)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662358844171.png)]
注册服务信息
定时拉取服务pull
主动推送变更消息push
服务列表缓存
远程调用
临时实例采用心跳检测
非临时实例nacos主动询问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lNIjjyn4-1662454500899)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662358954224.png)]
配置更改热更新
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmRhcCle-1662454500899)(F:\我的文档\笔记本\1662359591730.png)]
配置获取的步骤
引入nacos的配置管理客户端依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ecIWv43-1662454500899)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662360125025.png)]
在resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tT2z4Wyc-1662454500899)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662360240127.png)]
nacos 中的配置文件变更后,微服务无法重启就可以感知,不过需要通过配置来实现,有两种方式
方式一:在@Value注入的变量所在的类上添加注解@RefreshScope
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4ktIPno-1662454500899)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662360782935.png)]
方式二:使用@ConfigurationProperties注解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmWIl4Gu-1662454500900)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662361021174.png)]
注意
微服务启动时会从nacos中读取多个配置文件
多种配置文件优先级
服务名-profile.yaml>服务名称.yaml>本地配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sahmWFxC-1662454500900)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662362145605.png)]
搭建数据库,初始化数据库表结构
下载nacos安装包
配置nacos
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf,并添加集群的ip:端口号
如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kGeXcafh-1662454500900)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662362607441.png)]
修改application.properties文件,添加数据库配置
如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSdWy34O-1662454500900)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662362645452.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gicxKH3n-1662454500901)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662362693637.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ze9n88Mw-1662454500901)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662362724239.png)]
启动nacos集群
打开bin目录,双击startup.cmd
nginx反向代理
修改conf/nginx.conf文件
如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eEhr46Ri-1662454500901)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662362952892.png)]
双击.exe文件启动
引入依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WGJVJ6eR-1662454500901)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662363442056.png)]
在客户端的启动类中添加注解开启Feign的功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aMFDlIeN-1662454500902)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662363488100.png)]
编写Feign客户端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QxXw4Isg-1662454500902)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662363553851.png)]
主要是基于SpringMVC的注解来声明远程调用的信息,如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iP8rs5Oi-1662454500902)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662364131986.png)]
一般我们需要配置的是日志级别
自定义Feign的配置有两种方式
方式一:配置文件方式
全局生效
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NuRmFjHp-1662454500902)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662364244195.png)]
局部生效
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9rUmod6N-1662454500903)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662364267076.png)]
方式二:java代码方式,需要先声明一个Bean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Q4F4bMj-1662454500903)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662364313973.png)]
全局配置。把它放到@EnableFeginClient注解中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D59MsmtP-1662454500903)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662364377777.png)]
局部配置,把它放到@FeignClient注解中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1uw86Bs-1662454500903)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662364414890.png)]
Feingn底层的客户端实现
因此优化Feign的性能主要包括
连接池配置
引入HttpClient依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ysd88Y4L-1662454500903)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662365642799.png)]
配置连接池
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iGyitQcZ-1662454500904)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662365671105.png)]
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准 (不推荐,造成紧耦合)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GilzSaa-1662454500904)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662366234665.png)]
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给消费者使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0XGm93I-1662454500904)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662366526218.png)]
首先创建一个module。命名为feign-qpi,然后引入feign的starter依赖
将消费者中编写的生产者客户端,bean、默认Feign配置都赋值到feign-api项目中
在消费者中引入feign-api依赖
修改消费者中的与上述三个组件有关 的import部分,改成导入feign-api中的包
重启测试
当定义的FeignClient不再SpringbootApplication的扫描包范围内,这些FeignClient无法使用,有两种解决方案
方式一:指定FeignClient所在包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZHiNWW8c-1662454500904)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662367336806.png)]
指定|FeignClient字节码(推荐)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56h7Rk6e-1662454500905)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662367367357.png)]
身份认证和权限校验
服务路由,负载均衡
请求限流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnWOqQqy-1662454500905)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662367865004.png)]
创建新的module,引入依赖,之后创建启动类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1f859mcU-1662454500905)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662368171100.png)]
编写路由配置及nacos地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNzFAUIL-1662454500905)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662368541795.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuJ6AOn9-1662454500905)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662368779968.png)]
网关路由可以配置的内容包括
我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
spring提供的断言工厂
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YziXsIpK-1662454500906)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662369803730.png)]
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务的响应做处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SvF3abs-1662454500906)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662370112916.png)]
实现方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nR2TiRmA-1662454500906)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662370233572.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XFldI01M-1662454500906)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662370290676.png)]
如果要对所有路由都生效,则可以将过滤器工厂写到default
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54E5tCGv-1662454500907)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662370414637.png)]
全局过滤器作用也是处理一切进入网关的请求和微服务响应,如GatewayFilter作用一样
区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现
定义方式是实现GlobalFilter接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tV6BhuiT-1662454500907)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662370742822.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-043vbq15-1662454500907)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662371042308.png)]
请求进入网关会碰到三类过滤器:当前路由过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后一次执行每个过滤器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-db0TqnAu-1662454500907)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662371512354.png)]
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defalutFilter的order由Spring指定,默认是按照声明顺序从1递增
当过滤器的order值一样时,会按照defaultFilter>路由过滤器>GlobalFilter的顺序执行
跨域:域名不一致就是跨域,主要包括
跨域问题:浏览器进制请求的发起者与服务端发生跨域Ajax请求,请求被浏览器拦截的问题
解决方案:COPS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlmj1aAw-1662454500908)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662372009201.png)]
项目部署问题
大型项目组件较多,运行环境也较为复杂,部署时会遇到一些问题
Docker如何解决兼容性问题
总结
Docker是一个快速交付,运行应用的技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Kn6FNN4-1662454500908)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662376132485.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbI0zlXK-1662454500909)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662376147189.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dlzks63A-1662454500909)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662376162668.png)]
Docker是个CS架构的程序,由两部分组成
镜像名称一般分为两部分组成:[repository]:[tag]
在没有指定tag时,默认是latest,代表最新版本
常见命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLYVxTkJ-1662454500909)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662377840703.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEvmoBTo-1662454500909)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662379036316.png)]
不便于修改
当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便
数据不可复用
在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的
升级维护困难
数据在容器内,如果要升级容器必然删除容器,所有数据都跟着删除了
是一个虚拟目录,直线宿主机文件系统中的摸个目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBbyFNDO-1662454500910)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662382657601.png)]
数据卷操作的基本语法
docker volume [COMMAND]
方式一:基于数据卷
方式二:基于目录
语法类似基于数据卷,将宿主机目录直接挂载到容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0xdMply-1662454500910)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662385192170.png)]
比较
镜像结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnA88eln-1662454500910)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662385616525.png)]
镜像是分层结构,每一层称为一个Layer
自定义镜像
什么是DockerCompose
基于Compose文件帮助我们快速地部署分布式应用,而无需手动一个个创建和运行容器
Compose是一个文本文件,通过指令定义集群中每个容器如何运行
部署
常见镜像仓库
搭建镜像仓库
在私有镜像仓库推送或拉取镜像
重新tag(版本)本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
推送镜像
docker push 192.168.150.101:8080/nginx:1.0
拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0
总结
同步调用问题
优点:时效性强,可以立即得到结果
微服务间基于Feign的调用就属于同步方式,存在一些问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-enVsKK8f-1662454500910)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662431272981.png)]
异步调用方案
缺点
异步调用常见的就是事件驱动模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdNjMMDA-1662454500911)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662435580877.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85g5QrY5-1662454500911)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662435772339.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLqjKExo-1662454500911)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662435800209.png)]
概述:基于Erlang语言开发的开源消息通信中间件
安装
方式一:在线拉取
docker pull rabbitmq:3-management
方式二:本地加载
本地镜像上传至虚拟机后,使用命令加载镜像即可
docker load -i mq.tar
执行命令来运行MQ程序
结构和概念
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-najlxYnA-1662454500912)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662437495474.png)]
基本消息队列(BasicQueue)
只包括三个角色
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYQ5XTlT-1662454500912)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662442773085.png)]
工作消息队列(WorkQueue)
可以提高消息的处理速度,避免消息堆积
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qD9UmzxE-1662454500912)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662444909593.png)]
发布订阅(Public、Subscribe)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYwWazjg-1662454500912)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662445993804.png)]
根据交换机类型不同分为三种
AMQP:Advanced Message Queuing Protocol,是用于在应用程序或之间传递业务消息的开发标准。该协议与语言和平台无关,更符合微服务中独立性的要求
Spring AMQP:是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层默认实现
消息发送
在父工程中引入spring-amqp依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6mJsHv3-1662454500913)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662444038240.png)]
在publisher服务中利用RabbitTemplate发送消息到队列中
编写配置文件,添加RabbitMQ地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Io5RPRk-1662454500913)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662444099415.png)]
新建测试类,利用convertAndSent()发送消息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zKxaWpc-1662454500913)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662444307511.png)]
在consumer服务中绑定消息队列
编写配置信息,添加mq连接消息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qPcHEgc9-1662454500914)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662444434480.png)]
新建方法,编写消息方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvbtmR7W-1662454500914)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662444486671.png)]
消息一旦消费就会从队列中删除,RabbitMQ没有消息回溯功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvCea8v4-1662454500915)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662447402906.png)]
将接收到的消息根据规则路由到指定的Queue
实现
Direct交换机与Fanout交换机的差异
基于@RabbitListener注解声明队列和交换机有哪些常见注解
在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP对帮我们序列化为字节后发送
Spring的对象消息默认实现是基于ObjectOutputStream完成序列化的,如果要修改只需要定义一个MessageConverter类型的Bean即可,推荐使用JSON方式序列化
发送方和接收方必须使用相同的MessageConverter
步骤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gImAqOgn-1662454500915)(C:\Users\fanvil\AppData\Roaming\Typora\typora-user-images\1662449316576.png)]