Nacos注冊中心AP模式核心源碼分析(集群模式)

文章目錄

  • 概述
  • 一、客戶端新注冊實例信息在集群間同步
  • 二、服務端集群節點信息在集群間同步
    • 2.1、DistroMapper
    • 2.2、ProtocolManager
    • 2.3、ServerListManager
    • 2.4、RaftPeerSet
  • 三、客戶端實例狀態信息在集群間同步
  • 四、服務端新節點上線同步集群數據


概述

??在Nacos集群模式下,客戶端可以選擇注冊在集群中的某一臺機器上:

server:port: 9002
spring:application:name: stock-servicecloud:nacos:discovery:# 指定nacos server的地址server-addr: localhost:8847# 指定集群名稱cluster-name: njmetadata:version: v3#ephemeral: falsenamespace: public

??當客戶端啟動完成后,集群中8847所在的服務端,首先獲取到了客戶端實例,隨后88678857也同步獲取到了客戶端實例 。
在這里插入圖片描述
??這里就牽涉到兩個問題:

  1. 客戶端只向集群中的某一臺機器進行了注冊,集群中的其他節點是如何感知到的?
  2. 如果客戶端下線,或者健康狀態發生改變,其他節點又是如何同步的?

??也就是文中的四點:

  • 客戶端啟動,注冊實例到集群中的某個節點,該注冊信息在整個集群中的同步。
  • 客戶端實例狀態信息發生改變,在集群間同步。
  • 服務端集群節點狀態信息在集群間同步。
  • 服務端新上線的節點,同步集群中的節點信息。

一、客戶端新注冊實例信息在集群間同步

??當客戶端發起注冊實例的請求,到達服務端后,在DistroConsistencyServiceImpl#put方法中,除了單機模式下將實例信息放入阻塞隊列之外,集群模式下還需要進行同步。默認的延遲時間是1s。
在這里插入圖片描述
??在sync方法中,首先會去創建一個DistroDelayTask任務實例,然后放入NacosDelayTaskExecuteEngine中。該類是Nacos自己實現的延遲任務執行引擎。這里的套路就和注冊實例信息一樣,首先將實例放入隊列中,然后再由其他線程異步獲取并執行邏輯。
在這里插入圖片描述
??最終調用到的是DistroSyncChangeTask#run方法,同樣是發起http請求,通知集群中的其他節點,如果返回失敗,還會進行重試:
在這里插入圖片描述
在這里插入圖片描述
??訪問的是服務端的/distro/datum:
在這里插入圖片描述
??請求發送到服務端的DistroControlleronSyncDatum
在這里插入圖片描述
??最終執行onPut方法,將實例信息放入隊列中。
在這里插入圖片描述

二、服務端集群節點信息在集群間同步

??如果集群中的某個節點宕機了,或者集群啟動,那么集群之間需要同步狀態信息,是通過registerServerStatusReporter定時任務實現的,默認2s一次。
在這里插入圖片描述
??真正執行邏輯的是ServerStatusReporterrun方法中的synchronizer.send
在這里插入圖片描述
??同樣是發送http請求,通知其他節點,調用的是OperatorController/server/status接口。
在這里插入圖片描述
??為了觀察集群中某個節點下線后,其他節點是如何同步狀態的,手動模擬某個節點下線:
在這里插入圖片描述
??在onReceiveServerStatus方法中,首先會對傳入的configInfo參數進行一系列的處理,獲取IP端口,權重等信息,然后調用 memberManager.update(server);方法。
在這里插入圖片描述
??update方法,如果當前節點的狀態已經是DOWN,就會直接從memberAddressInfos中刪除該實例信息:
在這里插入圖片描述
??并且在實例信息有改變的情況下,還會通過notifyMemberChange();方法去發布一個事件:
在這里插入圖片描述
??實際上該事件是放在DefaultPublisherqueue屬性中的,該屬性是一個阻塞隊列。
在這里插入圖片描述
??真正處理該事件的方法,是DefaultPublisher的run方法:
在這里插入圖片描述
??receiveEvent又調用了notifySubscriber,這里的subscribers訂閱者有四個,這四個訂閱者都是MemberChangeListener的子類
在這里插入圖片描述

2.1、DistroMapper

??DistroMapperonEvent,主要的用途是用于Distro一致性協議中的數據同步路由。在該方法中,主要完成了三件事:

  1. 選出健康節點,并生成節點 IP 列表。
  2. 排序節點列表,確保順序一致。
  3. 替換舊的健康節點列表。

在這里插入圖片描述
??當 Nacos 集群成員發生變化時,DistroMapper 會自動更新健康節點列表,并保持節點順序一致,保障 AP 模式下的數據同步路由穩定運行。

2.2、ProtocolManager

??ProtocolManageronEvent用于當集群成員列表發生變化時,分別通知 AP 協議組件(Distro)和 CP 協議組件(Raft),以更新它們各自的一致性成員信息,啟用不同的線程進行處理。ProtocolManager 是這兩種協議的統一協調者。
在這里插入圖片描述

2.3、ServerListManager

??ServerListManageronEvent用于接收到成員列表變更事件后,直接用最新的成員列表替換本地的servers列表。ServerListManager 是用于維護當前 Nacos 節點所感知的集群服務器列表的,會被其他組件依賴:

  • 服務注冊、發現時選擇服務器;
  • 啟動時檢查集群節點是否就緒;
  • 分布式協議中做心跳/同步時依據節點列表操作

在這里插入圖片描述

2.4、RaftPeerSet

??RaftPeerSetonEvent用于Naocs CP模式下的raft算法,在該方法中,主要完成了:

  • 獲取當前的最新成員列表, 和上一次的成員列表比較,找出新增或變更的節點。
  • 如果成員發生了變化(比如新節點加入或節點 IP 變化),通知 Raft 協議層更新 投票成員列表
  • 更新緩存,記錄最新的集群節點狀態
    在這里插入圖片描述

三、客戶端實例狀態信息在集群間同步

??這里利用到的是scheduleServiceReporter定時任務。默認一分鐘執行一次。
在這里插入圖片描述
??真正執行邏輯的是ServiceReporterrun方法:
在這里插入圖片描述
??distroMapper.responsible(serviceName)是關鍵代碼,該方法主要用于判斷當前節點是否負責處理某個服務(serviceName) 的數據同步和持久化

  • 獲取當前 Nacos 集群中所有 健康的節點地址。
  • 如果 Distro 沒啟用,或者是單機模式,直接返回 true,所有服務都由自己負責。
  • 健康節點列表為空,表示 Distro 還沒初始化好,此時不能確定責任關系。
  • 獲取當前節點在健康節點列表中的索引。
  • 用服務名做 Hash,然后和健康節點數量取模,得到這個服務應由哪個節點處理(索引)。
  • 判斷這個 target 索引,是否屬于當前節點。

在這里插入圖片描述
??同樣是發送http請求,通知其他節點,調用的是ServiceControllerserviceStatus方法,主要用于驗證當前服務節點的服務信息是否和其他節點保持一致。
在這里插入圖片描述
??在ServiceControllerserviceStatus方法中,如果發現服務狀態有變化,則會調用addUpdatedServiceToQueue方法,向阻塞隊列中存入信息:
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
??UpdatedServiceProcessor的run方法,再次開啟任務:
在這里插入圖片描述
??所以最終執行邏輯的是ServiceUpdaterrun
在這里插入圖片描述
??實例的健康狀態發生了改變:
在這里插入圖片描述
??發布事件,被實現了ApplicationListener<ServiceChangeEvent>的實現類監聽,最終通過udp協議,推送給客戶端。
在這里插入圖片描述


??在集群模式下,服務端檢查心跳的定時任務,實際上也是由集群中的某一個節點去完成的
在這里插入圖片描述
??這里就是利用了上面提到的hash算法,不滿足條件的節點直接return,不會執行心跳檢查任務。

四、服務端新節點上線同步集群數據

??上線的新節點,需要從其他節點同步數據,是通過DistroLoadDataTask任務實現的:
在這里插入圖片描述
??在load方法中:

  • 首先獲取集群中除了自己的其他節點。如果沒有獲取到,就會阻塞等待。
  • 如果還沒有注冊任何數據類型,同樣阻塞等待。
  • 從其他 Nacos 節點獲取數據快照;

在這里插入圖片描述
??然后循環調用loadAllDataSnapshotFromRemote方法,該方法有兩個關鍵操作:

  • 根據地址調用DistroController/distro/datums接口,獲取數據。
  • 將數據寫入內存中。
    在這里插入圖片描述

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

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

相關文章

vscode和cursor對ubuntu22.04的remote ssh和X-Windows的無密碼登錄

這里寫自定義目錄標題 寫在前面需求的描述問題的引出 昨天已使能自動登錄上午我的改變UBUNTU 22.04關閉密碼規則一&#xff1a;修改 /etc/pam.d/common-password 文件二&#xff1a;修改 /etc/security/pwquality.conf 文件方法三&#xff1a;禁用 pam_pwquality.so 模塊 vscod…

論文閱讀:基于增強通用深度圖像水印的混合篡改定位技術 OmniGuard

一、論文信息 論文名稱:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者團隊:北京大學發表會議:CVPR2025論文鏈接:https://arxiv.org/pdf/2412.01615二、動機與貢獻 動機: 隨著生成式 AI 的快速發展,其在圖像編輯領…

一周學會Pandas2 Python數據處理與分析-NumPy數組創建

鋒哥原創的Pandas2 Python數據處理與分析 視頻教程&#xff1a; 2025版 Pandas2 Python數據處理與分析 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili NumPy數組創建最常用的方式是直接創建&#xff0c; numpy 可以直接創建或者將 python的其他元素轉為 array 對象。 下…

【全球首發】DeepSeek谷歌版1.1.5 - 免費GPT-4級別AI工具

【全球首發】DeepSeek谷歌版1.1.5 - 免費GPT-4級別AI工具 資源簡介 DeepSeek谷歌版1.1.5是目前全球領先的免費AI助手&#xff0c;性能超越國內主流AI產品&#xff0c;提供類似GPT-4的智能體驗。 版本信息 最新版本&#xff1a;1.1.5&#xff08;2024最新版&#xff09;應用…

小程序29-事件穿參-mark 自定義數據

小程序進行事件傳參的時候&#xff0c;除了使用 data-*屬性 傳遞參數外&#xff0c;還可以 使用 mark 標記傳遞參數 mark 是一種自定義屬性&#xff0c;可以在組件上添加&#xff0c;用于來識別具體觸發事件的 target 節點。同時 mark 還可以用于承載一些自定義數據 在組件上使…

高級:分布式系統面試題精講

一、引言 分布式系統在現代軟件開發中占據重要地位&#xff0c;其設計和實現需要考慮多個關鍵因素。面試官通過相關問題&#xff0c;考察候選人對分布式系統核心概念的理解、實際應用能力以及在復雜場景下的問題解決能力。本文將深入分析分布式系統的CAP定理、一致性協議、分布…

【Android Studio 下載 Gradle 失敗】

路雖遠行則將至&#xff0c;事雖難做則必成 一、事故現場 下載Gradle下載不下來&#xff0c;沒有Gradle就無法把項目編譯為Android應用。 二、問題分析 觀察發現下載時長三分鐘&#xff0c;進度條半天沒動&#xff0c;說明這個是國外的東西&#xff0c;被墻住了&#xff0c;需…

系統思考:思考的快與慢

在做重大決策之前&#xff0c;什么原因一定要補充碳水化合物&#xff1f;人類的大腦其實有兩套運作模式&#xff1a;系統1&#xff1a;自動駕駛模式&#xff0c;依賴直覺&#xff0c;反應快但易出錯&#xff1b;系統2&#xff1a;手動駕駛模式&#xff0c;理性嚴謹&#xff0c;…

從情感分析到樸素貝葉斯法:基于樸素貝葉斯的情感分析如何讓DeepSeek賦能你的工作?

文章目錄 1.概率論基礎1.1 單事件概率1.2 多事件概率1.3 條件概率1.3.1 多事件概率與條件概率的區別 1.4 貝葉斯定理傳統思維誤區貝葉斯定理計算 2. 樸素貝葉斯法2.1 基本概念2.2 模型2.3 學習策略2.4 優化算法2.5 優化技巧拉普拉斯平滑對數似然 3. 情感分析實戰3.1 流程3.2 模…

獲取inode的完整路徑包含掛載的路徑

一、背景 在之前的博客 缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里的 2.2.3 一節和 關于inode&#xff0c;dentry結合軟鏈接及硬鏈接的實驗-CSDN博客 里&#xff0c;我們講到了在內核里通過inode獲取inode對應的絕對路徑的方法。對于根目錄下的文件而言&#…

【51單片機】2-6【I/O口】【電動車簡易防盜報警器實現】

1.硬件 51最小系統繼電器模塊震動傳感器模塊433M無線收發模塊 2.軟件 #include "reg52.h" #include<intrins.h> #define J_ON 1 #define J_OFF 0sbit switcher P1^0;//繼電器 sbit D0_ON P1^1;//433M無線收發模塊 sbit D1_OFF P1^2; sbit vibrate …

leetcode二叉樹刷題調試不方便的解決辦法

1. 二叉樹不易構建 在leetcode中刷題時&#xff0c;如果沒有會員就需要將代碼拷貝到本地的編譯器進行調試。但是leetcode中有一類題可謂是毒瘤&#xff0c;那就是二叉樹的題。 要調試二叉樹有關的題需要根據測試用例給出的前序遍歷&#xff0c;自己構建一個二叉樹&#xff0c;…

藍橋杯嵌入式客觀題二

十四屆模擬一 1. 2.串口通信是一種傳輸線按位數據順序傳輸方式 3.USART_SR是屬于STM32微控制器USART的狀態寄存器。 4.STM32G431RBT6是32位的ARM微控制器 ARM處理器是英國ARM公司設計的一種低功耗RISC微處理器 5.中斷配置?EXTI->FTSR&#xff08;下降沿觸發選擇寄存器…

OrangePi入門教程(待更新)

快速上手指南 https://www.hiascend.com/developer/techArticles/20240301-1?envFlag1 教學課程(含開發板配置和推理應用開發) https://www.hiascend.com/developer/devboard 開發推理應用 https://www.hiascend.com/developer/techArticles/20240326-1?envFlag1

王者榮耀的游戲匹配機制

王者榮耀的匹配機制主要基于ELO評分系統&#xff08;隱藏分機制&#xff09;和段位匹配&#xff0c;旨在平衡對局雙方實力&#xff0c;同時通過多種策略控制玩家勝率趨近50%。 一、匹配機制核心 1. ELO評分&#xff08;隱藏分&#xff09; - 系統根據玩家的勝負、KDA、傷害量、…

PPTAgent:一款開源免費生成和評估幻燈片的項目

這篇文章介紹一下PPTAgent&#xff0c;一個從文檔自動生成演示文稿的創新系統。該系統從人類的展示創作方法中汲取靈感&#xff0c;采用兩步流程來確保卓越的整體質量。此外&#xff0c;本文還介紹了PPTEval&#xff0c;這是一個綜合評估框架&#xff0c;可以跨多個維度評估演示…

谷歌開源單個 GPU 可運行的Gemma 3 模型,27B 超越 671B 參數的 DeepSeek

自從 DeepSeek 把訓練成本打下來之后&#xff0c;各個模型廠家現在不再堆參數進行模型的能力對比。而是轉向了訓練成本優化方面&#xff0c;且還要保證模型能力不減反增的效果。包括使用較少的模型參數&#xff0c;降低 GPU 使用數量&#xff0c;降低模型內存占用等等技術手段。…

回歸預測 | Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測

回歸預測 | Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測 目錄 回歸預測 | Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.【JCR一區級】Matlab實現NRBO-Transformer-LSTM多輸入單輸出回歸預測&#xf…

Photoshop 2025 Mac中文Ps圖像編輯

Photoshop 2025 Mac中文Ps圖像編輯 文章目錄 Photoshop 2025 Mac中文Ps圖像編輯一、介紹二、效果三、下載 一、介紹 Adobe Photoshop 2025 Mac版集成了多種強大的圖像編輯、處理和創作功能。①強化了Adobe Sensei AI的應用&#xff0c;通過智能摳圖、自動修復、圖像生成等功能…

7. 記憶(Memory)機制:讓AI擁有“短期記憶”與“長期記憶”

引言&#xff1a;當AI學會"記住你" 2025年某銀行智能客服因無法記住用戶身份&#xff0c;每次對話都要求重復驗證&#xff0c;引發大量投訴。引入LangChain 記憶系統后&#xff0c;客戶滿意度提升62%。本文將基于MemorySaver與FAISS本地存儲&#xff0c;教你構建符合…