Spring Cloud -Config動(dòng)態(tài)配置是如何實(shí)現(xiàn)的尚辑?(思路梳理)

Spring Cloud Config動(dòng)態(tài)配置是如何實(shí)現(xiàn)的贱勃?


一刚操,配置中心動(dòng)態(tài)配置概述


Spring Cloud Config的動(dòng)態(tài)配置需要借助Spring Cloud Bus來實(shí)現(xiàn)。如何實(shí)現(xiàn)的呢伶椿?我們先來看看思路:Spring Cloud Bus對(duì)外提供一個(gè)http接口辜伟,我們將這個(gè)接口配置到git上。當(dāng)git上的文件內(nèi)容發(fā)生變化時(shí)脊另,就會(huì)自動(dòng)調(diào)用我們定義的這個(gè)接口导狡,然后Config Server就會(huì)重新從git獲取最新的配置信息。Config Server把最新的配置信息放到消息隊(duì)列中偎痛,Config Client訂閱該消息旱捧,這樣就實(shí)現(xiàn)了動(dòng)態(tài)刷新配置信息的功能。


二踩麦,@RefreshScope注解


關(guān)于這個(gè)注解枚赡,官方是這樣解釋的:

Note that all beans in this scope are only initialized when first accessed, so the scope forces lazy initialization semantics.? The implementation involves creating a proxy for every bean in the scope, so there is a flag.

If a bean is refreshed then the next time the bean is accessed a new instance is created.? All lifecycle methods are applied to the bean instances, so any destruction callbacks that were registered in the bean factory are called when it is refreshed, and then the initialization callbacks are invoked as normal when the new instance is created. A new bean instance is created from the original bean definition, so any externalized content is re-evaluated when it is created.


這段話我就不再翻譯了氓癌,原滋原味的,多讀幾遍标锄,更能體會(huì)坐著作者的原意顽铸。實(shí)在不懂得茁计,可以去使用瀏覽器搜索翻譯一下料皇。我們來看作者的代碼是怎么寫的。

@RefreshScope注解的處理類是RefreshScope.class星压,具體的刷新邏輯就是

RefreshScope.refresh(name)和RefreshScope.refreshAll()践剂。

大致思路是這樣的:拿到@RefreshScope注解的bean,清空bean緩存娜膘,這樣下次執(zhí)行bean時(shí)逊脯,就會(huì)重新生成bean了,這樣就實(shí)現(xiàn)了這個(gè)bean下面的所有配置信息的自動(dòng)刷新了竣贪。

注意這里的bean緩存是:

GenericScope.BeanLifecycleWrapperCache

并且在父類GenericScope中军洼,還會(huì)對(duì)外暴露一個(gè)接口/refresh,修改配置以后演怎,我們只要手動(dòng)訪問一下這個(gè)接口 就可以實(shí)現(xiàn)刷新配置的功能了匕争。

調(diào)用RefreshScope的地方在哪里呢?

在這里:ContextRefresher.refresh()

源碼如下:

// 判斷PropertySource的實(shí)現(xiàn)是否是

// EnumerablePropertySource爷耀,如果是甘桑,則

//加入result并返回。

Map<String, Object> before = this.extract(this.context.getEnvironment().getPropertySources());

// 重新獲取配置文件

this.addConfigFilesToEnvironment();

// 比較配置文件更新前后歹叮,找出變更的那一部分配置

Set<String> keys = this.changes(before, this.extract(this.context.getEnvironment().getPropertySources())).keySet();

// 發(fā)布環(huán)境變更事件

this.context.publishEvent(new EnvironmentChangeEvent(keys));

// 開啟定時(shí)任務(wù)

this.scope.refreshAll();

// 把變更的配置的key組成的集合返回

return keys;


總結(jié):@RefreshScope注解是如何實(shí)現(xiàn)自動(dòng)刷新bean配置信息的呢跑杭?說白了,就是讓bean失效咆耿,這樣下次訪問bean時(shí)德谅,就會(huì)重新生成bean了。

但是萨螺,這里窄做,我還有一個(gè)疑問:如果修改配置后,不去手動(dòng)訪問spring暴露的/refresh接口屑迂,下次訪問@RefreshScope注解的bean時(shí)浸策,能獲取到最新的配置信息嗎?



三惹盼,Spring Cloud Bus


什么是Spring Cloud Bus:輕量級(jí)的消息代理庸汗。從技術(shù)角度來說,Spring Cloud Bus使用了java的事件處理機(jī)制和MQ的部分特性手报。

Spring Cloud Bus的工作流程:

發(fā)送端:構(gòu)造事件event蚯舱,將其publish到applicationContext中改化,然后將事件發(fā)布到channel。

接收端:從channel中獲取message枉昏,將message轉(zhuǎn)為event陈肛,然后將event事件publish到applicationContext中,最后接收端收到event兄裂,調(diào)用服務(wù)進(jìn)行邏輯處理句旱。

publish:這里的publish是ApplicationEventPublisher

channel:這里的channel是MessageChannel

event:ApplicationEvent,具體實(shí)現(xiàn)有以下幾種:

AckRemoteApplicationEvent

RefreshRemoteApplicationEvent

UnknownRemoteApplicationEvent

EnvironmentChangeRemoteApplicationEvent

具體的細(xì)節(jié)這里不再贅述晰奖,會(huì)另起文章討論

Spring Cloud Bus谈撒,這里明白大概流程即可。


四匾南,Git 之 WebHooks


什么是Webhooks呢啃匿?官方解釋如下:

Webhooks allow external services to be notified when certain events happen. When the specified events happen, we’ll send a POST request to each of the URLs you provide.

翻譯過來就是:

Webhooks允許在某些事件發(fā)生時(shí)通知外部服務(wù)。當(dāng)指定的事件發(fā)生時(shí)蛆楞,我們將向您提供的每個(gè)URLs發(fā)送一個(gè)POST請(qǐng)求溯乒。


借助Webhooks,我們就可以在git遠(yuǎn)程倉庫的配置發(fā)生變化時(shí)豹爹,讓git通知Config Server裆悄,從而實(shí)現(xiàn)自動(dòng)刷新的功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帅戒,一起剝皮案震驚了整個(gè)濱河市灯帮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逻住,老刑警劉巖钟哥,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瞎访,居然都是意外死亡腻贰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門扒秸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來播演,“玉大人,你說我怎么就攤上這事伴奥⌒纯荆” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵拾徙,是天一觀的道長洲炊。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么暂衡? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任询微,我火速辦了婚禮,結(jié)果婚禮上狂巢,老公的妹妹穿的比我還像新娘撑毛。我一直安慰自己,他們只是感情好唧领,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布藻雌。 她就那樣靜靜地躺著,像睡著了一般疹吃。 火紅的嫁衣襯著肌膚如雪蹦疑。 梳的紋絲不亂的頭發(fā)上西雀,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天萨驶,我揣著相機(jī)與錄音,去河邊找鬼艇肴。 笑死腔呜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的再悼。 我是一名探鬼主播核畴,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冲九!你這毒婦竟也來了谤草?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤莺奸,失蹤者是張志新(化名)和其女友劉穎丑孩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灭贷,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温学,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甚疟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗岖。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖览妖,靈堂內(nèi)的尸體忽然破棺而出轧拄,到底是詐尸還是另有隱情,我是刑警寧澤讽膏,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布檩电,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏是嗜。R本人自食惡果不足惜愈案,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹅搪。 院中可真熱鬧站绪,春花似錦、人聲如沸丽柿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甫题。三九已至馁筐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坠非,已是汗流浹背敏沉。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炎码,地道東北人盟迟。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像潦闲,于是被迫代替她去往敵國和親攒菠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349