1 介绍
Spring Cloud Bus 可配置Spring Cloud Config 使用可实现配置的动态刷新
Spring Cloud Bus 能管理和传播分布式系统间的消息, 就像一个分布式执行器,可用于广播状态更改,事件推送等,也可以当做微服务间的通信通道
注意,这里年张图片,就代表两种广播方式
图1: 它是Bus直接通知给其中一个客户端,由这个客户端开始蔓延,传播给其他所有客户端
图2: 它是通知给配置中心的服务端,有服务端广播给所有客户端
2 为什么被称为总线
1)什么是总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个公用的消息主题,并让系统中所有微服务实例连接起来,由于该主题中产生的消息会被所有实例监听和消费,所以称为消息总线,在总线上的各个实例,都可以方便的广播一些需要让其他连接在该主题的实例都知道的消息,
2)基本原理
ConfigClient 实例监听MQ中同一个topic(默认是SpringCloudBus)。当一个服务刷新数据时,它会把这个消息放到Topic中,这样其他监听同一个Topic的服务就能得到通知,然后去更新自身额配置
3 使用Spring Cloud Bus
结合config使用 https://editor.csdn.net/md/?articleId=123066812
3.1)搭建rabbitmq环境
3.2)创建configClient服务3355 3366
3.3)Bus广播的两种方式如上图
1)利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
2)利用消息总线触发一个服务端ConfigServer的/bus/refresh,而刷新所有客户端的配置
第二种方式比较合适,因为第一种打破了微服务的单一性(因为微服务本身就是业务模块,不应该具有刷新功能) ,破坏了微服务各节点的对等性(有一个客户端额外承担刷新职责,其他模块只有业务职责),有一定的局限性(微服务在迁移时,它的网络地址会发生变更,如果做到自动刷新,需要做更多的修改)
3.4)修改服务端配置3344
3.4.1)引入pom
org.springframework.cloud
spring-cloud-starter-bus-amqp
org.springframework.cloud
spring-cloud-config-server
org.springframework.boot
spring-boot-starter-actuator
3.4.2)修改 配置文件application.yml
server:
port: 3344
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
server:
git:
uri: https://gitee.com/lixiaogou/sprincloud-config.git #GitHub上面的git仓库名字
search-paths: #搜索目录
- springcloud-config
label: master #读取分支
#启动成功后访问的路径 http://ip:3344/{label}/{application}-{profile}.yml 能访问的配置文件 就表示成功了
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
##rabbitmq相关配置,暴露bus刷新配置的端点 SpringCloud Bus动态刷新全局广播
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
#rabbitmq相关配置 15672 是web管理界面端口,5672是MQ访问端口
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3.5)修改客户端配置3355,3366
3.5.1)引入pom
org.springframework.cloud
spring-cloud-starter-bus-amqp
3.5.2)修改配置文件
server:
port: 3355
spring:
application:
name: config-client
cloud:
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述三个综合http://localhost:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心的地址
#服务注册到eureka地址
eureka:
client:
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://localhost:7001/eureka #单机版
##rabbitmq相关配置,暴露bus刷新配置的端点
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3.6) 测试
修改配置文件之后,执行
curl -X POST "http://localhost:3344/actuator/bus-refresh"
这样3355 ,3366等获取实时数据
如果只想3355 实时获取数据(config-client 是微服务名称)
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"



