一.什麼是RPC
RPC(Remote Procedure Call Protocol)遠程過程調用協議(主要基於TCP協議),從一臺客戶端上通過參數傳遞的方式,調用另外一臺服務器提供接口,並返回的結果。
二.RPC架構組件
(1)組件介紹
客戶端(Client):服務調用者(消費者)。
客戶端存根(Client Stub):存放服務器地址信息,將客戶端請求的參數打包成網絡傳輸格式(序列化),再傳輸到服務端。
服務端存根(Server Stub):接收客戶端發送的消息,並進行解包(反序列化),然後調用本地服務進行處理。
服務端(Server):服務的提供者(生產者)。
(2)RPC調用流程
RPC實現將上圖的第2-第10步進行了統一封裝,簡言之,將服務調用,數據序列化/反序列化(編碼/解碼)封裝起來。讓遠程調用就像調用本地服務一樣。
三.RPC涉及的關鍵技術
(1)Call ID映射
在RPC中,所有的方法(函數)都有的一個ID,並且所有進程中是唯一的,在遠程調用時,客戶端必須加上這個ID參數。同時在客戶端和服務端中分別維護一個{函數<->Call ID}對應的表,倆者共有的函數對應的Call ID必須相同。
【Note】當客戶端遠程調用時,通過查表,找出對應的Call ID,然後把它傳給服務端;服務端收到之後,也通過查表,來確定客戶端需要調用的函數,然後執行相應函數的代碼,如下圖。
(2)動態代理
生成的Client Stub和Server Stub時,需要用到動態代理技術調用相關的方法。
(3)序列化和反序列化
在網絡傳輸中,所有的數據(請求和返回的數據),將被轉化爲字節進行傳輸,此時就要進行序列化和反序列化
序列化:把對象轉換爲字節序列的過程稱爲對象的序列化,也是編碼的過程。
反序列化:把字節序列恢復爲對象的過程稱爲對象的反序列化,也是解碼的過程。
(4)網絡傳輸
基於TCP的RPC,是通過socket進行網絡上進行傳輸。網絡傳輸層需要把Call ID和序列化後的參數字節流傳給服務端,然後再把序列化後的調用結果傳回客戶端。
(5)建立通信
A機器想要調用B機器,首先得建立起通信連接。RPC主要是基於TCP協議,建立起主機之間連接。連接可以是按需連接,調用結束後就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。
(6)服務註冊中心
通常使用zookeeper提供服務的註冊和調用,告訴RPC框架服務註冊的地址及端口、方法名;同時它還可以解決單點故障以及分佈式部署的問題。如下圖:
(7)如何實現一個RPC框架,、
其實只需要把以上(1)-(5)實現了,就算基本完成。Call ID映射可以直接使用函數字符串或者整數ID。映射表一般是一個哈希表。序列化反序列化可以自己寫,也可以使用Protobuf、FlatBuffers等。網絡傳輸庫可以自己寫socket,或者用asio,ZeroMQ,Netty之類。
四.常用RPC框架
-
gRPC是Google公佈的開源軟件,基於最新的HTTP2.0協議,並支持常見的衆多編程語言。 我們知道HTTP2.0是基於二進制的HTTP協議升級版本, 這個RPC框架是基於HTTP協議實現的,底層使用到了Netty框架的支持。
-
Dubbo是國內阿里旗下的RPC框架,被廣泛使用。協議和序列化框架都可以插拔是及其鮮明的特色。同樣的遠程接口是基於Java Interface,並且依託於spring框架方便開發。可以方便的打包成單一文件,獨立進程運行,和現在的微服務概念一致。