一、Spring Cloud Config 动态刷新配置
spring-boot-starter-actuator模块包含了/refresh 刷新API。通过此API可以刷新获取到GIT里最新的配置。
在config-client的pom文件中添加actuator依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改GIT里的配置,然后在客户端调用/refresh API, 比如localhost:8080/refresh。 可以发现获取到最新的GIT配置。
二、RabbitMQ 消息总线
我们已经可以通过/refresh和git的web Hook来实现配置的手动刷新,消息代理中间件可以将消息路由到一个或多个目的地。
于是我们可以通过Spring Cloud Bus总线来将连接到总线的所有队列都能够实时的接收到GIT仓库中的应用配置。
三、 RabbitMQ 实现
我们可以在RabbitMQ的客户端添加一个spring-cloud-bus-amqp 模块,需要注意的是,在此之前有添加过spring-boot-starter-actuator模块是必须的。
1.在Config-client客户端添加Spring Cloud Bus依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
2. 添加RabbitMQ配置:
spring.rabbitmq.port = 5672
spring.rabbitmq.username = admin
spring.rabbitmq.password = Aegon_2018
spring.rabbitmq.virtual-host = /fec-uat
spring.rabbitmq.host = rabbitmq-fec.dev
3. 步骤:
1) 先访问我们之前2个应用定义的/from请求,会返回当前的仓库的from 配置。
2) 然后修改GIT配置,from=测试, 可以自定义内容。
3) 然后发送一个POST请求到其中一个客户端的/bus/refresh上。
4) 重新访问另外一个客户端,查看配置是否被修改。
Spring Cloud Bus 的/bus/refresh 接口, 出发了总线上其他服务实例的/refresh。
4. 指定刷新范围
/bus/refresh 请求提供了destination参数,用来定位具体要刷新的应用程序。 destination 对应的值为rabbitmq中的不同Exchange。通过指定一个exchange,可以把一个exchange视为一个环境,来指定刷新该路由下绑定的所有队列。
比如添加一个exchange属性配置:
spring.rabbitmq.publisher-confirms = true
spring.cloud.stream.default-binder = rabbit
spring.cloud.stream.bindings.springCloudBusInput.destination = springCloudBus.fec-uat
spring.cloud.stream.bindings.springCloudBusInput.group = fec-uat-${spring.application.name}
spring.cloud.stream.bindings.springCloudBusOutput.destination = springCloudBus.fec-uat
spring.cloud.stream.bus.enabled = true
spring.cloud.stream.bus.trace.enabled = true
四、 架构优化
前面可以通过config-client客户端连接config-server的形式从config-server那儿拿到对应的配置,服务实例与config-server都是注册到eureka上的,因此可以在config-server模块中添加 spring-cloud-starter-bus-amqp模块,由config-server来担任从GIT中拉取配置和实时更新配置的职责。只要config-server的/bus/refresh触发了 ,那么指定destination的实例将会获取到最新的配置。
改动如下:
1. 在Config Server中也引⼊Spring Cloud Bus依赖,将配置服务端也加⼊到消息总线中来。
2. /bus/refresh 请求不在发送到具体服务实例上,⽽是发送给Config Server,并通 过 destination参数来指定需要更新配置的服务或实例。