前言
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,并點擊右上角的添加:
然后輸入相應的配置信息,注意這里不是配置/actuator/bus-refresh接口了 ,而是配置 spring cloud config 里特定給WebHooks調用的/monitor接口。至于域名,我這里使用了內網穿透的地址:
添加完成后,點擊右上角的測試,返回結果如下,則代表測試通過: