Spring Cloud Bus

2/19/2021 SpringCloud

Spring Cloud Bus (消息总线)通过轻量消息代理连接各个分布的节点,用于广播 状态变更(如配置文件变更)或者其他的消息指令,可以将其理解为管理和传播消息所有分布式服务中的详细即可。Spring Cloud Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。目前 Spring Cloud Bus 支持两种消息代理:RabbitMQKafkaAMQP((Advanced Message Queuing Protocol),一个提供统一消息服务的应用层标准高级消息队列协议

# 为什么需要统一配置管理

  • 多服务,多环境配置集中管理,结构目录清晰,方便快速查找
  • 运行期间动态调整配置
  • 广播状态变更(配置变更),不要每个微服务都去刷新依次,只需要刷新依次,及所有微服务都可以接收到广播信息进行更新

# Windows RabbitMQ 安装

启动控制管理台,进入RabbitMQ安装目录下的sbin子目录,输入以下启动管理功能:

rabbitmq-plugins enable rabbitmq_management
1

因为网络原因,没有安装成功Erlang,直接在虚拟机中用docker启动的RabbitMQ

本地启动访问地址:http://localhost:15672/,我是用的虚拟机的ip

默认用户名、密码为guest

# 动态刷新配置 (opens new window)

  • 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>
1
2
3
4
5
6
7
8
  • 添加application-yml配置,添加RabbitMQ配置及暴露了刷新配置的Actuator端点
server:
  port: 8904
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          # 自己的git配置仓库,可以根据作者的fork一份,便于验证修改
          uri: https://gitee.com/myMagicRain/springcloud-config.git 
          username: macro # 自己git的用户名和密码
          password: 123456
          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'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • 启动config-client 9004 9005config-server 8094
  • 登陆RabbitMQ,默认用户名和密码是guest,点击ExchangesQueues可以发现Spring Cloud Bus 创建了一个叫springCloudBus的交换机及三个以 springCloudBus.anonymous开头的队列:

修改git仓库中配置dev分支的配置文件,因为config-client配置的是加载dev的配置,先调用,然后刷新配置中心配置,然后再次调用,可以观察到配置变更成功了

  • 调用注册中心的接口刷新所有配置,发送POST请求:http://localhost:8904/actuator/bus-refresh

如果只刷新部分客户端,例如刷新9004的客户端,可以发送POST请求:http://localhost:8904/actuator/bus-refresh/config-client:9004

# 配合WebHooks使用 (opens new window)

webHooks相当于是一个钩子函数,我们可以配置当向Git仓库push代码时触发这个钩子函数,不然每次更新配置都需要自己手动发送POST请求刷新一次,根据自己环境来谨慎使用,配置一般也不是需要一次性全部刷新

这里以Gitee为例来介绍下其使用方式,这里当我们向配置仓库push代码时就会自动刷新服务配置了

来自Spring官网