邊學(xué)邊記:RPC框架調(diào)用過程
RPC簡(jiǎn)介
RPC是遠(yuǎn)程過程調(diào)用(Remote Procedure Call)的縮寫形式。它是一種通過網(wǎng)絡(luò)請(qǐng)求遠(yuǎn)程計(jì)算機(jī)程序上的服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議,代碼中不用做額外的編程處理,就像直接調(diào)用本地方法一樣。
RPC框架角色
在RPC框架中有三個(gè)重要的角色:RPC Server、RPC Client和Registry,如下圖所示:

- RPC Server:即Provider,暴露服務(wù)的服務(wù)提供者
- RPC Client:即Consumer,調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)者
- Registry:服務(wù)注冊(cè)與發(fā)現(xiàn)的服務(wù)注冊(cè)中心
RPC核心組件
RPC架構(gòu)包含五個(gè)核心組件,Client,Client Stub,Server,Server Stub,NetWork Service,Stub可以理解為存根。

- Client:客戶端,服務(wù)的調(diào)用方
- Client Stub:客戶端存根,存放服務(wù)端的地址消息,負(fù)責(zé)將客戶端的請(qǐng)求信息組裝成網(wǎng)絡(luò)消息,通過網(wǎng)絡(luò)遠(yuǎn)程發(fā)送給服務(wù)提供方
- Server:服務(wù)端,真正的服務(wù)提供方
- Server Stub:服務(wù)端存根,接收客戶端發(fā)來的消息,并將消息解壓后調(diào)用本地服務(wù)方法
- NetWork Service:底層網(wǎng)絡(luò)傳輸,可以是TCP或HTTP
RPC調(diào)用過程
RPC框架的整體調(diào)用過程,如下圖所示:

- 客戶端Client通過以本地調(diào)用的方式,調(diào)用遠(yuǎn)程接口服務(wù);
- 客戶端存根Client Stub接收到調(diào)用后,將調(diào)用信息對(duì)象進(jìn)行序列化,組裝成網(wǎng)絡(luò)傳輸?shù)亩M(jìn)制消息體;
- 客戶端Client通過Sockets將消息發(fā)送到遠(yuǎn)程服務(wù)端;
- 服務(wù)端存根Server Stub收到消息后,對(duì)網(wǎng)絡(luò)信息對(duì)象進(jìn)行反序列化解碼;
- 服務(wù)端存根Server Stub根據(jù)解碼結(jié)果,調(diào)用服務(wù)端本地的接口服務(wù);
- 本地接口服務(wù)執(zhí)行,并將處理結(jié)果返回給服務(wù)端存根Server Stub;
- 服務(wù)端存根Server Stub將返回結(jié)果對(duì)象進(jìn)行序列化,組裝成消息體;
- 服務(wù)端Server再通過Sockets將消息發(fā)送到客戶端;
- 客戶端存根Client Stub收到結(jié)果消息后,對(duì)網(wǎng)絡(luò)信息對(duì)象進(jìn)行序列化解碼;
- 客戶端Client拿到最終接口處理結(jié)果。
RPC構(gòu)架的目標(biāo)是就是把2、3、4、7、8、9步驟都封裝起來,讓調(diào)用方感覺像是調(diào)用本地方法一樣。

開源的RPC框架
- Dubbo:國(guó)內(nèi)最早開源的 RPC 框架,由阿里巴巴公司開發(fā)并于 2011 年末對(duì)外開源,僅支持 Java 語(yǔ)言
- Spring Cloud:相比Dubbo等RPC框架, Spring Cloud提供全套的分布式系統(tǒng)解決方案
- gRPC:是Google開發(fā)的高性能、通用的開源RPC框架,支持多種語(yǔ)言。