spring cloud bus 消息总线
spring cloud 学习完整代码:https://github.com/Zzwenm/spring-cloud-config
对于spring cloud config 而言,避免了每次更新配置都要重启客户端微服务。
但是当每个整个系统的微服务变多时,每个微服务都要执行一次post请求,这样的手动刷新很是繁琐。
这里希望可以进行广播,达到一次通知,所有的微服务都生效,并且该更新的微服务进行更新,不需要更新的微服务不进行更新,实现差异化的管理。
可以通过对spring cloud config加强达到广播形的自动版的动态刷新,
使用spring cloud bus 配合 spring cloud config 实现配置的动态刷新。
官网:https://cloud.spring.io/spring-cloud-bus/1.3.x/single/spring-cloud-bus.html
spring cloud bus 是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。
bus目前支持两种消息代理:RabbitMQ 、 Kafka。
一、什么是总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。
二、基本原理
ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。
结构图
三、RabbitMQ环境配置
参考 https://blog.csdn.net/zhm3023/article/details/82217222
- 1、安装Erlang
下载地址http://erlang.org/download/ - 2、安装RabbitMQ
https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-windows-3.7.7.zip
四、Spring Cloud Bus动态刷新全局广播
利用消息总线触发服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置。
4.1、ConfigServer配置中心添加消息总线支持。
4.1.1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
4.1.2、修改配置
添加mq的相关配置
#rabbitmq相关配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#rabbitmq相关配置
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
4.2、客户端添加总线支持
4.2.1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
4.2.2、添加配置文件
#rabbitmq相关配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
4.2.3、Controller修改:
头部添加@RefreshScope
使其具备刷新功能
4.3、启动
依次启动eureka-server、config-server、eureka-client、eureka-consumer
4.4、测试
要确保每个客户端能否正常的通过ConfigServer获取到配置文件
4.4.1、运维工程师修改Github上配置文件增加版本号
github version
4.4.2、发送POST请求
发送请求无需向客户端发送请求,只需要向服务端发送一处请求即可。
cmd命令行操作,发送到config-server处
curl -X POST "http://localhost:3344/actuator/bus-refresh"
curl
4.4.3、再次访问ConfigServer查看结果
config-server:
eureka-client:
eureka-consumer:
客户端的配置也都已经更新了,达到了一次发送,处处生效。
五、定点刷新
当我们只想刷新某个需要更新的配置时可以使用定点数新。
例如:
只想更新eureka-client,不想更新eureka-consumer。
公式:
http://localhost:{配置中心端口号}/actuator/bus-refresh/{destination}
只更新eureka-client:
curl -X POST "http://localhost:3344/actuator/bus-refresh/eureka-client:8762"
eureka-client 为配置文件中设定的spring.application.name
8762 为端口号
spring cloud 学习完整代码:https://github.com/Zzwenm/spring-cloud-config