1. 消息总线简介
消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。
消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。
什么是 Spring Cloud Bus
Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。
Spring Cloud Bus 将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
什么时候使用 Spring Cloud Bus
微服务一般都采用集群方式部署,而且在高并发下经常需要对服务进行扩容、缩容、上线、下线的操作。比如我们需要更新配置,又或者需要同时失效所有服务器上的某个缓存,需要向所有相关的服务器发送命令,此时就可以选择使用 Spring Cloud Bus 了。
总的来说,就是在我们需要把一个操作散发到所有后端相关服务器的时候,就可以选择使用 Spring Cloud Bus 了。
2. rabbitMQ环境配置
1. 安装ErIong
下载Windows安装包,并双击安装
https://www.erlang.org/downloads
安装完成后配置环境变量
使用cmd命令,输入 erl -version 验证:
2. 安装rabbitMQ
在RabbitMQ的gitHub项目中,下载window版本的服务端安装包。
https://www.rabbitmq.com/install-windows.html#installer
接着到双击安装,一直点下一步安装即可,安装完成后,找到安装目录:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.10.6\sbin
在此目录下打开cmd命令,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件:
然后双击rabbitmq-server.bat启动脚本,然后打开服务管理可以看到RabbitMQ正在运行:
这时,打开浏览器输入http://localhost:15672,账号密码默认是:guest/guest
到这一步,安装就大功告成了!
3. Bus动态刷新全局广播的设计思想和选型
演示广播效果,增加复杂度,再以3355为模板再制作一个3366微服务模块
- 新建cloud-config-client-3366
- 添加pom依赖
- 修改bootstrap.yaml
- 创建主启动类
- 编写业务类,简单起见只使用controller
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${server.port}")
private String serverPort;
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String configInfo(){
return "serverPort: "+serverPort+"\t\n\n configInfo: "+configInfo;
}
}
bus消息总线实现的两种设计思想
-
利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
-
利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
图二的架构显然更加适合,图—不适合的原因如下:
-
打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
-
破坏了微服务各节点的对等性。
-
有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。
4. Bus动态刷新全局广播配置实现
1. 给配置中心服务端(cloud-config-center-3344)添加消息总线支持
1. 引入消息总线rabbitMQ支持
<!--添加消息总线RabbitNQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2. 在yaml配置文件中添加rabbitMQ相关配置
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#rabbitmq相关配置,暴露bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: "bus-refresh"
2. 给配置中心客户端(cloud-config-client-3355/3366)添加消息总线支持
1. 引入消息总线rabbitMQ支持
<!--添加消息总线RabbitNQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2. 在yaml配置文件中添加rabbitMQ相关配置
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3. 测试配置修改及更新
- 启动7001(注册中心)、3344(配置中心-服务端)、3355(配置中心-客户端)、3366(配置中心-客户端)
- 修改配置文件信息,并发送POST刷新请求
curl -X POST "http://localhost:3344/actuator/bus-refresh"
- 获取信息,查看是否生效
- 配置中心:http://config-3344.com:3344/config-dev.yml
- 客户端:http://localhost:3355/configlnfo、http://localhost:3366/configInfo
广播通知,—次修改,处处生效
5. 动态刷新定点通知
不想全部通知,只想定点通知:只通知3355,不通知3366,指定具体某一个实例生效而不是全部。
公式:http://localhost:port/actuator/bus-refresh/{destination}
localhost:配置中心-服务端的IP地址或域名
port:配置中心-服务端的端口号
destination:需要通知的目标服务(配置中心-客户端)${服务名-端口号}
例:curl -X POST http://localhost:3344/actuator/bus-refresh/{config-client:3355}" ,这样就只会通知3355客户端刷新配置。