Spring Cloud Bus 简介

Spring Cloud Bus 通过轻量级的消息代理连接各个微服务,可以用来广播配置文件的更改,或者管理服务监控。

在实际生产开发环境下,Spring Cloud Bus 主要用来做微服务的监控,或者微服务应用程序之间的通信。

Bus 配合 Spring Cloud Config 使用可以实现配置的动态刷新。目前 Spring Cloud Bus 支持两种消息代理:RabbitMQ 和 Kafka

下面以 RabbitMQ 为例来演示下使用Spring Cloud Bus 动态刷新配置的功能。


RabbitMQ 安装

首先在 Docker 中安装 RabbitMQ,执行下列命令:

1
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management

查看容器是否成功安装:

1
docker ps

启动 RabbitMQ 容器:

1
docker start rabbitmq

访问是否运行,打开浏览器,输入下列地址:

1
http://localhost:15672

输入用户名和密码,默认用户名和密码都是 guest


RabbitMQ 结合 spring cloud bus 配置文件全部刷新

  • 当我们的配置文件发生变化的时候,我们就可以指向 config-server 发送一个更新请求(以前是挨个给 config-client 发送更新请求)
  • 然后 config-server 把消息发给 spring cloud bus
  • spring cloud bus 收到请求之后,再去发送到 RabbitMQ 上
  • RabbitMQ 就会通知到 config-client
  • 让所有 client 都收到刷新请求,来实现配置文件的动态刷新。
  1. 首先给 config-server 和 config-client 分别添加上 Spring Cloud Bus 依赖
  2. 由于现在统一由 config-server 提供刷新接口,所以也需要添加上 actuator 依赖
  3. 在 config-server、config-client 配置 rabbitmq 属性,地址、端口号、用户名、密码,使它们都连接到 RabbitMQ 上。
  4. 由于给 config-server 中的所有接口都添加了保护,所以刷新接口将无法直接访问,需要先登陆,所以需要配置一下 security 的登陆用户名、密码。
  5. 同时可以通过在 config-server 中的 SecurityConfig 修改 Security 配置,对端点的权限做出修改,在 SecurityConfig 配置中,开启了 HttpBasic 登陆,这样,在发送刷新请求时,就可以直接通过 HttpBasic 配置携带认证信息。
  6. 注意,需要在 config-server 的配置文件中暴露 bus-refresh 端点。
  7. 启动 Eureka、config-server、config-client 服务。
  8. 然后修改配置信息提交到 Github 上后,需要访问 config-server 中的 POST 请求:http://localhost:8081/actuator/bus-refresh ,因为使用了 security,开启了 HttpBasic 认证,所以需要在 Authorization 的类型中选择 Basic Auth,输入 security 的登陆名密码才可以访问刷新接口。
  9. 重新刷新 config-client 接口,查看是否有变化。
  10. 这个 post 请求是针对 config-server 的,config-server 会把这个刷新的指令传给 rabbitmq,然后 rabbitmq 再把指令传给各个 client。

RabbitMQ 结合 spring cloud bus 配置文件逐个刷新

如果更新了配置文件之后,不希望每一个微服务都去刷新配置文件,那么就可以通过配置来解决问题。

  1. 首先,我们在每一个 config-client 的配置文件都添加一个 instance-id,每一个 instance-id 由 应用名称+端口号 组成。
  2. 我们可以将 config-client 打包后(跳过测试),通过命令同时启动多个实例,作为测试只刷新某一个微服务。
  3. 使用 8091 端口作为测试逐个请求。
  4. 然后修改配置信息提交到 Github 上后,需要访问 config-server 中的 POST 请求:http://localhost:8081/actuator/bus-refresh/client1:8091
  5. bus-refresh 后面的参数就表示只让 8091 端口的微服务进行更新配置文件。