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