1.1 简介
1.1.1 概述
Spring Cloud Bus 是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。也就是消息总线可以为微服务做监控,也可以实现应用程序之间相互通信。Spring Cloud Bus 是 Spring Cloud 的一个子项目,它基于 AMQP 协议(高级消息队列协议,用于消息的生产和消费),我们可以使用 RabbitMQ 或 Kafka 来实现一个基本的基于 AMQP 协议的应用,来支持消息中间件的接入。我们可以借此来实现 Spring Cloud Config 自动刷新的策略,只需要架设好消息中间件,编写好属性服务端和远端仓库之间的连接,即可实现自动刷新(其实是半自动)。
1.1.2 相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
1.2 简单使用
1.2.1 环境准备
我们这里使用 rabbitmq,所以需要安装 erlang 以及 rabbitmq
1.2.2 Config 服务端配置
# 增加如下配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
# 暴露刷新端点
management:
endpoints:
web:
exposure:
include: bus-refresh
1.2.3 Config 客户端配置
需要注意的是在客户端除了需要增加以下配置连接 mq 以外,还需要在 controller 添加 @RefreshScope
注解
# 增加如下配置
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
1.2.4 测试
我们修改完 git 上的配置文件之后,发现从服务端获取的配置更新了但是从客户端获取的配置依旧没有更新,这是因为需要我们给 config server 发送 post 请求让他去通知客户端刷新配置。这也是为什么称他是半自动的原因。
我们用 post 让 config server 去通知客户端刷新配置,其流程是访问的 actuator/bus-refresh
节点,来实现刷新本服务的同时,将刷新动作推送至消息中间件,通知其它连接了消息中间件的客户端进行自动刷新操作。请求刷新之后可以看到控制台刷新了配置,请求客户端配置信息也更新了。需要注意的是如果 config 使用了 security 那么 config server 就需要关闭 csrf,否则执行刷新操作时会返回 403
我们可以在 rabbit 的控制台发现一个 springCloudBus 的 topic,就是通过它来实现的刷新操作