消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。
消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。
什么是 Spring Cloud Bus

Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。
Spring Cloud Bus 将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。
什么时候使用 Spring Cloud Bus
微服务一般都采用集群方式部署,而且在高并发下经常需要对服务进行扩容、缩容、上线、下线的操作。比如我们需要更新配置,又或者需要同时失效所有服务器上的某个缓存,需要向所有相关的服务器发送命令,此时就可以选择使用 Spring Cloud Bus 了。
总的来说,就是在我们需要把一个操作散发到所有后端相关服务器的时候,就可以选择使用 Spring Cloud Bus 了。
下载Windows安装包,并双击安装
https://www.erlang.org/downloads

安装完成后配置环境变量


使用cmd命令,输入 erl -version 验证:

在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

到这一步,安装就大功告成了!

演示广播效果,增加复杂度,再以3355为模板再制作一个3366微服务模块
@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/refresh,而刷新所有客户端的配置

利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置

图二的架构显然更加适合,图—不适合的原因如下:
打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
破坏了微服务各节点的对等性。
有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。
1. 引入消息总线rabbitMQ支持
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
2. 在yaml配置文件中添加rabbitMQ相关配置
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#rabbitmq相关配置,暴露bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: "bus-refresh"
1. 引入消息总线rabbitMQ支持
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
2. 在yaml配置文件中添加rabbitMQ相关配置
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
curl -X POST "http://localhost:3344/actuator/bus-refresh"
广播通知,—次修改,处处生效
不想全部通知,只想定点通知:只通知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客户端刷新配置。
