天天看點

RPC筆記

1、基本定義

RPC(Remote Procedure Call) 即遠端過程調用。主要作用是屏蔽網絡程式設計細節,實作調用遠端方法就像調用本地方法(同一個程序中的方法)一樣的體驗。同時屏蔽底層網絡通信的複雜性,讓我們更加專注業務邏輯的開發。

2、RPC通信

RPC是一個遠端調用,肯定是需要跨伺服器而非本機,是以需要網絡程式設計才能實作,這就帶來了以下幾個問題:

Call ID 映射

在本機的函數調用中,函數體是直接通過函數指針來指定的,當函數調用時,編譯器會自動調用相應的函數指針。

但是在遠端調用中,因為是跨伺服器的,兩個程序的位址空間是完全不一樣的。是以,在RPC中,所有的函數都必須有一個自己的ID,這個ID在所有的程序中都是唯一确定的。

用戶端在遠端調用時,需要帶上這個ID。同時我們需要在用戶端和服務端分别維護一個{ 函數 <-> Call ID}的映射表。 兩端的表可以不需要完全相同,但是相同函數對應的Call ID必須相同。

當用戶端需要遠端調用的時候,就需要查一下此表,查詢出對應的Call ID , 傳輸至服務端,服務端也查詢映射表,來确定用戶端需要調用的函數,最終執行相應的函數代碼。

序列化和反序列化

網絡傳輸的資料必須是二進制資料,但是調用方的請求的出入參數都是對象,對象是不能直接在網絡中傳輸的,必須提前把它轉換成可傳輸的二進制資料,這個過程就叫做“序列化”。

服務端必須要做到的是能夠正确的從網絡傳輸過來的二進制資料中分割出不同的請求,同時根據請求類型和序列化類型,把二進制的資料還原為請求對象,這個過程叫做“反序列化”。

在RPC調用中,對輸入參數對象與傳回值對象進行序列化和反序列化是一個必須的過程。

網絡通信

RPC在大多數情況下,是一個高并發的調用場景,根據系統核心的支援、程式設計語言的支援以及IO模型本身的特點,在RPC架構的實作中,在網絡通信的處理上,大多數會選擇 IO多路複用的方式。