Spring Cloud Bus
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 都收到刷新请求,来实现配置文件的动态刷新。
- 首先给 config-server 和 config-client 分别添加上 Spring Cloud Bus 依赖
- 由于现在统一由 config-server 提供刷新接口,所以也需要添加上 actuator 依赖
- 在 config-server、config-client 配置 rabbitmq 属性,地址、端口号、用户名、密码,使它们都连接到 RabbitMQ 上。
- 由于给 config-server 中的所有接口都添加了保护,所以刷新接口将无法直接访问,需要先登陆,所以需要配置一下 security 的登陆用户名、密码。
- 同时可以通过在 config-server 中的 SecurityConfig 修改 Security 配置,对端点的权限做出修改,在 SecurityConfig 配置中,开启了 HttpBasic 登陆,这样,在发送刷新请求时,就可以直接通过 HttpBasic 配置携带认证信息。
- 注意,需要在 config-server 的配置文件中暴露 bus-refresh 端点。
- 启动 Eureka、config-server、config-client 服务。
- 然后修改配置信息提交到 Github 上后,需要访问 config-server 中的 POST 请求:http://localhost:8081/actuator/bus-refresh ,因为使用了 security,开启了 HttpBasic 认证,所以需要在 Authorization 的类型中选择 Basic Auth,输入 security 的登陆名密码才可以访问刷新接口。
- 重新刷新 config-client 接口,查看是否有变化。
- 这个 post 请求是针对 config-server 的,config-server 会把这个刷新的指令传给 rabbitmq,然后 rabbitmq 再把指令传给各个 client。
RabbitMQ 结合 spring cloud bus 配置文件逐个刷新
如果更新了配置文件之后,不希望每一个微服务都去刷新配置文件,那么就可以通过配置来解决问题。
- 首先,我们在每一个 config-client 的配置文件都添加一个 instance-id,每一个 instance-id 由
应用名称+端口号
组成。 - 我们可以将 config-client 打包后(跳过测试),通过命令同时启动多个实例,作为测试只刷新某一个微服务。
- 使用 8091 端口作为测试逐个请求。
- 然后修改配置信息提交到 Github 上后,需要访问 config-server 中的 POST 请求:http://localhost:8081/actuator/bus-refresh/client1:8091
- bus-refresh 后面的参数就表示只让 8091 端口的微服务进行更新配置文件。