Nacos-11--Nacos熱更新的原理

在Nacos中,當監聽到配置變化后,Nacos提供了相關機制(長輪詢或gRPC)讓客戶端能夠監聽到配置的變化,并觸發相應的監聽器(Listener),但具體的處理邏輯需要根據實際需求來實現。

1、熱更新的核心機制

Nacos1.x版本的熱更新依賴于長輪詢(Long Polling)機制和事件監聽器(Listener),結合Spring Cloud的@RefreshScope注解實現動態配置生效。

1、客戶端監聽配置變化

長輪詢機制:

  • 客戶端定期(默認每10ms)向Nacos服務端發起HTTP請求,攜帶當前配置的MD5值。
  • 若服務端配置未變化,請求會掛起(默認30s),直到配置更新或超時。
  • 若配置更新,服務端立即返回變更的dataId列表,客戶端根據列表拉取最新配置。

事件監聽器:

  • 客戶端通過addListen(dataId, group, listener)注冊監聽器,業務上可以通過配置監聽器的方式實時獲取更新的配置信息。即:nacos客戶端當發現配置更新后,會觸發注冊監聽器的回調函數,實現業務額度擴展能力。

2、服務端推送配置變化

配置更新觸發:

  • 通過Nacos控制臺、API或SDK修改配置后,服務端會立即喚醒所有掛起的長輪詢請求。
  • 服務端返回變更的dataId,客戶端拉取最新配置。

3、客戶端處理配置更新

本地緩存更新:

  • 客戶端收到新配置后,比較MD5值,若變化則更新本地內存緩存和本地快照文件。

觸發監聽器回調:

  • 調用開發者注冊的Listener.receiveConfigInfo(String configInfo)方法,執行自定義邏輯(如刷新Spring Bean)

2、Spring Cloud集成熱更新

在Spring Cloud應用中,Nacos的熱更新通過以下兩種方式實現。

1、使用@RefreshScope注解

  • 適用場景:通過**@Value注解**注入配置的類或方法。
  • 實現方式:
    • 在類或方法上添加@RefreshScope,當配置更新時,Spring會重新創建Bean或刷新屬性。

示例代碼:

@RestController
@RequestMapping("user")
@RefreshScope  // 配置變更時,該類的Bean會被重新創建
public class UserController {@Value("${pattern.dateformat}")private String dateformat;@GetMapping("/now")public String getNow() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));}
}

說明:
@RefreshScope會創建一個代理Bean,配置更新后,代理Bean會重新加載屬性值

2、使用@ConfigurationProperties注解

  • 適用場景:通過配置類注入配置(如PatternProperties)。
  • 實現方式:
    • 配置類使用@ConfigurationProperties注解綁定配置前綴,Spring會自動監聽配置變化并更新屬性

示例代碼:

@Component
@Data
@ConfigurationProperties(prefix = "pattern")  // 自動監聽配置變化
public class PatternProperties {private String dateformat;
}@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate PatternProperties properties;@GetMapping("/now")public String getNow() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));}
}

說明:

  • Spring Cloud會自動將**@ConfigurationProperties注解的類與Nacos配置綁定,配置更新后,屬性值會動態刷新**。

簡單來說:@ConfigurationProperties注解的類在使用屬性之前,先驗證該屬性值是否發生變化。如果存在更新,則及時返回更新后的數據。

3、Nacos監聽器機制

1、監聽配置變化

(1)、注冊監聽器

首先,需要為特定的配置文件注冊一個監聽器。
例如,在Java環境中可以使用Nacos提供的API實現。

代碼示例:

ConfigService configService = NacosFactory.createConfigService(properties);
String dataId = "example";
String group = "DEFAULT_GROUP";
Listener listener = new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String configInfo) {// 在這里處理配置變更System.out.println("配置發生變化: " + configInfo);// 實現熱更新邏輯}
};
configService.addListener(dataId, group, listener);
(2)、監聽器觸發

**當配置發生變化時,Nacos會調用receiveConfigInfo方法,并傳入最新的配置信息。**如果你向如上定義監聽器注冊到Nacos的ConfigService中,當這個配置發生變化后,就會觸發調用這個監聽器的receiveConfigInfo方法。

2、熱更新處理

雖然Nacos能夠通知你配置發生了變化,但如何處理這個變化取決于你的應用程序。

以下是幾種常見的處理策略:

(1)、重新加載配置

在receiveConfigInfo方法中,你可以編寫代碼來解析新的配置,并將其應用到應用程序中。這可能包括重新初始化某些組件或更新內存中的配置對象。

(2)、動態調整行為

如果你的應用程序支持動態調整(比如數據庫連接池大小、線程池大小等),可以在接收到新配置后直接調整這些參數而無需重啟服務。

(3)、使用Spring Cloud等框架

如果你正在使用Spring Cloud等微服務框架,結合Spring Cloud Alibaba Nacos Config,可以利用其對配置中心的支持,實現更優雅的熱更新。Spring Cloud會自動將Nacos中的配置注入到Spring的Environment中,并且當配置發生變化時,它會自動刷新相關的Bean或者屬性值。

4、熱更新的注意事項

  • 部分配置不支持熱更新:
    • 靜態配置:如數據庫連接池大小、線程池參數等,可能需要重啟才能生效
    • 非Spring Bean:未被Spring管理的類或屬性(如硬編碼的常量)無法通過熱更新生效
  • 依賴監聽器手動處理:
    • 若配置更新需要觸發復雜邏輯(如重新加載緩存、重連外部服務),需在Listener.receiveConfigInfo()中手動實現。
  • 性能優化:
    • 分片監聽:Nacos客戶端會將配置分片(每片最多3000個配置)以減少單次請求的數據量。
    • 本地緩存降級:服務端不可用時,客戶端優先使用本地快照文件維持服務。

5、驗證熱更新是否生效

  • 方法一:日志觀察:
    • 在Listener.receiveConfigInfo()中打印日志,確認配置變更后回調是否觸發。
  • 方法二:接口測試:
    • 修改Nacos配置后,調用接口驗證新配置是否生效(如修改pattern.dateformat后,接口返回的日期格式是否變化)。
  • 方法三:Actuator端點:
    • Spring Boot應用可通過/actuator/refresh端點手動觸發配置刷新(需開啟management.endpoints.web.exposure.include=*)。

6、總結

Nacos1.x通過長輪詢 + 事件監聽實現配置的熱更新,結合Spring Cloud的@RefreshScope和@ConfigurationProperties注解,可以動態更新大部分配置。
注意:
1、優先使用@ConfigurationProperties:適合管理復雜配置對象。
2、手動處理復雜邏輯:通過監聽器回調實現自定義更新邏輯。
3、避免濫用熱更新:非關鍵配置或靜態參數建議通過重啟生效。

通過合理使用Nacos的熱更新機制,可以實現服務配置的動態調整,提升系統的彈性和運維效率。

向陽前行,Dare To Be!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96597.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

fastapi 的BackgroundTasks

什么是 BackgroundTasks?BackgroundTasks 是 FastAPI 提供的一個強大工具,它允許你將一些非緊急的、耗時的操作(例如發送郵件、處理數據、調用第三方 API 等)放到“后臺”去執行,而不是讓用戶一直等待這些操作完成。它…

Python 十進制轉二進制

在 Python 中,將十進制整數轉換為二進制有多種方法。以下是幾種常見的方式:1. 使用 bin() 函數bin() 是 Python 內置函數,可以將十進制整數轉換為二進制字符串。語法bin(n)示例n 13 binary_str bin(n) print(binary_str) # 輸出: 0b1101說…

合并工作表,忽略手動隱藏行超簡單-Excel易用寶

同事小麗有一個工作簿,文件中有多個工作表,每個工作表中有多行數據,這些表格中數據是有手動隱藏行的,她想把這些表格的數據忽略隱藏行合并到一個工作表中,但是使勁渾身解數,各種折騰,都會把隱藏…

我從零開始學習C語言(14)- 基本類型 PART1

今天學習第7章-基本類型,主要內容如下:7.1 整數類型這里的整數的整數值就是數學意義上的整數。C語言支持兩種本質上(存儲形式)不同的數值類型:整數類型(簡稱整型)和浮點類型(簡稱浮點…

Flutter - UI布局

一、容器Widget1. ScaffoldScaffold 作為頁面的腳手架,基礎區域包含頂部導航欄 appBar、主體內容區 body、側邊抽屜 drawer、懸浮按鈕 floatingActionButton、底部導航欄 bottomNavigationBar。Scaffold(appBar: AppBar( // 頂部導航欄title: Text(首頁),),body: Ce…

UNIKGQA論文筆記

UNIKGQA: UNIFIED RETRIEVAL AND REASONING FOR SOLVING MULTI-HOP QUESTION ANSWERING OVER KNOWLEDGE GRAPH(ICLR 2023)Introduction知識圖上的多跳問題回答(KGQA)的目的是在大規模知識圖譜(KG)上找到自然語言問題中提到的主題實…

MySQL 8.0.17 “Too Many Connections” 排查指南

MySQL 8.0.17 “Too Many Connections” 排查與優化指南 在 MySQL 8.0.17 中,當出現“Too many connections”錯誤時,通常意味著數據庫連接數已達上限。這不僅會影響應用性能,還可能導致連接池(如 Druid)無法獲取新連接…

GEO優化服務:智能時代營銷新賽道的中國引領者——全球行業格局與發展趨勢觀察

隨著全球人工智能技術的迅猛發展,以GPT-5、Claude Opus以及我國的DeepSeek Divine、豆包等為代表的新一代生成式AI搜索引擎,正深刻改變著信息獲取與商業決策模式。用戶通過直接向AI提問獲取整合答案的行為日益普遍,傳統搜索引擎的流量入口地位…

全面解析主流AI模型:功能對比與應用推薦

全面解析主流AI模型:功能對比與應用推薦 在當前人工智能技術飛速發展的背景下,市面上涌現了多種具備不同能力的AI模型。本文將系統梳理主流模型的特性、對比其核心能力,并結合實際場景推薦高效、穩定的API服務(如https://api.aaa…

【Nacos知識】Nacos 作為注冊中心的客戶端配置詳解

Nacos 作為注冊中心的客戶端配置詳解Nacos 作為注冊中心的客戶端配置詳解一、核心配置項全景圖二、基礎連接配置1. 服務端地址配置2. 命名空間配置3. 服務分組配置三、服務注冊配置1. 服務元數據配置2. 網絡位置配置3. 集群與權重配置四、健康檢查配置1. 心跳參數配置2. 健康檢…

TypeReference 泛型的使用場景及具體使用流程

簡介 在 Java 中,泛型類型在運行時會被擦除。這意味著當我們使用泛型時,運行時無法直接獲取到泛型的具體類型信息。例如,我們無法直接通過 Class 對象來獲取一個泛型類型的類型參數。這在某些情況下可能會導致問題,特別是在我們需…

商超場景徘徊識別誤報率↓79%!陌訊多模態時序融合算法落地優化

原創聲明本文為原創技術解析文章,核心技術參數與架構設計引用自 “陌訊技術白皮書(2024 版)”,所有技術描述均經過重寫轉換,無復制官網文案行為,嚴禁未經授權轉載。一、行業痛點:徘徊識別的場景…

KubeBlocks AI:AI時代的云原生數據庫運維探索

KubeBlocks AI:AI時代的云原生數據庫運維探索 REF Auto-detect-failure 架構Auto-bug-detect測試 引言 傳統的自動化運維診斷主要依賴基于規則的方法——無論是Ansible Playbooks的預定義腳本,還是Kubernetes Operator的固化邏輯,這些方法…

如何編譯botan加密庫?

Botan加密庫支持2.x版本和3.x版本,其中3.x版本需要支持C20。0、下載源碼git clone https://github.com/randombit/botan.gitcd botan切換分支到2.19.5版本git checkout 2.19.51、Windows編譯Botan加密庫1.1 配置生成MakefileRelease模式python configure.py --ccmsv…

Linux問答題:分析和存儲日志

目錄 1. RHEL 日志文件保存在哪個目錄中? 2.什么是 syslog 消息和非 syslog 消息? 3.哪兩個服務處理 RHEL 中的 syslog 消息? 4. 列舉常用的系統日志文件并說明其存儲的消息類型。 5. 簡單說下日志文件輪轉的作用 6.systemd-journald 服…

chapter05_從spring.xml讀取Bean

一、簡化Bean的注冊 如果每次注冊一個Bean,都要像上節一樣,手動寫PropertyValues相關的代碼,那太復雜了,我們希望讀取XML文件,自動注冊Bean,這樣對于使用者,甚至不知道有BeanDefinition的存在 二…

【數位DP】D. From 1 to Infinity

Problem - D - Codeforces 題目: 思路: 數位DP 數論 題目讓我們求這個無限序列 123456789101112.... 的前 k 個數的數位和 題目看起來很不好求,事實上確實是這樣的 我們可以先從簡單問題開始 問題①. 求 k 位置對應著第幾個數 那么顯然…

gitlab、jenkins等應用集成ldap

gitlab、jenkins等應用集成ldap 文檔 openldap安裝 -添加條目gitlab、jenkins等應用集成ldap gitlab集成ldap gitlab版本:gitlab-jh-17.7.0 ldap版本:openldap-2.6.10 修改/etc/gitlab/gitlab.rb文件,編輯相關信息 gitlab_rails[ldap_en…

Unity中國小游戲行業沙龍:抖音小游戲平臺分析與規劃

目錄 一、抖音小游戲市場全景分析 行業現狀與發展趨勢 行業發展關鍵議題 內容運營生態觀察 二、平臺技術架構與運營體系 用戶復訪與留存體系 技術支撐體系 三、平臺激勵與商業化政策 收益分成機制 資金服務升級 技術基礎建設 四、生態合作與發展規劃 開發者支持體系…

手機橫屏適配方案

CSS自動旋轉頁面實戰指南在移動端開發中,橫屏適配是一個常見但棘手的問題。本文將深入解析一套完整的CSS橫屏適配方案,讓你的網頁在手機旋轉時自動調整布局,提供無縫的用戶體驗。一、橫屏適配的重要性 隨著移動設備使用場景的多樣化&#xff…