RPC實現原理,怎么跟調用本地一樣

回答1

要讓?絡通信細節對使?者透明,我們需要對通信細節進?封裝,我們先看下?個 RPC 調?的流程涉及到哪些通
信細節:
1. 服務消費?( client )調?以本地調??式調?服務;
2. client stub 接收到調?后負責將?法、參數等組裝成能夠進??絡傳輸的消息體;
3. client stub 找到服務地址,并將消息發送到服務端;
4. server stub 收到消息后進?解碼;
5. server stub 根據解碼結果調?本地的服務;
6. 本地服務執?并將結果返回給 server stub
7. server stub 將返回結果打包成消息并發送?消費?;
8. client stub 接收到消息,并進?解碼;
9. 服務消費?得到最終結果。

chatGpt

RPC(Remote Procedure Call,遠程過程調用)是一種允許程序調用位于不同機器上的函數或方法,就像調用本地函數一樣透明和簡單的通信協議。RPC的實現原理依賴于以下幾個核心要素:

1.?客戶端和服務端的角色

  • 客戶端:發起調用請求的一方,它像調用本地方法一樣發起RPC請求,但該請求實際上會通過網絡發送到遠程服務。
  • 服務端:提供實際服務的一方,接收客戶端請求,處理并返回結果。

2.?透明性:如何像本地調用一樣

RPC的一個關鍵目標是讓遠程調用看起來和本地調用沒有差別。為了實現這種透明性,RPC通常采用了以下技術:

2.1.?代理與存根(Stub)
  • 客戶端存根(Stub):客戶端通過調用存根就像調用本地方法一樣。這些存根充當客戶端與遠程服務之間的代理。存根負責將方法參數打包,并通過網絡發送到遠程服務端,然后返回結果給客戶端。
  • 服務端存根(Skeleton):服務端存根接收遠程調用,將請求解包并調用實際的服務方法,然后將返回結果發送給客戶端。
2.2.?序列化和反序列化
  • 當客戶端調用遠程服務時,它首先將調用的參數和方法信息序列化(例如,轉化成二進制流)。序列化后,數據可以通過網絡傳輸到遠程服務端。
  • 服務端接收到請求后,需要反序列化請求數據,將其還原為可調用的本地方法及參數,之后執行方法,處理結果,并將結果序列化發送回客戶端。
  • 常見的序列化方式包括 JSON、Protocol Buffers、Thrift 等。
2.3.?網絡通信
  • 客戶端和服務端之間的通信通常是通過 TCP、HTTP 或其他協議來實現的。RPC框架提供了網絡層的通信管理,確保請求能夠正確發送到目標機器并返回。

3.?RPC的工作流程

  1. 客戶端調用存根:客戶端調用存根中的方法。此時,客戶端并不知曉該方法是遠程方法,它只是像本地方法一樣進行調用。

  2. 序列化和網絡傳輸:客戶端存根負責將方法的參數序列化為適合網絡傳輸的格式,并通過網絡發送到服務端。該請求通常包括方法名、參數類型和參數值等信息。

  3. 服務端接收請求:服務端通過網絡接收到請求后,服務端的存根將請求反序列化,還原成原始的調用信息,然后找到相應的方法并調用。

  4. 方法執行和返回結果:服務端方法執行完畢后,將結果序列化并發送回客戶端。

  5. 客戶端接收并解包結果:客戶端存根接收到響應數據后,反序列化并將結果返回給客戶端,客戶端就像調用本地方法一樣,直接使用返回結果。

4.?透明性如何實現

要實現透明性,RPC需要確保以下幾點:

  • 接口一致性:客戶端調用的接口與服務端實現的接口一致。客戶端只需關心接口定義,而不需要了解底層的遠程調用機制。
  • 自動化的序列化和反序列化:RPC框架負責在客戶端和服務端之間進行數據的自動序列化與反序列化。客戶端不需要手動處理這些操作。
  • 網絡通信封裝:網絡通信和協議的細節被隱藏,客戶端和服務端的通信是由框架自動管理的,客戶端只需要關注方法調用。

5.?舉例說明:一個簡單的RPC調用流程

以一個常見的 RPC 框架(例如 gRPC)為例,解釋整個過程:

  • 客戶端調用:客戶端調用某個遠程服務的方法 sayHello("Alice")

     

    java

    // 客戶端代碼 HelloRequest request = HelloRequest.newBuilder().setName("Alice").build(); HelloResponse response = blockingStub.sayHello(request); System.out.println(response.getMessage());
  • 序列化請求sayHello("Alice") 方法會被序列化成請求消息并通過網絡發送。

  • 服務端處理:服務端接收到請求后,解包消息,調用實際的 sayHello 方法,然后序列化結果返回。

  • 客戶端接收并解包結果:客戶端接收到響應數據,反序列化并獲取返回的消息,像調用本地方法一樣使用它。

6.?RPC框架的關鍵特性

不同的RPC框架(如gRPC、Apache Thrift、Dubbo等)提供了不同的實現和功能,但它們通常包含以下基本功能:

  • 自動生成代碼:大多數RPC框架都提供IDL(接口定義語言)和工具,通過描述服務接口生成客戶端和服務端的代碼(存根和服務端存根)。
  • 支持多種傳輸協議:如 HTTP、TCP、WebSocket 等。
  • 錯誤處理機制:當遠程調用發生錯誤時,RPC框架會捕獲異常并將其轉化為本地異常,客戶端可以像處理本地異常一樣處理遠程異常。

總結

RPC的核心目標是讓遠程調用盡可能像本地調用一樣透明和簡單。它通過客戶端存根和服務端存根、序列化和反序列化、網絡通信等技術,將復雜的遠程調用過程封裝起來,使得開發人員在編寫代碼時不需要關心網絡、序列化等細節。通過這些機制,RPC能夠實現遠程服務的調用,仿佛調用本地方法一樣。

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

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

相關文章

《C++11》并發庫:簡介與應用

在C11之前,C并沒有提供原生的并發支持。開發者通常需要依賴于操作系統的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方庫(如Boost.Thread)來創建和管理線程。這些方式存在以下幾個問題: …

【記錄52】el-table-column 添加fixed屬性 滾動條無法滑動

問題: el-table-column 添加fixed屬性 滾動條無法滑動 使用element UI組件,用到el-table的el-table-column的fixed屬性時,當滾動條長度小于固定列時,滾動條無法通過鼠標去點擊滑動操作 原因 fixed是用來固定列的屬性,其…

rtthread學習筆記系列-- 22 dataqueue

文章目錄 22 dataqueue https://github.com/wdfk-prog/RT-Thread-Study 22 dataqueue 消息隊列:消息隊列能夠接收來自線程或中斷服務例程中不固定長度的消息,并把消息緩存在自己的內存空間中。其他線程也能夠從消息隊列中讀取相應的消息,而當…

了解Node.js

Node.js是一個基于V8引擎的JavaScript運行時環境,它允許JavaScript代碼在服務器端運行,從而實現后端開發。Node.js的出現,使得前端開發人員可以利用他們已經掌握的JavaScript技能,擴展技能樹并成為全棧開發人員。本文將深入淺出地…

微信小程序在使用頁面棧保存頁面信息時,如何避免數據丟失?

微信小程序在使用頁面棧保存頁面信息時避免數據丟失的方法: 一、使用全局變量存儲關鍵數據: 定義一個全局變量,例如在 app.js 中,用于存儲頁面的重要信息。在頁面的 onHide 或 onUnload 生命周期中,將需要保存的數據…

文件上傳 分片上傳

分片上傳則是將一個大文件分割成多個小塊分別上傳,最后再由服務器合并成完整的文件。這種做法的好處是可以并行處理多個小文件,提高上傳效率;同時,如果某一部分上傳失敗,只需要重傳這一部分,不影響其他部分…

js解決 Number失精度問題

const updatePromises adinfo.rows.map(async item > {const cwf await uniCloud.httpclient.request("https://api.oceanengine.com/open_api/v3.0/project/list/", {method: GET,data: {advertiser_id: item.account_id},// 1. 指定text數據格式dataType: tex…

實力認證 | 海云安入選《信創安全產品及服務購買決策參考》

近日,國內知名安全調研機構GoUpSec發布了2024年中國網絡安全行業《信創安全產品及服務購買決策參考》,報告從產品特點、產品優勢、成功案例、安全策略等維度對各廠商信創安全產品及服務進行調研了解。 海云安憑借AI大模型技術在信創安全領域中的創新應用…

Picocli 命令行框架

官方文檔 https://picocli.info/ 官方提供的快速入門教程 https://picocli.info/quick-guide.html 使用 Picocli 創建命令行應用程序 Picocli 是一個用于構建 Java 命令行應用的強大框架,它簡化了參數解析和幫助消息生成的過程。 下面是如何使用 Picocli 構建簡單命…

windows系統“GameInputRedist.dll”文件丟失或錯誤導致游戲運行異常如何解決?windows系統DLL文件修復方法

GameInputRedist.dll是存放在windows系統中的一個重要dll文件,缺少它可能會造成部分游戲不能正常運行。當你的電腦彈出提示“無法找到GameInputRedist.dll”或“計算機缺少GameInputRedist.dll”等錯誤問題,請不用擔心,我們將深入解析DLL文件…

M4Pro安裝homebrew并基于homebrew安裝MySQL踩坑記錄

系統偏好設置允許安裝任何來源應用:sudo spctl --master-disable 清除提示已損壞軟件的安全隔離,重新安裝: xattr -cr 空格+App路徑 安裝homebrew: /opt/homebrew/Cellar 安裝包目錄 /opt/homebrew/etc 默認運行目…

tmux 中鼠標滾動異常:^[[A和^[[B是什么以及如何解決

tmux 中鼠標滾動異常問題及解決方案 在使用 tmux 時,有時我們會遇到一個現象:當嘗試使用鼠標滾輪滾動窗口內容時,終端中會出現一串類似 ^[[A^[[A 的字符。這讓人困惑,不知道鼠標滾動為什么不起作用,也不清楚這些字符究…

【Vue】mouted、created、computed區別

mouted、created、computed區別 前端vue重構 — computed、watch、組件通信等常用知識整理 created和mouted都是vue生命周期中的鉤子函數,通常用來做一些初始化的工作,比如發送http請求、對組件綁定自定義事件 created:實例創建完后立即調用…

前端如何設計一個回溯用戶操作的方案

同一個項目,為什么我本地無法復現,只有客戶的設備才復現? 如何獲取用戶的操作路徑呢? 兩種方案:埋點和rrweb 埋點就很簡單了,將所有可能操作的節點都進行預埋數據;但埋點簡單并不省心&#xff…

概率論考前一天

判斷是不是分布函數:單調不減,右連續,F負無窮為0, F正無窮為1 判斷是不是密度函數:非負性(函數任意地方都大于0),規范:積分為1

2Hive表類型

2Hive表類型 1 Hive 數據類型2 Hive 內部表3 Hive 外部表4 Hive 分區表5 Hive 分桶表6 Hive 視圖 1 Hive 數據類型 Hive的基本數據類型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE&a…

FPGA工程師成長四階段

朋友,你有入行三年、五年、十年的職業規劃嗎?你知道你所做的崗位未來該如何成長嗎? FPGA行業的發展近幾年是蓬勃發展,有越來越多的人才想要或已經踏進了FPGA行業的大門。很多同學在入行FPGA之前,都會抱著滿腹對職業發…

springCloudGateway+nacos自定義負載均衡-通過IP隔離開發環境

先說一下想法,小公司開發項目,參考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注冊中心,有多個模塊(每個模塊都是一個服務)。 想本地開發,…

深度解析 React 中 setState 的原理:同步與異步的交織

在 React 框架的核心機制里,setState是實現動態交互與數據驅動視圖更新的關鍵樞紐。深入理解setState的工作原理,尤其是其同步與異步的特性,對于編寫高效、穩定且可預測的 React 應用至關重要。 一、setState 的基礎認知 在 React 組件中&a…

向量數據庫如何助力Text2SQL處理高基數類別數據

01. 導語 Agent工作流和 LLMs (大語言模型)的出現,讓我們能夠以自然語言交互的模式執行復雜的SQL查詢,并徹底改變Text2SQL系統的運行方式。其典型代表是如何處理High-Cardinality Categorical Data (高基數類別數據&am…