RPC 解析

RPC(Remote Procedure Call,遠程過程調用)是一種讓分布式系統中的服務能夠像調用本地函數一樣調用遠程服務的通信機制。以下是其核心原理、技術實現及組件的詳細解析:


🔧 一、RPC 核心工作原理(10 步全流程)

  1. 客戶端發起調用客戶端調用本地接口(如 userService.getUser(101)),實際調用的是客戶端存根(Client Stub)?的代理方法。
  2. 參數序列化客戶端存根將方法名、參數等序列化為二進制流(如通過 Protobuf、JSON 等協議),生成網絡可傳輸的消息體。
  3. 網絡傳輸序列化后的數據通過 ?TCP/HTTP/HTTP2? 等協議發送至服務端。高性能框架(如 gRPC)采用 HTTP/2 多路復用減少連接開銷。
  4. 服務端接收與反序列化服務端存根(Server Stub)接收請求,?反序列化二進制流,還原為方法名和參數。
  5. 本地方法執行服務端根據方法名反射調用本地實現類,執行業務邏輯(如查詢數據庫)。
  6. 結果序列化服務端存根將返回結果序列化為二進制流。
  7. 響應回傳序列化結果通過網絡返回客戶端。
  8. 客戶端反序列化客戶端存根反序列化響應數據,還原為對象。
  9. 結果返回客戶端存根將結果返回給調用方,完成遠程調用。
客戶端客戶端存根網絡服務端存根服務端調用本地方法序列化參數發送請求傳輸數據反序列化請求調用服務方法返回結果序列化結果發送響應傳輸數據反序列化響應返回結果客戶端客戶端存根網絡服務端存根服務端

?? 二、關鍵技術組件詳解

1. 動態代理
  • 作用:自動生成接口代理類,攔截本地調用并轉發至網絡層。
  • 實現方式
    • JDK 動態代理:基于接口生成代理類(需實現 InvocationHandler)。
    • 字節碼增強(如 Cglib):直接修改字節碼,無需接口。
2. 序列化與反序列化
  • 協議對比

    協議性能可讀性適用場景
    Protobuf★★★高并發微服務(gRPC)
    JSON★☆RESTful API/Web 應用
    Thrift★★☆跨語言系統(Facebook)
  • 優化方向:減少二進制體積、支持復雜數據結構(如 Map)、跨語言兼容性。

3. 網絡通信模型
  • BIO(阻塞IO):簡單但并發能力差,適用于低頻調用。
  • NIO(非阻塞IO):通過 Netty/Mina 實現高并發,采用 Reactor 線程模型處理海量連接。
  • 協議選擇
    • TCP:直接傳輸,高性能(如 Dubbo)。
    • HTTP/2:支持多路復用和頭部壓縮(如 gRPC)。
4. 服務注冊與發現
  • 流程
    1. 服務啟動時向 ZooKeeper/Nacos 注冊 IP 和端口。
    2. 客戶端從注冊中心拉取服務列表,緩存并監聽變更。
    3. 調用時通過負載均衡算法(如輪詢、一致性哈希)選擇節點。
  • 容災機制:心跳檢測自動剔除故障節點,避免請求失敗。
5. 服務治理
  • 熔斷機制
    • 狀態機CLOSEDOPEN(觸發熔斷)→ HALF_OPEN(嘗試恢復)。
    • 觸發條件:錯誤率超閾值(如 50%)或請求超時。
  • 限流算法
    • 滑動窗口:統計單位時間內的請求量(如 Sentinel)。
    • 令牌桶:勻速發放令牌,控制請求速率。
  • 優雅啟動:新節點逐步接收流量,避免冷啟動被壓垮。

🌐 三、RPC 框架核心實現(以 Dubbo/gRPC 為例)

1. 服務端啟動流程
  • 加載 @DubboService 注解,掃描服務接口。
  • 通過 Netty 綁定端口監聽請求。
  • ZooKeeper 注冊服務元數據。
2. 客戶端調用流程
  • 通過 @Reference 注入代理對象。
  • 代理類封裝序列化、網絡通信邏輯。
  • 調用時從注冊中心獲取服務地址,發起請求。
3. 性能優化策略
  • 零拷貝序列化:跳過 JVM 堆內存,直接操作堆外內存(如 Netty 的 ByteBuf)。
  • 線程池隔離:業務邏輯與 IO 操作使用不同線程池,避免阻塞。
  • 鏈路壓縮:HTTP/2 頭部壓縮減少帶寬占用。

?? 四、RPC 與 REST 的深度對比

維度RPCREST
通信效率高(二進制協議 + 長連接)低(文本協議 + 無狀態)
開發成本需預定義 IDL 接口直接使用 HTTP 方法(GET/POST)
調試便利性需專用工具(如 gRPCurl)瀏覽器/Postman 可直接調試
適用場景服務間高頻調用(訂單→支付)對外暴露 API(開放平臺)
跨語言支持強(通過 IDL 生成多語言代碼)依賴 JSON/XML 解析兼

💎 五、總結

RPC 的核心價值在于屏蔽網絡復雜性,通過動態代理、序列化、服務發現等組件,實現“遠程調用本地化”。其高性能特性依賴二進制協議(如 Protobuf)和 NIO 通信(如 Netty),而熔斷、限流等治理能力保障了分布式系統的穩定性。選型建議

  • 微服務集群:gRPC(跨語言)或 Dubbo(Java 生態)。
  • 簡單交互:JSON-RPC(低門檻)。
  • 高并發場景:Thrift(輕量級二進制協議)。

理解 RPC 的底層機制,是構建高效、可靠分布式系統的基石。

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

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

相關文章

wstool的一個完整的工作流解析

moveit的倉庫源碼編譯的時候使用的是wstool來拉取倉庫的所有內容文件,其命令流程如下: wstool init src wstool merge -t src https://raw.githubusercontent.com/moveit/moveit/master/moveit.rosinstall wstool update -t src rosdep install -y --from-paths src…

對數函數分段定點實現

目錄 一、原理介紹 二、代碼實現 三、結果顯示 四、移植到C語言中的應用 4.1. 定義定點數配置和參數 4.2. 實現分段查找函數 4.3. 實現 log10 近似計算函數 4.4. (可選)定點數轉浮點數 一、原理介紹 之前的博文對數函數分段線性實…

qt系統--事件

文章目錄qt系統事件處理鼠標事件鼠標移動事件處理鍵盤事件定時器事件窗口移動和大小改變事件結語很高興和大家見面,給生活加點impetus!!開啟今天的編程之路!! 作者:?( ‘ω’ )?260 我的專欄&#xff1a…

Linux機器可直接使用的自動化編譯文件

還在為了Linux機器上一遍遍輸入編譯指令苦惱嗎?你需要make指令以及自己的makefile文件!在makefile中寫入自己的個性化指令,讓編譯速度飛起,支持多文件編譯一下文件為個人應用,可以直接cp到相應項目的目錄,每…

Linux學習-數據結構(哈希表)

1.哈希表1.哈希算法將數據通過哈希算法映射成一個關鍵值,存放都在同一位置實現數據的高效存儲和查找,將時間復雜度盡可能降低至O(1)2.哈希碰撞多個數據通過哈希算法得到的鍵值相同,稱為產生哈希碰撞3.哈希表構建哈希表…

Google Chrome <139.0.7236.0 UAF漏洞

【高危】Google Chrome <139.0.7236.0 UAF漏洞 漏洞描述 Google Chrome 是美國谷歌&#xff08;Google&#xff09;公司的一款Web瀏覽器。 受影響版本中&#xff0c;OpenscreenSessionHost::ReportAndLogError 方法的參數使用了 std::string_view 類型來接收錯誤消息。當一…

CentOS8 Stream 網卡配置及重啟

在 CentOS 8 Stream 中&#xff0c;網卡配置已由 NetworkManager 管理&#xff0c;傳統的 ifcfg-eth0 文件仍然支持&#xff0c;但推薦使用 nmcli 或 nmtui 工具進行網絡配置和管理。以下是網卡配置及重啟的詳細步驟&#xff1a;1. 查看當前網卡狀態列出所有網卡bash復制nmcli …

SpringMvc的原理深度剖析及源碼解讀

一、springmvc啟動加載流程1、引入spring-web.jar包時&#xff0c;在這個包的META-INF/services/javax.servlet.ServletContainerInitializer文件中定義的加載類SpringServletContainerInitializer,提供給springmvc實現初始化的操作。2、在SpringServletContainerInitializer類…

【ESP32-menuconfig(1) -- Build Type及Bootloader config】

Build Type Bootloader configmenuconfig介紹Build typeCONFIG_APP_BUILD_TYPECONFIG_APP_BUILD_TYPE_PURE_RAM_APPCONFIG_APP_REPRODUCIBLE_BUILDCONFIG_APP_NO_BLOBSCONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERSCONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERSBootloader config…

C++信息學奧賽一本通-第一部分-基礎一-第3章-第1節

C信息學奧賽一本通-第一部分-基礎一-第3章-第1節 2051 偶數 #include <iostream>using namespace std;int main() {int number; cin >> number;if (number % 2 0) {cout << "yes";} }2052 范圍判斷 #include <iostream>using namespace std…

自由學習記錄(79)

PBRBRDF原理&Unity實現深入淺出_嗶哩嗶哩_bilibili 進行改進 一個像素點對應一個范圍內的 一個微表面--一個由無數個起起伏伏的結構組成的物理結構 屏幕上的每一個像素點&#xff0c;在渲染時通常會被視為一個“微表面”的代表 比如在這個圖中&#xff0c;只關心紅色的區…

復雜路況誤報率↓78%!陌訊輕量化模型在車輛違停識別的邊緣計算優化?

一、行業痛點&#xff1a;動態交通場景的識別困境據《2024中國智慧交通白皮書》統計&#xff0c;城市核心路段違停誤報率高達35%&#xff0c;主要源于兩大難點&#xff1a;??短暫停靠干擾??&#xff1a;出租車臨時停靠與違停行為特征重疊??復雜背景干擾??&#xff1a;樹…

大語言模型提示工程與應用:提示詞基礎使用方式

提示詞使用方式 學習目標 在本課程中&#xff0c;我們將學習更多關于提示詞使用方式。 相關知識點 提示詞使用 學習內容 1 提示詞使用 1.1 文本摘要 語言模型最典型的應用場景之一就是文本摘要。我們可以通過以下提示實現基礎摘要功能&#xff1a; 提示: 解釋抗生素是什么回答&…

常見命令-資源查看-iostat命令實踐

文章目錄 系統中未安裝 iostat 命令 1. 監控CPU與磁盤的基礎負載 2. 診斷I/O性能瓶頸 3. 實時監控與動態采樣 4. 特定設備或分區的精細化監控 5. 性能測試與基準數據生成 6. 結合其他工具進行綜合調優 總結 結果輸出速查表 第一部分:CPU統計信息 第二部分:設備/磁盤統計信息(…

WinForm 實戰 (進度條):用 ProgressBar+Timer 打造動態進度展示功能

目錄 核心控件解析? ProgressBar 進度條? Timer 定時器? 實戰案例 常見應用場景? 總結? 在 WinForm 桌面應用開發中&#xff0c;進度反饋是提升用戶體驗的關鍵環節。無論是文件處理、數據加載還是復雜計算&#xff0c;一個直觀的進度條能讓用戶清晰了解任務狀態&…

使用 ast-grep 精準匹配指定類的方法調用(以 Java 為例)

使用 ast-grep 精準匹配指定類的方法調用&#xff08;以 Java 為例&#xff09; 在代碼重構、安全審計或靜態分析的場景中&#xff0c;我們常常需要匹配某個特定類中定義的方法調用。而 ast-grep 作為一款基于語法樹的代碼搜索工具&#xff0c;提供了強大的模式匹配功能&#…

Dijkstra?spfa?SPstra?

帶負權的無負環最短路問題 對于一張有負邊權的圖&#xff0c;普通 Dijkstra 就不能用了&#xff0c;比如&#xff1a;正常的 Dijkstra 擴散的節點依次為 1,3,2,41,3,2,41,3,2,4。 這時候可以發現&#xff0c;當點 222 擴散的時候&#xff0c;原本達到點 333 的路徑長度是 111&a…

React函數組件靈魂搭檔:useEffect深度通關指南!

你以為它只是替代componentDidMount&#xff1f;數據抓取、事件綁定、定時清理...&#xff1f;事實上&#xff0c;useEffect才是函數組件的“幕后操控者”&#xff01;但依賴數組的坑、閉包的陷阱&#xff0c;你真的玩轉了嗎&#xff1f; 告別“能用就行”&#xff0c;今天帶你…

LabVIEW實驗室測試框架

在實驗室測試場景中&#xff0c;選用合適的 LabVIEW 框架能夠極大提升測試效率、優化測試流程并保障測試結果的準確性。介紹幾款常用且功能強大的 LabVIEW 測試框架&#xff1a;?TestStand?框架概述?TestStand 是 NI 公司專為測試系統開發設計的一款測試執行管理框架。它能夠…

Kiro :從“規范”到“實現”的全流程 AI 助手

為什么是 Kiro Kiro 是一款面向“規范驅動開發”&#xff08;Spec-Driven Development&#xff09;的 AI 開發助手。與只在“寫代碼”環節輔助不同&#xff0c;Kiro 將“從需求到設計再到實現”的完整鏈路顯性化&#xff0c;把需求、設計、任務分解、代碼與測試、文檔等全部納…