一、Spring Cloud Bus简介
Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令。
我们通常会使用消息代理来构建一个主题,然后把微服务架构中的所有服务都连接到这个主题上去,当我们向该主题发送消息时,所有订阅该主题的服务都会收到消息并进行消费。使用 Spring Cloud Bus 可以方便地构建起这套机制,所以 Spring Cloud Bus 又被称为消息总线。Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。目前 Spring Cloud Bus 支持两种消息代理:RabbitMQ 和 Kafka,下面以 RabbitMQ 为例来演示下使用Spring Cloud Bus 动态刷新配置的功能。
二、准备工作
需要安装RabbitMQ,使用 Spring Cloud Bus 动态刷新配置需要配合 Spring Cloud Config 一起使用,我们使用前面创建的的config-server、config-server、config-client模块来演示下该功能。
三、消息总线服务端
在config-server中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改config-server配置:
server:
port: 8701
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/quanzaiyu/springcloud-config.git
username: quanzaiyu
password: qzy007007
clone-on-start: true # 开启启动时直接从git获取配置
rabbitmq: #rabbitmq相关配置
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh'
添加了spring.rabbitmq
节点和management
节点,暴露bus-refresh端点用于总线刷新
四、消息总线客户端
在config-client中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
创建两个配置,bootstrap-amqp1.yml
和bootstrap-amqp2.yml
,分别绑定到8801和8802端口
server:
port: 8801
spring:
application:
name: config-client
cloud:
config:
label: dev
name: config
profile: dev
discovery: #注意这里,配置了discovery就不需要配置uri了
enabled: true
service-id: config-server
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
management:
endpoints:
web:
exposure:
include: 'refresh'
这里配置了spring.cloud.config.discovery
,就不需要将uri写到配置文件中,直接从注册中心获取配置中心地址即可
先启动eureka-server、config-server服务,再以bootstrap-amqp1.yml
和bootstrap-amqp2.yml
两个配置分别启动两个config-client服务
五、动态刷新配置
我们先修改Git仓库中dev分支下的config-dev.yml
配置文件:
# 修改前信息
config:
info: "config info for dev(dev)"
# 修改后信息
config:
info: "update config info for dev(dev)"
通过POST方式调用http://localhost:8701/actuator/bus-refresh
进行总线刷新
再调用:http://localhost:8801/configInfo
和http://localhost:8802/configInfo
,可以看到配置已经刷新了
如果只需要刷新指定实例的配置可以使用以下格式进行刷新:http://localhost:8904/actuator/bus-refresh/{destination}
,比如我们需要刷新运行在8801端口上的config-client实例:http://localhost:8904/actuator/bus-refresh/config-client:8801
。
六、配合WebHooks使用
WebHooks相当于是一个钩子函数,我们可以配置当向Git仓库push代码时触发这个钩子函数。