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