RPC框架的實現原理,及RPC架構組件詳解

RPC的由來

隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。

  •  單一應用架構
  •  當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
  •  此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。
  •  垂直應用架構
  •  當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
  •  此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
  •  分佈式服務架構
  •  當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
  •  此時,用於提高業務複用及整合的 分佈式服務框架(RPC),提供統一的服務是關鍵。

例如:各個團隊的服務提供方就不要各自實現一套序列化、反序列化、網絡框架、連接池、收發線程、超時處理、狀態機等“業務之外”的重複技術勞動,造成整體的低效。

所以,統一RPC框架來解決提供統一的服務。

以下我將分別從如下四個方面詳解RPC。

高併發架構系列:RPC框架的實現原理,調用全過程,及RPC架構組件

RPC的實現原理

高併發架構系列:RPC框架的實現原理,調用全過程,及RPC架構組件

也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。

比如說,A服務器想調用B服務器上的一個方法:

Employee getEmployeeByName(String fullName)

整個調用過程,主要經歷如下幾個步驟:

1、建立通信

首先要解決通訊的問題:即A機器想要調用B機器,首先得建立起通信連接。

主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接裏傳輸。連接可以是按需連接,調用結束後就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。

2、服務尋址

要解決尋址的問題,也就是說,A服務器上的應用怎麼告訴底層的RPC框架,如何連接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什麼。

通常情況下我們需要提供B機器(主機名或IP地址)以及特定的端口,然後指定調用的方法或者函數的名稱以及入參出參等信息,這樣才能完成服務的一個調用。

可靠的尋址方式(主要是提供服務的發現)是RPC的實現基石,比如可以採用redis或者zookeeper來註冊服務等等。

高併發架構系列:RPC框架的實現原理,調用全過程,及RPC架構組件

  1.  從服務提供者的角度看:當提供者服務啓動時,需要自動向註冊中心註冊服務;
  2.  當提供者服務停止時,需要向註冊中心註銷服務;
  3.  提供者需要定時向註冊中心發送心跳,一段時間未收到來自提供者的心跳後,認爲提供者已經停止服務,從註冊中心上摘取掉對應的服務。
  4.  從調用者的角度看:調用者啓動時訂閱註冊中心的消息並從註冊中心獲取提供者的地址;
  5.  當有提供者上線或者下線時,註冊中心會告知到調用者;
  6.  調用者下線時,取消訂閱。

3、網絡傳輸

3.1、序列化

當A機器上的應用發起一個RPC調用時,調用方法和其入參等信息需要通過底層的網絡協議如TCP傳輸到B機器,由於網絡協議是基於二進制的,所有我們傳輸的參數數據都需要先進行序列化(Serialize)或者編組(marshal)成二進制的形式才能在網絡中進行傳輸。然後通過尋址操作和網絡傳輸將序列化或者編組之後的二進制數據發送給B機器。

3.2、反序列化

當B機器接收到A機器的應用發來的請求之後,又需要對接收到的參數等信息進行反序列化操作(序列化的逆操作),即將二進制信息恢復爲內存中的表達方式,然後再找到對應的方法(尋址的一部分)進行本地調用(一般是通過生成代理Proxy去調用,
通常會有JDK動態代理、CGLIB動態代理、Javassist生成字節碼技術等),之後得到調用的返回值。

4、服務調用

B機器進行本地調用(通過代理Proxy)之後得到了返回值,此時還需要再把返回值發送回A機器,同樣也需要經過序列化操作,然後再經過網絡傳輸將二進制數據發送回A機器,而當A機器接收到這些返回值之後,則再次進行反序列化操作,恢復爲內存中的表達方式,最後再交給A機器上的應用進行相關處理(一般是業務邏輯處理操作)。

通常,經過以上四個步驟之後,一次完整的RPC調用算是完成了。

PRC架構組件

一個基本的RPC架構裏面應該至少包含以下4個組件:

1、客戶端(Client):服務調用方(服務消費者)

2、客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數數據信息打包成網絡消息,再通過網絡傳輸發送給服務端

3、服務端存根(Server Stub):接收客戶端發送過來的請求消息並進行解包,然後再調用本地服務進行處理

4、服務端(Server):服務的真正提供者

RPC調用過程

高併發架構系列:RPC框架的實現原理,調用全過程,及RPC架構組件

1、服務消費者(client客戶端)通過本地調用的方式調用服務

2、客戶端存根(client stub)接收到調用請求後負責將方法、入參等信息序列化(組裝)成能夠進行網絡傳輸的消息體

3、客戶端存根(client stub)找到遠程的服務地址,並且將消息通過網絡發送給服務端

4、服務端存根(server stub)收到消息後進行解碼(反序列化操作)

5、服務端存根(server stub)根據解碼結果調用本地的服務進行相關處理

6、本地服務執行具體業務邏輯並將處理結果返回給服務端存根(server stub)

7、服務端存根(server stub)將返回結果重新打包成消息(序列化)並通過網絡發送至消費方

8、客戶端存根(client stub)接收到消息,並進行解碼(反序列化)

9、服務消費方得到最終結果

 

原文鏈接:http://youzhixueyuan.com/implementation-principle-of-rpc-framework.html

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