天天看點

分布式基礎-RPC

RPC 是什麼?

RPC 的全稱是 Remote Procedure Call 是一種程序間通信方式。它允許程式調用另一個位址空間(通常是共享網絡的另一台機器上)的過程或函數,而不用程式員顯式編碼這個遠端調用的細節。即程式員無論是調用本地的還是遠端的,本質上編寫的調用代碼基本相同。

RPC結構

RPC 這個概念術語在上世紀 80 年代由 Bruce Jay Nelson 提出,參考他的論文​​Implementing Remote Procedure Calls​​。

Nelson 的論文中指出實作 RPC 的程式包括 5 個部分:

  • User
  • User-stub
  • RPCRuntime
  • Server-stub
  • Server

這 5 個部分的關系如下圖所示

分布式基礎-RPC

這裡 user 就是 client 端,當 user 想發起一個遠端調用時,它實際是通過本地調用 user-stub。user-stub 負責将調用的接口、方法和參數通過約定的協定規範進行編碼并通過本地的 RPCRuntime 執行個體傳輸到遠端的執行個體。遠端 RPCRuntime 執行個體收到請求後交給 server-stub 進行解碼後發起本地端調用,調用結果再傳回給 user 端。

RPC 調用分類

RPC 調用分以下兩種:

  • 同步調用:客戶方等待調用執行完成并傳回結果。
  • 異步調用:客戶方調用後不用等待執行結果傳回,但依然可以通過回調通知等方式擷取傳回結果。若客戶方不關心調用傳回結果,則變成單向異步調用,單向調用不用傳回結果。

異步和同步的區分在于是否等待服務端執行完成并傳回結果。

RPC 結構拆解

rpc的詳細元件如下:

分布式基礎-RPC

RPC 服務方通過 RpcServer 去導出(export)遠端接口方法,而客戶方通過 RpcClient 去引入(import)遠端接口方法。客戶方像調用本地方法一樣去調用遠端接口方法,RPC 架構提供接口的代理實作,實際的調用将委托給代理RpcProxy 。代理封裝調用資訊并将調用轉交給RpcInvoker 去實際執行。在用戶端的RpcInvoker 通過連接配接器RpcConnector 去維持與服務端的通道RpcChannel,并使用RpcProtocol 執行協定編碼(encode)并将編碼後的請求消息通過通道發送給服務方。

RPC 元件職責

  • RpcServer:負責導出(export)遠端接口
  • RpcClient:負責導入(import)遠端接口的代理實作
  • RpcProxy:遠端接口的代理實作
  • RpcInvoker:客戶方實作:負責編碼調用資訊和發送調用請求到服務方并等待調用結果傳回;服務方實作:負責調用服務端接口的具體實作并傳回調用結果
  • RpcProtocol:負責協定編/解碼
  • RpcConnector:負責維持客戶方和服務方的連接配接通道和發送資料到服務方
  • RpcAcceptor:負責接收客戶方請求并傳回請求結果
  • RpcProcessor:負責在服務方控制調用過程,包括管理調用線程池、逾時時間等
  • RpcChannel:資料傳輸通道

總結

繼續閱讀