SpringCloud之如何配置文件自動刷新配置

1. 刷新環(huán)境Environment的理論分析

在之前我們已經(jīng)提過bootstrap配置文件的生效荣挨,是直接在BootstrapApplicationListener中建立一個隔離的bootstrap容器琴锭,從而得到刷新完成的容器的環(huán)境對象,并和app容器的環(huán)境對象去進行合并丁逝。

我們知道bootstrap配置文件自然是為了實現(xiàn)SpringCloud中很重要的一環(huán)惊搏,那就是分布式配置中心,我們下面以Nacos為例仪搔。

首先我們知道只要啟動app容器瘾婿,并且里面包含了BootstrapApplicationListener這個監(jiān)聽器,那么就會啟動bootstrap容器烤咧,并將里面的ApplicationContext的初始化器轉移到app容器當中去偏陪,當ApplicationContext創(chuàng)建好時,就會自動回調ApplicationContext的初始化器煮嫌。

而其中一個組件PropertySourceBootstrapConfiguration笛谦,它會自動注入容器中所有的類型的PropertySourceLocator組件。

image.png

在它對ApplicationContext去進行準備工作的回調方法如下

image.png

我們可以看到昌阿,它做的事情就是遍歷所有的Locator饥脑,去執(zhí)行它的locateCollection方法恳邀。

image.png

我們可以看到,locateCollection方法其實就是回調locate方法灶轰,去加載屬性源(PropertySource谣沸,也就是對配置文件的抽象)。

Nacos中就實現(xiàn)了這樣一個組件NacosPropertySourceLocator

image.png

我們可以發(fā)現(xiàn)笋颤,這就是去ConfigServer當中去加載配置文件的邏輯乳附。

從以上的分析當中,我們可以知道椰弊,構建一個app容器许溅,就能得到完整的環(huán)境信息。實際上是依賴BootstrapApplicationListener去構建的隔離容器秉版,最終實現(xiàn)的ConfigServer中配置文件的加載贤重。

其實在Spring中就是這樣去做的,構建一個mini版本的app容器清焕,因為容器就會去回調Locator并蝗,因此就能得到完整的環(huán)境信息。再將該容器的環(huán)境信息秸妥,和真正的app容器去進行合并滚停,就得到了更新之后的環(huán)境信息。

2. 在Spring當中的落地實現(xiàn)

自動刷新的入口在RefreshEventListener這個組件

image.png

我們可以看到粥惧,它監(jiān)聽了RefreshEvent事件键畴,當這個事件被發(fā)布時,就會回調ContextRefresherrefresh方法去完成配置文件的刷新工作突雪。

image.png

從上面的代碼中起惕,我們可以將其分為三步:

  • 1.updateEnvironment,更新環(huán)境對象咏删,它是一個模板方法惹想,交給子類去進行實現(xiàn)。
  • 2.發(fā)布EnvironmentChangeEvent事件督函。
  • 3.scope.refreshAll

2.1 更新環(huán)境信息

我們先來看第一步(找到子類LegacyContextRefresherupdateEnvironment方法)

image.png

我們可以看到嘀粱,其實這就是構建一個mini的app容器,并設置監(jiān)聽器為BootstrapApplicationListener辰狡,在刷新完容器锋叨,拿到它執(zhí)行完成的環(huán)境對象,去更新原來的app環(huán)境當中的環(huán)境信息宛篇。

2.2 發(fā)布環(huán)境改變事件并進行rebind

接著來看第二步悲柱,發(fā)布EnvironmentChangeEvent事件,其中一個組件ConfigurationPropertiesRebinder些己,就監(jiān)聽了這個事件豌鸡。

image.png

我們可以看到嘿般,當環(huán)境發(fā)生改變的事件發(fā)布之后,它就會遍歷所有的標有@ConfigurationProperties注解的Bean去進行rebind涯冠,下面我們來看rebind做了什么炉奴?

image.png

我們可以看到,首先是摧毀Bean蛇更,然后就是對Bean去進行重新初始化(重新初始化的過程中瞻赶,就會有處理@ConfigurationProperties注解的Bean去進行值的設置)

我們來看ConfigurationPropertiesBeans這個組件是如何收集@ConfigurationProperties的組件的?

image.png

我們可以看到派任,它是一個BeanPostProcessor砸逊,可以在Bean初始化前后去進行干預,它首先把RefreshScopeBean給排除掉掌逛,再去掃描@ConfigruationProperties注解师逸,也就是說,它維護的是非RefreshScope豆混,并且標注了@ConfigurationProperties注解的組件篓像。

2.3 刷新RefreshScope作用域內的Bean

image.png
image.png

我們可以看到,它先將自己的作用域的Bean去進行destory(將自己這個作用域內的Bean的緩存直接清空皿伺,并完成destroy回調)员辩,然后發(fā)布RefreshScopeRefreshedEvent事件。

RefreshScope這個作用域被刷新時鸵鸥,代表下次獲取RefreshScope內的Bean時奠滑,就得重新調用createBean方法去創(chuàng)建一個Bean,重新創(chuàng)建妒穴,自然是會拿到新的配置信息养叛,能實現(xiàn)刷新效果,沒毛病宰翅。

如何讓自己成為一個RefreshScopeBean呢?給一個Bean上標上@RefreshScope注解即可爽室。

2.4 用到的相關組件從何而來汁讼?

cloud-context包的spring.factories當中配置了下面這個配置類,會給容器中導入ConfigurationPropertiesBeansConfigurationPropertiesRebinder組件阔墩,去支持@ConfigurationProperties注解的Beanrebind嘿架。

image.png

2.5 Nacos如何整合Spring去進行發(fā)布事件?

Nacos通過spring.factories給容器中導入了NacosConfigAutoConfiguration這個組件啸箫,這個組件內部給容器中導入了一堆組件耸彪。

image.png

其中我們需要關注的組件是NacosContextRefresher

image.png

這個組件它也是一個監(jiān)聽器,負責監(jiān)聽容器已經(jīng)啟動完成的事件忘苛,當容器啟動完成的事件發(fā)布之后蝉娜,它就會將已經(jīng)注冊的全部屬性源的dataId配合group唱较,注冊一個監(jiān)聽器到NacosConfigService當中去,而監(jiān)聽器內部做的事就是發(fā)布RefreshEvent事件召川。

image.png

NacosConfigServer中的配置信息發(fā)生了改變南缓,就會推送消息給NacosClient,而此時NacosClient就會回調相應的監(jiān)聽器荧呐,回調監(jiān)聽器時汉形,自然就肯定會發(fā)布RefreshEvent事件。

RefreshEvent事件到來時倍阐,就會觸發(fā)我們上面提到的刷新工作概疆,將@ConfigurationProperties注解的Bean@RefreshScope的Bean`去完成刷新,完成刷新工作之后峰搪,下次我們再訪問相應的對象時岔冀,就會拿到新的對象,獲取到新的屬性值罢艾,從而實現(xiàn)配置文件的自動楣颠。

2.6 總結

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咐蚯,隨后出現(xiàn)的幾起案子童漩,更是在濱河造成了極大的恐慌,老刑警劉巖春锋,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矫膨,死亡現(xiàn)場離奇詭異,居然都是意外死亡期奔,警方通過查閱死者的電腦和手機侧馅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呐萌,“玉大人馁痴,你說我怎么就攤上這事》喂拢” “怎么了罗晕?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赠堵。 經(jīng)常有香客問我小渊,道長,這世上最難降的妖魔是什么茫叭? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任酬屉,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘呐萨。我一直安慰自己杀饵,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布垛吗。 她就那樣靜靜地躺著凹髓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怯屉。 梳的紋絲不亂的頭發(fā)上蔚舀,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音锨络,去河邊找鬼赌躺。 笑死,一個胖子當著我的面吹牛羡儿,可吹牛的內容都是我干的礼患。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼掠归,長吁一口氣:“原來是場噩夢啊……” “哼缅叠!你這毒婦竟也來了?” 一聲冷哼從身側響起虏冻,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤肤粱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厨相,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體领曼,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年蛮穿,在試婚紗的時候發(fā)現(xiàn)自己被綠了庶骄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡践磅,死狀恐怖单刁,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情府适,我是刑警寧澤羔飞,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站细溅,受9級特大地震影響,放射性物質發(fā)生泄漏儡嘶。R本人自食惡果不足惜喇聊,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹦狂。 院中可真熱鬧誓篱,春花似錦朋贬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邻遏,卻和暖如春糠亩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背准验。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工赎线, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糊饱。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓垂寥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親另锋。 傳聞我的和親對象是個殘疾皇子滞项,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容