SpringCloud配置動態(tài)更新原理解析
一、SpringBoot、Cloud配置的讀取
1、SpringBoot啟動時會讀取并解析配置文件中的配置到內(nèi)存變量,保存在Environment對象的屬性中。如果引入了配置中心如Nacos、Apollo,其中的配置也會被SpringBoot讀取并保存在Environment對象中。
2、可以使用編碼的方式獲取配置數(shù)據(jù):
String name = environment.getProperty("name");
3、可以使用@Value注解直接把配置賦值給Bean的屬性:
這里的name變量值直接來自于Environment對象。
二、SpringCloud配置動態(tài)刷新
1、SpringBoot配置文件和SpringCloud配置中心中的配置,區(qū)別只是來源不同,都是被讀取加載到Environment對象中生效的:
2、當(dāng)配置中心修改了配置并發(fā)布時,Server端會向Client端發(fā)送配置變化通知,Client端重新拉取配置并更新Environment對象中的配置數(shù)據(jù)(通常通過事件發(fā)布和監(jiān)聽機制來實現(xiàn))
此時如果使用編碼方式從Environment對象中獲取配置(而不是@Value注解的屬性),則已經(jīng)是更新后的值。
三、更新@RefreshScope注解Bean的屬性值
1、對于使用@Value注解獲取配置的屬性,不會隨配置數(shù)據(jù)的更新而更新,因為Bean對象已經(jīng)創(chuàng)建完成,配置變化時只是更新Environment中的數(shù)據(jù),并沒有更新Bean屬性值的動作發(fā)生。
2、但是如果Bean上有@RefreshScope注解,則其中的@Value屬性值會隨配置更新而更新。
原理:使用@RefreshScope標(biāo)記的Bean,Spring會為其創(chuàng)建代理對象,代理對象中持有原生對象,@Value的屬性值位于原生對象中。SpringBoot中的配置中心客戶端在收到服務(wù)端的變更通知后,會先后發(fā)布兩個事件:1、觸發(fā)Environment重新加載相關(guān)配置數(shù)據(jù)。2、觸發(fā)所有@RefreshScope的Bean置為null,則在這些Bean下次使用時重新創(chuàng)建,重新從Environment中獲取配置,即實現(xiàn)@Value屬性值的更新。
注:從SpringCloud配置動態(tài)更新的原理可知,諸如數(shù)據(jù)庫連接配置,在配置中心修改了配置后只是會更新@RefreshScope注解Bean中的@Value屬性,如果要動態(tài)修改數(shù)據(jù)庫信息,則還需要重建DataSource對象、清除舊連接等操作。
以上就是SpringCloud配置動態(tài)更新原理解析的詳細內(nèi)容,更多關(guān)于SpringCloud配置動態(tài)更新的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java之a(chǎn)ssert關(guān)鍵字用法案例詳解
這篇文章主要介紹了java之a(chǎn)ssert關(guān)鍵字用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08java8 stream中Collectors.toMap空指針問題及解決
這篇文章主要介紹了java8 stream中Collectors.toMap空指針問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Mybatis分頁的實現(xiàn)及使用注解開發(fā)操作
這篇文章主要介紹了Mybatis分頁的實現(xiàn)及使用注解開發(fā)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06java計算方差、標(biāo)準(zhǔn)差(均方差)實例代碼
在本篇文章里小編給大家分享了關(guān)于java計算方差、標(biāo)準(zhǔn)差(均方差)實例代碼以及相關(guān)知識點,需要的朋友們可以參考下。2019-08-08Springboot集合前端實現(xiàn)進度條顯示功能實例
這篇文章主要介紹了使用進度條提升用戶體驗的原因,特別是在處理大文件上傳、下載或長時間運行的操作時,進度條通過實時反饋任務(wù)進度,減少用戶的不確定感,文中給出了詳細的代碼示例,需要的朋友可以參考下2024-11-11spring boot實戰(zhàn)教程之shiro session過期時間詳解
這篇文章主要給大家介紹了關(guān)于spring boot實戰(zhàn)教程之shiro session過期時間的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-10-10Java操作MongoDB數(shù)據(jù)庫的示例代碼
這篇文章主要介紹了Java操作MongoDB的示例代碼,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04