深入理解RPC

一.什麼是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框架方便開發。可以方便的打包成單一文件,獨立進程運行,和現在的微服務概念一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章