1、概述
需要原因:
用SpringCloud Config时,我们可以实现配置信息手动的动态刷新,也就是远端配置信息发生改变后,需要告诉服务端配置信息发生变化后,服务端才会更新配置信息,而现在我们想要实现分布式自动刷新配置信息功能,这就需要我们使用SpringCloud Bus消息总线配合SpringCloud Config实现配置信息的动态刷新。
介绍:
SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统连接起来的框架,整合了Java的事件处理机制和消息中间件的功能,SpringCloud Bus目前支持两种消息代理:RabbitMQ和Kafka。SpringCloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等, 也可以当做微服务间的通信通道。
什么是总线?
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
SpringCloud Config客户端的实例都监听消息队列中的同一个主题(topic)(默认是SpringCloud Bus),当一个服务器刷新数据的时候,它会把这个信息放入到主题中,这样其他监听了同一主题的服务就能得到通知,然后去更新自身的配置。
2、项目配置
配置服务中心服务端
- 添加如下依赖:
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- yaml文件配置
# RabbitMQ相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 暴露总线刷新配置的端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
配置服务中心客户端
- 新建端口号分别为3355和3366的模块
- 添加如下依赖:
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- yaml配置文件
# RabbitMQ相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3、测试
- 先后Eureka服务注册中心7002、ConfigServer配置中心服务端3344、ConfigClient配置中心客户端3355/3366
- 修改gtiee仓库的配置文件
动态刷新全局广播
-
对服务配置中心发送POST请求:
格式为:
curl -X POST "{配置中心的地址}/actuator/bus-refresh"
其中我们的配置中心地址为 localhost:3344,则为:
curl -X POST "http://localhost:3344/actuator/bus-refresh"
- 此时所有服务的配置信息都得到了更新,打开RabbitMQ的控制面板,我们可以发现有一个交换机,这是对应消息总线发送消息的交换机:
动态刷新定点广播
在全局广播中,我们更新配置文件的信息对所有服务都进行了通知,但是假设我们只想通知3355,而不想通知3366又该怎么办呢,这就需要我们用定点通知的方法通知3355,也就是说我们进行消息通知时只指定具体某个实例生效而不是全部生效,这种情况下就需要修改我们发送的POST请求:
curl -X POST "http://{配置中心的地址}/actuator/bus-refresh/{destination}"
这样的话,/bus/refresh请求就不再发送到具体的服务实例上,而是发给ConfigServer配置中心并通过destination参数指定需要更新配置的服务或实例。其中destination具体为微服务+端口号。
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
此时我们可以看到3355微服务刷新了,而3366微服务没有刷新,达到了定点广播的功能