SpringCloud——消息总线Bus
消息总线
- 在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线
- SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。
动态刷新config
两种设计思想
-
利用消息总线触发一个客户端bus/refresh,而刷新所有客户端的配置
-
利用消息总线触发一个服务端ConfigServer的/bus/refresh刷新,而刷新所有客户端的配置
-
第二种的架构显然更加适合,第一种不适合的原因有:
- 打破了微服务的职责单一性,因为微服务本身是业务模块,他本不应该承担配置刷新的职责。
- 破坏了微服务各个节点的对等性。
- 有一定的局限性,微服务在迁移时,它的网络常常会发生变化,此时如果想要做到自动刷新,那就回增加更多的配置。
实例
-
再建立一个model(上一篇已经建立了一个客户端和配置中心)
-
改pom
-
改yml
server: port: 3366 spring: application: name: config-client cloud: # config客户端配置 config: # 分支名称 label: master # 配置文件名称 name: config # 读取后缀名称 profile: dev # 配置中心地址 uri: http://localhost:3344 #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口 rabbitmq: host: xxxxxxx port: 5672 username: guest password: guest eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ # 暴露监控端点 management: endpoints: web: exposure: include: "*"
修改配置中心的yml,添加如下配置
#rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
rabbitmq:
host: xxxxxxxx
port: 5672
username: guest
password: guest
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
##rabbitmq相关配置,暴露bus刷新配置的端点<--------------------------
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
另一个客户端配置与3366相同
启动测试
-
修改gitee的文件后进行刷新
-
curl -X POST "http://localhost:3344/actuator/bus-refresh
-
发现所以配置都进行动态刷新了