RPC原理解析

原文鏈接:https://www.cnblogs.com/swordfall/p/8683905.html

1.RPC原理解析

1.1 什麼是RPC

RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP/IP或UDP,爲通信程序之間攜帶信息數據。RPC將原來的本地調用轉變爲調用遠端的服務器上的方法,給系統的處理能力和吞吐量帶來了近似於無限制提升的可能。在OSI網絡通信模型中,RPC跨域了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。

1.2 RPC架構

一個完整的RPC架構裏面包含了四個核心的組件,分別是Client,Client Stub,Server以及Server Stub,這個Stub可以理解爲存根。

  • 客戶端(Client),服務的調用方。
  • 客戶端存根(Client Stub),存放服務端的地址消息,再將客戶端的請求參數打包成網絡消息,然後通過網絡遠程發送給服務方。
  • 服務端(Server),真正的服務提供者。
  • 服務端存根(Server Stub),接收客戶端發送過來的消息,將消息解包,並調用本地的方法。

1.3 RPC調用過程

(1) 客戶端(client)以本地調用方式(即以接口的方式)調用服務;

(2) 客戶端存根(client stub)接收到調用後,負責將方法、參數等組裝成能夠進行網絡傳輸的消息體(將消息體對象序列化爲二進制);

(3) 客戶端通過sockets將消息發送到服務端;

(4) 服務端存根( server stub)收到消息後進行解碼(將消息對象反序列化);

(5) 服務端存根( server stub)根據解碼結果調用本地的服務;

(6) 本地服務執行並將結果返回給服務端存根( server stub);

(7) 服務端存根( server stub)將返回結果打包成消息(將結果消息對象序列化);

(8) 服務端(server)通過sockets將消息發送到客戶端;

(9) 客戶端存根(client stub)接收到結果消息,並進行解碼(將結果消息發序列化);

(10) 客戶端(client)得到最終結果。

RPC的目標是要把2、3、4、7、8、9這些步驟都封裝起來。

注意:無論是何種類型的數據,最終都需要轉換成二進制流在網絡上進行傳輸,數據的發送方需要將對象轉換爲二進制流,而數據的接收方則需要把二進制流再恢復爲對象。

2. 自定義RPC框架範例

設計框架視圖如下:

與1.3架構圖相比較,rpc-sample-client相當於client-functions,通過接口方法發起請求;而rpc-client相當於client-stub,負責把方法和參數序列化併發送給查找到的服務器。rpc-server相當於server stub,負責把客戶端發送過來的消息反序列化,並通過反射調用本地服務,再把本地服務返回的結果序列化發送給客戶端;rpc-sample-server則相當於server-functions,提供本地服務並返回得出的結果給rpc-server。rpc-client等待接收rpc-server返回的結果,並將結果反序列化,再把反序列化最終得到的結果返回給rpc-sample-client。

rpc-common提供基於netty的序列化與反序列化方法,並封裝rpc請求和rpc響應,序列化和反序列的對象就是封裝好的RpcRequest和RpcResponse。rpc-registry則是基於zookeeper設計的分佈式服務器動態上下線通知的應用程序,通過rpc-registry可以查找服務器或者註冊服務器,用於均衡負載。

rpc-client與rpc-server之間的通信是基於netty的,netty底層也是sockets設計,但是效率比sockets高。

範例github地址:
https://github.com/qiushangwenyue/CustomRpcFramework.git

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