最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nacos通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的方式分享

 更新時(shí)間:2023年09月26日 08:43:44   作者:zooooooooy  
這篇文章主要給大家介紹了Nacos如何通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新,文中給了兩種實(shí)現(xiàn)方式供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

實(shí)現(xiàn)方式

有兩種方式,使用 @ConfigurationProperties 注解調(diào)用get請(qǐng)求或者 @RefreshScope + @Value 這兩種來(lái)實(shí)現(xiàn)配置的刷新。

配置屬性

現(xiàn)象

初始值是false,修改Nacos中的配置文件為true。很快配置項(xiàng)就變了。

idea日志

可以看到是觸發(fā)了配置的更新并打印了配置變化項(xiàng)。

DEBUG

通過(guò)Debug知道大體流程如下:

配置更新的大體流程如上。NacosClient中使用了一個(gè)線程池的無(wú)線循環(huán)來(lái)監(jiān)測(cè)配置的變更,即長(zhǎng)輪詢的方式去Nacos Server中去獲取配置變更。

自動(dòng)刷新

從上面我們可以得到配置已經(jīng)更新到了Environment中,但是持有配置項(xiàng)的類由于已經(jīng)初始化是不會(huì)變更已經(jīng)設(shè)置進(jìn)去的屬性。容器工廠通過(guò)銷(xiāo)毀bean,重建bean的方式來(lái)重新初始化配置對(duì)象,達(dá)到整個(gè)配置更新的操作。

配置刷新(@ConfigurationProperties)

refreshEnvironment(刷新環(huán)境變量)

刷新環(huán)境變量同時(shí)通過(guò)對(duì)比找出變更的配置項(xiàng),再觸發(fā)環(huán)境改變Event事件。

ConfigurationPropertiesRebinder(配置重新綁定)

配置重新綁定類同步也實(shí)現(xiàn) ApplicationListener 接口,監(jiān)聽(tīng)了 EnvironmentChangeEvent 的改變。是通過(guò)beanFactory來(lái)銷(xiāo)毀bean和初始化bean。

疑問(wèn)?

由于Spring框架的限制,當(dāng)刷新配置項(xiàng)時(shí),所有的配置項(xiàng)都會(huì)刷新,走bean的銷(xiāo)毀和創(chuàng)建過(guò)程。往往我們只需要更新其中變化的配置項(xiàng)即可。

已經(jīng)得到了變更的配置項(xiàng)了,結(jié)果還是刷新了所有的配置項(xiàng)。如果不需要進(jìn)行刷新,也可以添加自定義的配置項(xiàng),把對(duì)應(yīng)的配置加進(jìn)來(lái)即可。

默認(rèn)是hikari數(shù)據(jù)庫(kù)連接池的datasource對(duì)象。防止刷新時(shí)造成數(shù)據(jù)庫(kù)連接池重新銷(xiāo)毀創(chuàng)建,造成連接的浪費(fèi)。

其實(shí)我們可以通過(guò)keys想辦法定位對(duì)應(yīng)的配置項(xiàng),在Environment中附加每一個(gè)屬性對(duì)應(yīng)的來(lái)源。這樣可以直接通過(guò)變量操作來(lái)源進(jìn)行對(duì)應(yīng)的配置刷新。如果想粒度更小的話,在初始化過(guò)程中反射設(shè)置屬性時(shí),可以只設(shè)置變更的屬性,最小的代價(jià)變更配置類的變量值。

單例,通過(guò)反射的方式設(shè)置配置變更項(xiàng)??梢酝ㄟ^(guò)get方式來(lái)獲取變量后的值。

變量刷新(@RefreshScope + @Value)

非配置類上配置了 @RefreshScope 注解后,在abstractApplicationContext中實(shí)例化bean時(shí)沒(méi)有走單例或者原型的初始化方式。是通過(guò)Scope的方式自定義bean的獲取方式。

Scope內(nèi)部會(huì)維護(hù)一個(gè)數(shù)組緩存刷新對(duì)象。每次獲取時(shí)從緩存內(nèi)部獲取對(duì)象,如果不存在則重新創(chuàng)建,就會(huì)重新走一遍對(duì)象的實(shí)例化,因此Value對(duì)象就會(huì)重新被賦值。

緩存清除

依據(jù)配置,同理可以知道也是通過(guò)event機(jī)制獲取到配置更新,進(jìn)而去清除緩存。我們debug一下調(diào)用??匆幌?。

最后其實(shí)就是調(diào)用了cache的clear方法,清除了所有緩存。再次獲取bean時(shí),緩存中不存在,就會(huì)重新進(jìn)行創(chuàng)建。

疑問(wèn)?

這里也是清除所有緩存,所有 @RefreshScope 類都會(huì)重新創(chuàng)建。雖然對(duì)應(yīng)的配置也會(huì)更新,但是也會(huì)觸發(fā)postConstruct,destory等方法,導(dǎo)致出現(xiàn)一些無(wú)法預(yù)料的問(wèn)題。應(yīng)用自動(dòng)刷新同時(shí)也要考慮上述的情況,盡量進(jìn)行規(guī)避。

總結(jié)

個(gè)人建議走配置更新的方式。通過(guò)每次使用get方法來(lái)獲取到最新的變量即可。配置類沒(méi)有被重新創(chuàng)建,開(kāi)銷(xiāo)更小,框架也是自動(dòng)已經(jīng)集成好了。SpringBoot中可能變量設(shè)置方式可能非常多,導(dǎo)致不能準(zhǔn)確定位到變量對(duì)應(yīng)的配置類,所以每次都是刷新所有的配置類和注解類,開(kāi)銷(xiāo)也很大。

以上就是詳解Nacos如何通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的詳細(xì)內(nèi)容,更多關(guān)于Nacos RefreshScope自動(dòng)更新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis之傳入?yún)?shù)為list、數(shù)組、map的寫(xiě)法

    MyBatis之傳入?yún)?shù)為list、數(shù)組、map的寫(xiě)法

    這篇文章主要介紹了MyBatis之傳入?yún)?shù)為list、數(shù)組、map的寫(xiě)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解IDEA中SpringBoot整合Servlet三大組件的過(guò)程

    詳解IDEA中SpringBoot整合Servlet三大組件的過(guò)程

    這篇文章主要介紹了詳解IDEA中SpringBoot整合Servlet三大組件的過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • idea中l(wèi)ombok啟用的方法示例

    idea中l(wèi)ombok啟用的方法示例

    這篇文章主要介紹了idea中l(wèi)ombok啟用的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java Web項(xiàng)目中實(shí)現(xiàn)文件下載功能的實(shí)例教程

    Java Web項(xiàng)目中實(shí)現(xiàn)文件下載功能的實(shí)例教程

    這篇文章主要介紹了Java Web項(xiàng)目中實(shí)現(xiàn)文件下載功能的實(shí)例教程,分別講解了通過(guò)超鏈接實(shí)現(xiàn)下載以及通過(guò)Servlet程序?qū)崿F(xiàn)下載的方式,需要的朋友可以參考下
    2016-05-05
  • Spring Boot項(xiàng)目集成UidGenerato的方法步驟

    Spring Boot項(xiàng)目集成UidGenerato的方法步驟

    這篇文章主要介紹了Spring Boot項(xiàng)目集成UidGenerato的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解

    Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解

    本文主要介紹了 Java 多線程高并發(fā)中的 Fork/Join 框架的基本原理和其使用的工作竊取算法(work-stealing)、設(shè)計(jì)方式和部分實(shí)現(xiàn)源碼,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • Spring擴(kuò)展點(diǎn)之BeanFactoryPostProcessor詳解

    Spring擴(kuò)展點(diǎn)之BeanFactoryPostProcessor詳解

    這篇文章主要介紹了Spring擴(kuò)展點(diǎn)之BeanFactoryPostProcessor詳解,Spring的設(shè)計(jì)非常優(yōu)雅,有很多的擴(kuò)展點(diǎn)供我們對(duì)項(xiàng)目進(jìn)行擴(kuò)展,今天學(xué)習(xí)一下Spring其中擴(kuò)展點(diǎn)之一的BeanFactoryPostProcessor,需要的朋友可以參考下
    2023-11-11
  • Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼

    Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼

    這篇文章主要介紹了Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包

    Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一
    2022-09-09
  • Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式

    Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式

    這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論

徐水县| 广宁县| 谷城县| 彭阳县| 井冈山市| 井陉县| 沅江市| 犍为县| 崇信县| 聊城市| 重庆市| 江口县| 六盘水市| 成都市| 石棉县| 宾川县| 县级市| 娄底市| 鄂伦春自治旗| 永吉县| 马边| 丽江市| 嘉禾县| 饶河县| 乌拉特后旗| 古田县| 当雄县| 鄂托克旗| 志丹县| 明水县| 宣武区| 甘谷县| 龙门县| 凉山| 胶南市| 甘德县| 南京市| 阳山县| 礼泉县| 乌兰浩特市| 襄樊市|