前言
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)擊右上角的添加:

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

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