【Spring Cloud】刷新config配置文件信息的实现

【学习背景】

    在前面一篇博客中,搭建了配置中心的demo,实现各服务配置文件的统一管理。但其实,存在这样一个问题:默认情况下并不能及时的获取实时变更的配置文件信息,而需要重启服务。所以,本篇博客主要解决上述问题,实现配置文件的修改,可以不重启服务,获取到最新的配置文件信息。

【学习内容】

1. 实现方法

    对于Spring Cloud分布式配置中心,可以采用手动刷新或自动刷新。

2. 实现步骤

首先,说一下,如何做到手动刷新?

    手动刷新的实现,也就是需要人工调用接口,调用客户端/actuator/refresh接口,获取最新的配置文件信息。

  • 客户端bootstrap.properties配置文件添加访问权限
### 表示包含所有端点的信息,默认情况下,只是打开了info、health的端点
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
  • 客户端Controller增加注解@RefreshScope
@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${env}") // git配置文件里的key
    String configEnv;

    @RequestMapping("/getConfigInfo")
    public String getConfigInfo(){
        return "获取环境配置:" +  configEnv;
    }
}

在此访问接口,便可以获取到最新的配置文件信息。

这种方法局限在于需要各个服务人工调用接口。而自动刷新的方法,便打破了这样的局限。

    自动刷新的实现,采用的是Spring Cloud Config与Spring Cloud Bus的结合实现,整个流程如下图所示:

在这里插入图片描述

1)用户更新配置文件信息,检查到Git Hook变化,触发Hook配置地址的调用,即Config Server服务端的刷新接口:/actuator/bus-refresh。

2)Config Server接口到变化通知后,会发布消息,并通过bus发送给Config Client端。

3)当Config Client接收到消息后会重新发送请求加载配置信息。

下面通过Rabbit Mq作为消息中间件,集成到demo中。

Config Server配置服务端:

  • 添加bus依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  • 添加访问权限配置和mq配置
### 配置rabbitmq信息
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

### 配置节点访问权限
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

Config Client配置客户端:

  • 添加bus依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  • 添加访问权限配置和mq配置
### 配置rabbitmq信息
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

结合Bus结果验证:

当配置文件修改后,调用服务端刷新接口:http://localhost:8888/actuator/bus-refresh

再次调用客户端获取配置文件接口,便可以得到最新的配置文件信息,说明集成bus实现热刷成功。

结合WebHook实现git push后便可自动调用服务端刷新接口:

在这里插入图片描述

3. 实现demo

    demo已更新到github上:https://github.com/huzhiting/spring-cloud-config.git

【学习总结】

    两种方式的实现,各有利弊。手动刷新虽然需要人工调用,比较麻烦,但性能上是没有什么影响的;而自动刷新,虽然不需要进行手动调用接口,但会将所有服务的配置都刷新,所以性能较差。

猜你喜欢

转载自blog.csdn.net/u013034223/article/details/89530562