Config配置中心的文件更新机制

前言

SpringCloud 是微服务中的翘楚,最佳的落地方案。

Spring Cloud Config 是一个解决分布式系统的配置管理方案,它包含了 server 和 client 两个部分。

server 用来获取远程的配置信息(默认为 Git 仓库),并且以接口的形式提供出去;

client 根据 server 提供的接口读取配置文件,以便于初始化自己的应用。
Git作为配置中心,将项目的配置文件放在远程,但为了更快的性能,一般会将git远程的信息同步到服务器(配置中心服务端)本地一份,那如何保证服务器本地和GIT远程的信息一致,就是我们本文要讨论的问题。

其中在远程git中更新了配置信息后,是怎么反应到微服务项目中的,分2种情况:自动更新和手动更新,其中手动更新又分2种情况,即重新启动微服务项目和手动调用刷新接口;自动刷新则通过WebHooks

1、手动更新

1.1 重新启动项目更新

即git远程的配置文件更新后,在自动化流水线中重新启动该项目,重新去配置中心获取远程git的最新信息,此时也分2种情况:
如果重新启动配置中心服务的,即configserver,则会将使用该配置中心的所有项目的配置文件都从远程拉取最新的信息到本地;
如果重新启动某个微服务项目,则只会将该服务项目对应配置文件从远程拉取到本地,其他项目的配置文件并不会同步。
配置中心服务端configserver的配置信息如下:

spring:
  cloud:
    config:
      server:
        git:
          # 基于 http 协议的单仓库,每一个应用创建一个目录,每个目录下创建配置文件
          uri: ${GIT_URI:http://xxxx/config.git}
          search-paths: '{profile}'
          # 配置的 Git 仓库基于 http 协议的,必须配置用户名和密码
          username: ${GIT_USERNAME:config_server}
          password: ${GIT_PASSWORD:config@123}
          # 本地仓库目录设定
          basedir: /config-repos-tmp
          # 本地仓库如果有脏数据,则会强制拉取(默认是false)
          force-pull: true
          # 配置中心启动后从 GIT 仓库下载,uri配置中使用了 {application} 作为仓库名,这里要使用默认值false,否则启动报错.
          clone-on-start: false

其中basedir定义了将远程git仓库的文件拉取到本地的路径,如果没有配置,则每次去远程获取
force-pull为true,则是强制拉取远程,以远程为准。经测试,如果不配置,或配置为false,当手动修改配置中心服务端本地的信息后,与git远程信息有冲突时,是不会将远程信息同步到本地的,以服务端本地的为主。如果配置为true,则git远程会覆盖服务器本地的信息。

1.2 Spring Cloud Bus+RabbitMQ,手动调接口更新,需要以下工作:

首先我们需要在config项目和使用配置中心的每个微服务项目中,增加Spring Cloud Bus依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

然后在config项目和使用配置中心的每个微服务项目的配置文件中,配置rabbitmq的地址以及用户密码,修改config服务的配置如下:

spring:
  rabbitmq:  
    host: 192.168.xxx.xxx
    port: 5672
    username: admin
    password: admin

最后在有使用配置文件属性信息的类上加上这个注解,@RefreshScope // 这个注解声明了刷新配置的范围,如果使用config配置类的话,就声明到配置类上即可。
手动调接口:http://ip:8888/actuator/bus-refresh即可将信息同步到服务端本地。

2 、 WebHooks自动刷新

到这里代表我们已经成功集成了RabbitMQ以及Spring Cloud Bus进行配置文件的动态刷新,但是我们目前依旧需要手动去访问Bus用于刷新配置的接口,才能完成配置文件的动态刷新。我们希望的是,当git仓库的文件更新时就能够实现动态刷新配置文件。要实现这个功能就需要Git仓库能够在配置文件更新后,自动调用Bus用于刷新配置的接口。那么要怎么实现这个功能呢?这就需要用到WebHooks了,好在码云和GitHub都支持WebHooks,我们只需要配置一下接口地址即可。这也是我们本小节需要演示的。
注:SpringCloud需要2.0.0以上的版本才开始支持码云的WebHooks,低版本对码云的WebHooks不兼容
首先打开仓库的管理界面,选择WebHooks,并点击右上角的添加:


WebHooks.png

然后输入相应的配置信息,注意这里不是配置/actuator/bus-refresh接口了 ,而是配置 spring cloud config 里特定给WebHooks调用的/monitor接口。至于域名,我这里使用了内网穿透的地址:

monitor.png

添加完成后,点击右上角的测试,返回结果如下,则代表测试通过:


测试.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容