Spring Cloud Config与Spring Cloud Bus整合实现配置自动刷新
在实际开发中,如果我们更改了Config Server的配置,那我们需要重启项目,手动去刷新。如果所有微服务节点的配置都需要手动去刷新,那么工作量会随之加重。不仅如此,随着系统的不断扩张,会越来越难以维护。实现配置的自动刷新是很重要的一件事情,为了解决这个问题,Spring团队推出了Spring Cloud Bus。
Spring Cloud Bus是使用轻量级的消息代理连接分布式系统的节点,它可以广播传播状态的更改或者其他的管理指令。我们可以将Spring Cloud Bus想象成一个分布式的Spring Boot Actuator。加入Spring Cloud Bus后的Config架构如图1所示。
图1 加入Spring Cloud Bus的架构图
在图1中,微服务A的所有实例都通过Spring Cloud Bus消息总线连接到了一起,每个实例都会从Config Server订阅配置更新事件并获取配置信息。当其中一个微服务节点的/ous/refresh端点被请求时,该实例就会向Spring Cloud Bus消息总线发送一个配置更新事件,其他实例通过Spring Cloud Bus消息总线获得该事件后也会从Config Server获取最新的配置信息并更新配置。
接下来,我们通过一个案例演示如何整合Spring Cloud Config与Spring Cloud Bus实现自动刷新,具体步骤如下:
(1)这里我们使用RabbitMQ作为消息代理,实现配置的动态更新。RabbitMQ的具体安装步骤可以参考《Spring Boot企业级开发教程》的8.3小节,本书我们不做讲解。在确保RabbitMQ下载并成功运行的情况下,我们开始搭建项目。
(2)这里以用7.2.2小节的Config Server和Config Client与Spring Cloud Bus整合实现配置自动刷新。改造Config Server与Config Client,在各自的pom.xml配置文件中添加spring-cloud-starter-bus-amqp依赖实现配置自动更新与spring-boot-starter-actuator依赖监控系统健康情况的工具。代码如下所示。
<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>
(3)改造Config Server和Config Client的配置文件,在配置文件中设置rabbitmq属性的相关配置,包括主机地址、端口号、用户名和密码,如下所示。
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
(4)在Config Server和Config Client的配置文件中分别添加暴露触发消息总线的地址配置。代码如下所示。
management: # 暴露触发消息总线的地址
endpoints:
web:
exposure:
include: "bus-refresh"
(5)改造Config Client,在需要动态刷新配置的类ConfigClientApplication上加上注解@RefreshScope。如例1所示。
例1 config-client\src\main\java\com\itheima\configclient\ConfigClientApplication.java
1 @SpringBootApplication
2 @RestController
3 @RefreshScope
4 public class ConfigClientApplication {
5 public static void main(String[] args) {
6 SpringApplication.run(ConfigClientApplication.class, args);
7 }
8 @Value("${foo}")
9 String foo;
10 @RequestMapping(value = "/foo")
11 public String hi(){
12 return foo;
13 }
14 }
到此,我们的RabbitMQ与Spring Cloud Bus整合使用实现自动刷新的所有准备工作已经完成。
(6)依次启动config-server、config-client项目。启动成功后,使用浏览器访问
http://localhost:8762/foo
,页面效果如图7-2所示。
(7)修改config-server的Git远程仓库的配置文件config-client-dev.yml。修改完成后,打开cmd输入下列命令:
curl -X POST http://localhost:8769/actuator/bus-refresh
此时config-client就会向Spring Cloud Bus发送一个配置更新事件并更新配置。
(8)再次访问http://localhost:8762/foo
,发现页面显示的效果是修改后的配置内容,效果如图2所示。
图2 配置刷新后config-client访问效果图