一、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中添加依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>

修改config-server配置:

  1. server:
  2. port: 8701
  3. spring:
  4. application:
  5. name: config-server
  6. cloud:
  7. config:
  8. server:
  9. git:
  10. uri: https://gitee.com/quanzaiyu/springcloud-config.git
  11. username: quanzaiyu
  12. password: qzy007007
  13. clone-on-start: true # 开启启动时直接从git获取配置
  14. rabbitmq: #rabbitmq相关配置
  15. host: localhost
  16. port: 5672
  17. username: guest
  18. password: guest
  19. eureka:
  20. client:
  21. service-url:
  22. defaultZone: http://localhost:8001/eureka/
  23. management:
  24. endpoints: #暴露bus刷新配置的端点
  25. web:
  26. exposure:
  27. 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.ymlbootstrap-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.ymlbootstrap-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/configInfohttp://localhost:8802/configInfo,可以看到配置已经刷新了
030.png

如果只需要刷新指定实例的配置可以使用以下格式进行刷新:http://localhost:8904/actuator/bus-refresh/{destination},比如我们需要刷新运行在8801端口上的config-client实例:http://localhost:8904/actuator/bus-refresh/config-client:8801

六、配合WebHooks使用

WebHooks相当于是一个钩子函数,我们可以配置当向Git仓库push代码时触发这个钩子函数。

参考资料