博客 / 詳情

返回

理解 gRPC 和 RPC 技術原理

一、遠程過程調用協議簡介

1、RPC 的本質

首先,我們探討一下什麼是 RPC。RPC,縮寫為 Remote Procedure Call Protocol,直譯來看就是遠程過程調用協議

講得通俗一些:

  • RPC 是一種通信機制
  • RPC 實現了客户端/服務器通信模型

官方的定義可能會這樣解釋:它是一種協議,可以使程序能在網絡上請求遠程計算機上的服務,而無須關心底層網絡技術細節。

RPC 的構架可以分為三個層次

  • 用户與服務器(負責業務邏輯,並調用本地的存根程序)
  • 存根程序(Stub)(負責封裝和解封裝約定語法和語義)
  • RPC運行時(RPCRuntime)(管理網絡通信的最底層)

下面的示意圖説明了典型的開發情景:前端代碼調用後端服務

RPC 示意圖

2、RPC 解決的核心問題

RPC 的設計解決了幾個關鍵問題:

  • 協議一致性問題: 舉例來説,如何確保前端和後端能夠就“0為是,1為否”的約定達成共識。
  • 傳輸協議的彈性: 當面對網絡錯誤、數據重傳、丟失或性能瓶頸時,RPC 如何應對。
  • 服務的發現機制: 客户端應如何發現可用的服務器服務、訪問哪個端口等。服務器可能會啓動多個遠程調用服務,監聽在隨機端口,客户端需要一種機制來探測這些服務。

3、RPC 的使用場景

兩個經典的應用示例包括:

  • 即時通訊軟件
  • 微服務架構

4、RPC 的工作流程*

從調用到結果接收,RPC 的過程概述如下:

  • 調用方(Client)發起本地調用式的遠程請求;
  • 客户端存根(Client stub)接收請求,將調用的方法名、參數等序列化為可網絡傳輸的消息;
  • 客户端存根發送序列化後的消息給服務端;
  • 服務端存根(Server stub)接受消息並反序列化,以獲取調用的方法名和參數;
  • 服務端存根執行本地調用獲取結果;
  • 服務端返回執行結果給它的存根;
  • 服務端存根序列化執行結果,發送回客户端;
  • 客户端存根反序列化結果,並返回給客户端調用方;
  • 調用方(Client)得到最終的RPC調用執行結果。

5、RPC 與 HTTP 的差異點

RPC 和 HTTP 對比不完全是同等級別的比較,更恰當的是將 RPC 和 "HTTP + RestFul" 放在一起對比。

傳輸協議方面

RPC 不限於 HTTP,它還可以選擇 TCP 進行傳輸,而 HTTP 只工作在自身的協議之上。

傳輸效率方面

RPC 包含了 HTTP2 的特性,使得它在傳輸效率上優於標準的 HTTP1。

性能消耗方面

得益於 HTTP2 的特性(如二進制傳輸、頭部壓縮等),RPC 在性能上的消耗相較於 HTTP1 會更低。

負載均衡方面

大多數 RPC 框架自帶負載均衡策略,而傳統的 HTTP 方案則通常需要通過 Nginx/HAProxy 等工具實現。

服務治理方面

RPC 框架 能實現自動通知和服務調整,而 HTTP 則往往需要手動通知和修改配置。

二、深入瞭解 gRPC

1、gRPC 概述

簡單來説,gRPC 是一個開源的RPC框架,它建立在 HTTP2 的基礎設施之上,因而自然具備了HTTP2 的一系列優勢:

  • 二進制分幀的數據傳輸
  • 多路複用
  • 服務端推送
  • 頭部壓縮

2、gRPC 的通信流程

如下圖所示,通過 gRPC 進行遠程服務調用時,客户端(client)僅需 gRPC 存根,通過 Proto Request 請求 gRPC 服務器,服務器則通過 Proto Response(s) 返回結果。

gRPC 通信流程圖

三、瞭解 JSON-RPC 接口

JSON-RPC 是一種簡潔的使用JSON格式數據的RPC傳輸協議,它通過HTTP進行通信。Postman 是API開發中常用的工具,能夠輕鬆實現 JSON-RPC 接口的測試與使用。

四、如何調試 gRPC

Apifox 提供基於 .proto 文件的 gRPC 接口調試功能,支持包含一元調用和流式調用。項目創建時,選擇「gRPC項目」並導入 .proto 文件,即可開始調試,無需編寫額外代碼。

Apifox gRPC 調試

導入 .proto 文件之前,需要確認是否有其他依賴的.proto文件,並添加相應的依賴路徑。

導入 .proto 文件

一元調用

通過將 gRPC URL 填入地址欄並點擊「調用」按鈕,即可實現一元調用。

一元調用

流式調用

流式調用包括服務端流、客户端流和雙向流。調用成功後,用户可以在消息標籤區編寫併發送消息。Apifox 展示了時間線視圖,按順序分佈顯示調用狀態、發送的消息和收到的消息。點擊具體消息可以方便地查看詳細信息。

流式調用

知識擴展:

  • REST API 簡介 - RESTful Web 服務
  • 分佈式系統框架對比:gRPC vs Dubbo
user avatar tofrankie 頭像 wuyuedexingkong 頭像 tyhan 頭像 daoqiangburudelianou 頭像 feynman9966 頭像
5 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.