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高。