Nacos-5--Nacos2.x版本的通信原理

Nacos 2.x引入了gRPC作為其主要的通信協議取代1.x版本中的HTTP長輪詢和UDP通信方式,顯著提升了性能、實時性和穩定性。gRPC是一個高性能、開源的遠程過程調用(RPC)框架,它基于HTTP/2標準設計,并使用Protocol Buffers作為接口定義語言(IDL)和消息交換格式。

1、gRPC的核心作用

gRPC是一個高性能的遠程過程調用(RPC)框架,基于HTTP/2協議,支持雙向流通信

Nacos 2.x使用gRPC的特性:

  • 長連接:客戶端與服務端保持持久連接,無需頻繁建立和銷毀連接。
  • 雙向流通信:支持服務端主動推送數據(如配置變更、服務注冊/注銷事件)
  • 高效的序列化:使用Protocol Buffers(Protobuf)作為默認數據序列化格式,減少傳輸數據量。

2、gRPC在Nacos 2.x中的應用

1、服務注冊與發現

  • 服務發現:在Nacos 2.x中,客戶端和服務端之間的服務注冊、服務發現等操作都通過gRPC進行通信。這不僅提高了通信效率,還增強了數據傳輸的安全性。
    • 客戶端通過gRPC長連接向服務端注冊實例信息。
  • 服務端實時推送服務實例的變更(新增、下線)。

2、配置管理

  • 客戶端通過gRPC長連接監聽配置變更,服務端主動推送新配置。

3、健康檢查

  • 客戶端定期發送心跳包,服務端實時監控實例健康狀態。

3、gRPC的特點和優勢

1、Protocol Buffers

  • Nacos使用Protocol Buffers(簡稱Protobuf)來定義服務接口和消息格式。Protobuf提供了一種語言中立、平臺無關的方式來序列化結構化數據,使得不同編程語言編寫的客戶端和服務端能夠高效地進行數據交換。
  • 定義的服務接口文件通常以.proto結尾,這些文件會被編譯成多種編程語言的代碼,以便在不同的環境中使用。

2、雙向流式通信

  • gRPC支持四種類型的RPC方法:簡單RPC、服務器流式RPC、客戶端流式RPC和雙向流式RPC。Nacos主要利用了雙向流式RPC,允許客戶端和服務端同時發送消息給對方。
  • 在服務發現場景下,客戶端可以通過雙向流式RPC向服務端發送心跳包以及訂閱請求,而服務端則可以實時推送服務實例的變化給客戶端。

3、安全性和可靠性

  • TLS/SSL支持:gRPC原生支持通過TLS/SSL加密通信,確保了數據傳輸的安全性。
  • 負載均衡和故障轉移:gRPC的設計考慮了分布式系統的需求,提供了良好的負載均衡機制和故障轉移策略,增強了系統的可靠性和可用性。

4、性能優化

  • HTTP/2:gRPC基于HTTP/2協議構建,利用了HTTP/2的多路復用、頭部壓縮等功能,減少了網絡延遲,提升了通信效率。
  • 高效的序列化/反序列化:相比于JSON或XML,Protobuf提供了更緊湊的數據表示形式,減少了數據傳輸量,加快了序列化和反序列化的速度。

4、gRPC的核心實現細節

1、服務端gRPC的啟動與監聽

Nacos 2.x的gRPC服務端基于Netty實現,核心流程如下。
1、初始化gRPC服務

  • 服務端啟動時,通過GrpcServer初始化gRPC服務,綁定端口(默認9848)。
  • 注冊服務處理邏輯(如ServiceRequestHandler、ConfigRequestHandler)。
    2、雙向流通信
  • 服務端通過BidiStreamingCall(雙向流)接收客戶端請求,并處理服務注冊、配置監聽等操作。
  • 服務端維護客戶端連接狀態,支持主動推送數據(如配置變更事件)。

2、客戶端gRPC連接的建立

1、初始化gRPC客戶端

  • 客戶端通過NamingGrpcClientProxy初始化gRPC連接。
  • 解析Nacos服務端地址(支持DNS解析和負載均衡),選擇一個IP建立連接。
    2、建立長連接
  • 客戶端通過ManagedChannel建立與服務端的持久連接。
  • 使用keepAlive機制維持連接(默認心跳間隔5秒)。

3、服務注冊的流程

1、客戶端發起注冊

  • 客戶端調用registerService方法,將實例信息(IP、端口、元數據等)封裝為gRPC請求。
  • 請求通過雙向流發送到服務端。
    2、服務端處理注冊
  • 服務端接收到注冊請求后,將實例信息存儲到注冊表(單層Map結構)。
  • 觸發ServiceChangeEvent事件,通知其他模塊(如訂閱者、健康檢查模塊)。
    3、注冊補償機制
  • 客戶端本地緩存注冊狀態,若注冊失敗,定時重試(通過redoService機制)。

4、心跳與連接管理

1、客戶端心跳發送

  • 客戶端通過后臺線程定期發送心跳包(ClientBeatRequest)到服務端。
  • 心跳間隔默認5秒,超時時間默認15秒。
    2、服務端心跳處理
  • 服務端接收到心跳后,更新實例的最后心跳時間。
  • 若實例未在超時時間內發送心跳,標記為不健康并觸發下線邏輯。
    3、斷線重連
  • 客戶端檢測到連接斷開時,觸發重連邏輯:
    • 從服務端地址列表中選擇下一個IP重新建立連接。
    • 重連成功后重新注冊實例并重新訂閱配置。

5、服務端推送機制

1、事件驅動模型

  • Nacos 2.x大量使用事件驅動機制,例如:
    • ServiceChangeEvent:服務實例變更時觸發。
    • ConfigChangeEvent:配置變更時觸發。
  • 事件發布后,通過監聽器(Listener)處理后續邏輯(如推送數據到客戶端)。
    2、數據推送
  • 服務端通過gRPC雙向流主動推送數據到客戶端:
    • 服務實例變更時,發送ServicePushResponse。
    • 配置變更時,發送ConfigPushResponse。

5、數據模型與注冊表優化

1、輕量化的注冊表

  • Nacos 2.x的注冊表從1.x的雙重Map結構(Map<Service, Map<Instance, Metadata>>)簡化為單層Map(Map<InstanceId, Instance>)。
  • 服務端僅記錄客戶端連接ID與實例的映射關系,減少內存開銷。
    2、Client數據結構
  • 每個客戶端連接對應一個Client對象,存儲該客戶端發布的服務和訂閱的服務。
  • 通過Client對象實現服務訂閱的精準推送。

6、性能與穩定性提升

1、性能對比

  • gRPC長連接替代了HTTP長輪詢,減少頻繁的連接建立和銷毀。
  • 實測性能提升9倍以上(Nacos官方數據)。
    2、穩定性增強
  • 服務端快速感知客戶端斷開(通過心跳機制)。
  • 客戶端自動重連和注冊補償機制,確保服務一致性。

7、典型源碼解析

1、服務端處理注冊的邏輯

// 服務端處理注冊請求的核心代碼
public class InstanceRequestHandler implements RequestHandler<InstanceRequest, Response> {@Overridepublic Response handle(InstanceRequest request, RequestMeta meta) {String serviceName = request.getServiceName();String groupName = request.getGroupName();Instance instance = request.getInstance();// 將實例信息存儲到注冊表registerInstance(serviceName, groupName, instance);// 觸發服務變更事件NotifyCenter.publishEvent(new ServiceChangeEvent(serviceName, groupName));return Response.newBuilder().setSuccess(true).build();}
}

2、客戶端心跳發送邏輯

// 客戶端心跳發送的線程
public class ClientBeatTask implements Runnable {private final GrpcClient client;public void run() {while (!stopped) {try {// 構造心跳請求ClientBeatRequest request = ClientBeatRequest.newBuilder().setClientId(client.getId()).build();// 發送心跳client.send(request);// 等待下一次心跳間隔Thread.sleep(5000);} catch (Exception e) {// 觸發斷線重連client.reconnect();}}}
}

8、與Nacos 1.x的對比

在這里插入圖片描述

9、總結

Nacos 2.x的gRPC實現通過長連接、雙向流通信、事件驅動模型和輕量化的注冊表,解決了1.x版本中HTTP長輪詢的性能瓶頸和實時性問題。
其核心優勢包括:

  • 高性能:減少連接開銷,支持大規模客戶端連接。
  • 實時性:服務端主動推送變更,降低延遲。
  • 穩定性:心跳機制和斷線重連保障連接可靠性。

通過gRPC的升級,Nacos 2.x成為了更適合云原生和微服務架構的注冊中心和配置中心。

向陽前行,Dare To Be!!!

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

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

相關文章

如何以開發者的身份開發出比python更好的應用軟件?

作為一名擁有多年軟件架構經驗的開發者,我見證了Python從實驗室腳本語言成長為數字時代基礎設施的完整歷程。2008年我參與歐洲核子研究中心的粒子數據分析系統時,Python還是輔助工具,而今天它已成為驅動LIGO引力波探測的核心引擎——這種躍遷絕非偶然。 一、Python的巔峰應…

zynq代辦事項

測試verilog按鍵 1.0 按鍵->隊列->串口 1.1 按鍵模塊ming_key包括 按下,松開,單擊,雙擊,長按,事件 1.2 隊列模塊ming_fifo存儲按鍵發出的[事件和事件戳] 1.3 頂層模塊TOP 輪詢 ming_fifo,將讀到的事件用串口封裝成數據包發給串口助手 測試zynq的M_AXI_GP0 1.0 用axi_li…

【Redis】Redis典型應用——緩存

目錄 一.什么是緩存 二.使用Redis作為緩存 2.1.關系型數據庫的缺點 2.2.使用Redis作為MySQL的緩存 三. 緩存更新策略:識別熱點數據 3.1.定期更新 3.2.實時生成 四.緩存的使用注意事項 4.1.緩存預熱(Cache preheating) 4.2.關于緩存穿透 (Cache penetration) 4.3..關…

C#控制臺項目,鼠標點擊后線程會暫停

C#控制臺應用程序&#xff0c;點擊后就會暫停運行&#xff0c;但是我想讓它運行不受鼠標點擊的影響。 下面是程序演示&#xff1a;class Program{static void Main(string[] args){Console.WriteLine("Hello");int index 0;while(true){Console.WriteLine($"in…

云計算-實戰 OpenStack 私有云運維:服務部署、安全加固、性能優化、從服務部署到性能調優(含數據庫、內核、組件優化)全流程

簡介 此次圍繞OpenStack 私有云平臺的運維與開發展開,涵蓋了從核心服務安裝到深度優化的全流程實戰內容。文中詳細介紹了 OpenStack 各關鍵組件(如 Keystone、Glance、Nova、Neutron、Cinder 等)的安裝部署方法,包括使用腳本快速搭建服務、創建用戶、上傳鏡像、配置網絡等…

流水的 AI,鐵打的騰訊

騰訊 昨天騰訊公布了 2025 年第二季度的業績報告。 就還是那只鵝&#xff0c;就還是那個超預期。 總營收 1845 億&#xff0c;同比增長 15%&#xff1b;凈利潤 556.3 億&#xff0c;同比增長 17%&#xff1b;經營利潤 692.5 億&#xff0c;同比增長 18%。 這里面最炸裂的&#…

再回C的進制轉換--負數

概念 負數在計算機中以補碼的形式保存&#xff0c;以int類型的-15為例&#xff0c;求補碼先對-15取絕對值&#xff0c;然后對其按位取反(得到反碼)&#xff0c;然后加1&#xff0c;就可以得到其的補碼。 二進制的補碼 -15 (取絕對值)–> 15 --> (十六進制表示)0x000f (按…

項目績效域-筆記

一、項目管理績效域 1. 價值驅動的項目管理知識體系 1&#xff09;體系構成要素 核心轉變&#xff1a;從預測型生命周期&#xff08;計劃驅動&#xff09;轉向價值驅動體系&#xff0c;融合預測型和敏捷方法組成要素&#xff1a; 12個項目管理原則&#xff08;基礎&#xff09;…

怎么判斷晶振的好壞,有什么簡單的辦法

今天來聊聊晶振的好壞判斷方法&#xff0c;3個步驟輕松搞定。外觀檢查&#xff1a;先看臉&#xff0c;再看腳晶振體積雖小&#xff0c;但問題往往寫在“臉上”。第一步&#xff0c;用肉眼觀察&#xff1a;裂痕與破損&#xff1a;晶振表面如果有明顯裂紋或缺口&#xff0c;大概率…

mac下載maven并配置,以及idea配置

文章目錄下載配置settingsidea配置下載 https://maven.apache.org/download.cgi 我下的3.6.3 https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/ 配置 open ~/.zprofile添加&#xff0c;根據自己安裝路徑修改 export MAVEN_HOME/Users/xxx/tools/apache-mave…

基于機器視覺的車道線檢測與跟蹤關鍵技術研究

摘 要 隨著自動駕駛技術的迅速發展&#xff0c;車道線檢測與跟蹤技術在提高道路安全性和駕駛自動化水平方面發揮著至關重要的作用。本文針對基于機器視覺的車道線檢測與跟蹤關鍵技術進行了深入研究&#xff0c;旨在提升車道線檢測的準確性與系統的實時響應能力。通過采用先進的…

flutter 跨平臺編碼庫 protobuf 工具使用

1 安裝依賴 dependencies:protobuf: ^3.1.0 # 或最新版本flutter pub get安裝成功之后 1 lib 下創建文件夾 testProto 2 創建文件Student.proto 文件Student.proto 文件內容 syntax "proto3"; package example2;//導入其它proto文件 import "testProto/user.…

【網絡】網絡模型總結復盤

1.OSI七層模型是什么&#xff1f;答&#xff1a;是網絡通信分層模型&#xff0c;規范不同設備的通信流程應用層 如HTTP FTP文件傳輸 DNS域名解析 SSH遠程登錄 為用戶提高服務表示層 對數據進行格式轉換加密 如TLS/SSL會話層 負責建立會話 管理和終止會話傳輸層 提高數據的安全問…

vscode的ws環境,esp32s3連接wifi

注意大小寫&#xff0c;wsl&#xff08;也就是linux環境&#xff09;嚴格區分大小寫。有幫助記得訂閱專欄點贊&#xff0c;當前不定期持續更新。 一、文件夾格式 oled1/ # 項目根目錄 ├─ main/ # 主程序文件夾 │ ├─ main.c …

面試題:如何用Flink實時計算QPS

Flink 實時計算 QPS 面試題題目&#xff1a; 假設某互聯網應用日活用戶 100 萬&#xff0c;每天產生 1 億條數據&#xff08;日志/事件&#xff09;&#xff0c;要求使用 Apache Flink 實現實時計算系統的 QPS&#xff08;Queries Per Second&#xff09;&#xff0c;并考慮以下…

Pytest項目_day12(yield、fixture的優先順序)

yield yield可以用作fixture的后置操作 yield的執行位置和scope的范圍設置有關 當我們將scope設置為function時&#xff0c;yield就會在方法結束時執行yield后的代碼yield還可以返回數據&#xff0c;類似于return&#xff0c;不過yield之后的代碼會執行&#xff0c;而return不會…

面試實戰 問題三十二 Java中創建對象的幾種方式

Java中創建對象的幾種方式 在Java中&#xff0c;創建對象是面向對象編程的核心操作。對象創建不僅涉及直接實例化&#xff0c;還包括通過設計模式、反射機制等間接方式來實現。以下我將逐步解釋Java中常見的對象創建方式&#xff0c;每種方式都基于Java語言規范和相關設計原則。…

ToDesk云電腦 vs 順網云 vs 海馬云:誰才是5090顯卡云電腦的真王者?

文章目錄一、引言二、產品介紹三、硬件配置對比3.1 處理器3.2 顯卡四、云電腦性能實測對比4.1 網絡優化4.1.1 海馬云4.1.2 ToDesk云電腦4.1.3 順網云4.2 魯大師硬件測評4.3 3DMark4.4 系統穩定性測試4.4.1 海馬云4.4.2 順網云4.4.3 ToDesk云電腦4.5 為什么這么看重平臺優化&…

.NET 在鴻蒙系統(HarmonyOS Next)上的適配探索與實踐

目錄 1. 前言 2. 項目狀態 3. 運行時環境選擇 4. NativeAOT 適配原理 4.1 底層兼容性 4.2 技術實現方案 5. 已知問題及解決方案 5.1 syscall 限制&#xff08;已解決&#xff09; 5.2 mmap 申請虛擬內存過大&#xff08;已解決&#xff09; 5.3 第三方庫缺失問題&…

圖像處理--圖像模板匹配NCC算法-->Fast NCC算法的解讀

目錄 前言 一、基礎知識 二、NCC基本公式以及解決問題 1. NCC基本公式 2. 基本公式解讀 三、簡化分母 fuv 1. 要簡化的分母 2. 積分圖 3. 分母拆開化簡 四、簡化分子 1. 要簡化的分子 2. 模板函數的近似 3. 基函數簡單解釋 五、Fast NCC歸一化互相關值 1. 最終公…