Config配置中心的文件更新機(jī)制

前言

SpringCloud 是微服務(wù)中的翹楚,最佳的落地方案。

Spring Cloud Config 是一個(gè)解決分布式系統(tǒng)的配置管理方案,它包含了 server 和 client 兩個(gè)部分。

server 用來(lái)獲取遠(yuǎn)程的配置信息(默認(rèn)為 Git 倉(cāng)庫(kù)),并且以接口的形式提供出去;

client 根據(jù) server 提供的接口讀取配置文件,以便于初始化自己的應(yīng)用。
Git作為配置中心,將項(xiàng)目的配置文件放在遠(yuǎn)程,但為了更快的性能,一般會(huì)將git遠(yuǎn)程的信息同步到服務(wù)器(配置中心服務(wù)端)本地一份,那如何保證服務(wù)器本地和GIT遠(yuǎn)程的信息一致,就是我們本文要討論的問(wèn)題。

其中在遠(yuǎn)程git中更新了配置信息后,是怎么反應(yīng)到微服務(wù)項(xiàng)目中的,分2種情況:自動(dòng)更新和手動(dòng)更新,其中手動(dòng)更新又分2種情況,即重新啟動(dòng)微服務(wù)項(xiàng)目和手動(dòng)調(diào)用刷新接口;自動(dòng)刷新則通過(guò)WebHooks

1、手動(dòng)更新

1.1 重新啟動(dòng)項(xiàng)目更新

即git遠(yuǎn)程的配置文件更新后,在自動(dòng)化流水線(xiàn)中重新啟動(dòng)該項(xiàng)目,重新去配置中心獲取遠(yuǎn)程git的最新信息,此時(shí)也分2種情況:
如果重新啟動(dòng)配置中心服務(wù)的,即configserver,則會(huì)將使用該配置中心的所有項(xiàng)目的配置文件都從遠(yuǎn)程拉取最新的信息到本地;
如果重新啟動(dòng)某個(gè)微服務(wù)項(xiàng)目,則只會(huì)將該服務(wù)項(xiàng)目對(duì)應(yīng)配置文件從遠(yuǎn)程拉取到本地,其他項(xiàng)目的配置文件并不會(huì)同步。
配置中心服務(wù)端configserver的配置信息如下:

spring:
  cloud:
    config:
      server:
        git:
          # 基于 http 協(xié)議的單倉(cāng)庫(kù),每一個(gè)應(yīng)用創(chuàng)建一個(gè)目錄,每個(gè)目錄下創(chuàng)建配置文件
          uri: ${GIT_URI:http://xxxx/config.git}
          search-paths: '{profile}'
          # 配置的 Git 倉(cāng)庫(kù)基于 http 協(xié)議的,必須配置用戶(hù)名和密碼
          username: ${GIT_USERNAME:config_server}
          password: ${GIT_PASSWORD:config@123}
          # 本地倉(cāng)庫(kù)目錄設(shè)定
          basedir: /config-repos-tmp
          # 本地倉(cāng)庫(kù)如果有臟數(shù)據(jù),則會(huì)強(qiáng)制拉取(默認(rèn)是false)
          force-pull: true
          # 配置中心啟動(dòng)后從 GIT 倉(cāng)庫(kù)下載,uri配置中使用了 {application} 作為倉(cāng)庫(kù)名,這里要使用默認(rèn)值false,否則啟動(dòng)報(bào)錯(cuò).
          clone-on-start: false

其中basedir定義了將遠(yuǎn)程git倉(cāng)庫(kù)的文件拉取到本地的路徑,如果沒(méi)有配置,則每次去遠(yuǎn)程獲取
force-pull為true,則是強(qiáng)制拉取遠(yuǎn)程,以遠(yuǎn)程為準(zhǔn)。經(jīng)測(cè)試,如果不配置,或配置為false,當(dāng)手動(dòng)修改配置中心服務(wù)端本地的信息后,與git遠(yuǎn)程信息有沖突時(shí),是不會(huì)將遠(yuǎn)程信息同步到本地的,以服務(wù)端本地的為主。如果配置為true,則git遠(yuǎn)程會(huì)覆蓋服務(wù)器本地的信息。

1.2 Spring Cloud Bus+RabbitMQ,手動(dòng)調(diào)接口更新,需要以下工作:

首先我們需要在config項(xiàng)目和使用配置中心的每個(gè)微服務(wù)項(xiàng)目中,增加Spring Cloud Bus依賴(lài):

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

然后在config項(xiàng)目和使用配置中心的每個(gè)微服務(wù)項(xiàng)目的配置文件中,配置rabbitmq的地址以及用戶(hù)密碼,修改config服務(wù)的配置如下:

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

最后在有使用配置文件屬性信息的類(lèi)上加上這個(gè)注解,@RefreshScope // 這個(gè)注解聲明了刷新配置的范圍,如果使用config配置類(lèi)的話(huà),就聲明到配置類(lèi)上即可。
手動(dòng)調(diào)接口:http://ip:8888/actuator/bus-refresh即可將信息同步到服務(wù)端本地。

2 、 WebHooks自動(dòng)刷新

到這里代表我們已經(jīng)成功集成了RabbitMQ以及Spring Cloud Bus進(jìn)行配置文件的動(dòng)態(tài)刷新,但是我們目前依舊需要手動(dòng)去訪(fǎng)問(wèn)Bus用于刷新配置的接口,才能完成配置文件的動(dòng)態(tài)刷新。我們希望的是,當(dāng)git倉(cāng)庫(kù)的文件更新時(shí)就能夠?qū)崿F(xiàn)動(dòng)態(tài)刷新配置文件。要實(shí)現(xiàn)這個(gè)功能就需要Git倉(cāng)庫(kù)能夠在配置文件更新后,自動(dòng)調(diào)用Bus用于刷新配置的接口。那么要怎么實(shí)現(xiàn)這個(gè)功能呢?這就需要用到WebHooks了,好在碼云和GitHub都支持WebHooks,我們只需要配置一下接口地址即可。這也是我們本小節(jié)需要演示的。
注:SpringCloud需要2.0.0以上的版本才開(kāi)始支持碼云的WebHooks,低版本對(duì)碼云的WebHooks不兼容
首先打開(kāi)倉(cāng)庫(kù)的管理界面,選擇WebHooks,并點(diǎn)擊右上角的添加:


WebHooks.png

然后輸入相應(yīng)的配置信息,注意這里不是配置/actuator/bus-refresh接口了 ,而是配置 spring cloud config 里特定給WebHooks調(diào)用的/monitor接口。至于域名,我這里使用了內(nèi)網(wǎng)穿透的地址:

monitor.png

添加完成后,點(diǎn)擊右上角的測(cè)試,返回結(jié)果如下,則代表測(cè)試通過(guò):


測(cè)試.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容