学科分类
目录
Spring Cloud

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访问效果图

点击此处
隐藏目录