什么是RPC?
RPC(Remote Procedure Call)- 遠(yuǎn)程過(guò)程調(diào)用砸狞。它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)上請(qǐng)求服務(wù)梁只, 而不需要了解底層網(wǎng)絡(luò)協(xié)議的技術(shù)绝淡。也就是說(shuō)兩臺(tái)服務(wù)器A和B, 一個(gè)部署在A服務(wù)器上昌抠, 想要調(diào)用部署在B服務(wù)器上的某個(gè)服務(wù)的某個(gè)方法, 由于不再同一個(gè)內(nèi)存空間轨功, 所以不能直接調(diào)用旭斥,需要通過(guò)網(wǎng)絡(luò)來(lái)表達(dá)調(diào)用的語(yǔ)義和傳輸調(diào)用的數(shù)據(jù)。
RPC協(xié)議假定某些傳輸協(xié)議的存在古涧, 如TCP或UDP, 為通信程序之間攜帶傳輸數(shù)據(jù)垂券。在OSI網(wǎng)絡(luò)通信模型中, RPC協(xié)議跨越了傳輸層和應(yīng)用層羡滑。RPC使得開(kāi)發(fā)網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加方便菇爪。 現(xiàn)在業(yè)界有很多優(yōu)秀的RPC框架,如Spring Cloud, Dubbo, Thrift等柒昏。
RPC起源
RPC這個(gè)概念術(shù)語(yǔ)起源于上個(gè)世紀(jì)80年代凳宙,由Bruce Jay Nelson提出。這里我們追溯一下职祷, 當(dāng)時(shí)開(kāi)發(fā)RPC的原動(dòng)機(jī)是什么氏涩?在Nelson的論文“Implementing Remote Procedure Calls”中他提到 以下幾點(diǎn):
- 簡(jiǎn)單: RPC概念的語(yǔ)義十分清晰和簡(jiǎn)單届囚, 這樣建立分布式計(jì)算程序就更容易。
- 高效: 過(guò)程調(diào)用看起來(lái)非常簡(jiǎn)單和高效削葱。
- 通用: 在單機(jī)計(jì)算中過(guò)程往往是不同算法部分間最重要的通信機(jī)制奖亚。
通俗一點(diǎn)說(shuō), 就是大多數(shù)程序員對(duì)于本地調(diào)用很熟悉析砸, 那我們吧RPC做成和本地調(diào)用完全類似, 就很容易被接受爆袍, 使用起來(lái)毫無(wú)障礙首繁。
RPC結(jié)構(gòu)
Nelson的論文指出實(shí)現(xiàn)RPC的程序包括5個(gè)部分:
- User
- User-stub
- RPCRuntime
- Server-stub
- Server
這里的user是client端, user想發(fā)起一個(gè)遠(yuǎn)程調(diào)用時(shí)陨囊, 實(shí)際時(shí)通過(guò)本地調(diào)用user-stub弦疮。user-stub負(fù)責(zé)將調(diào)用的接口、方法和參數(shù)通過(guò)約定的協(xié)議進(jìn)行編碼并通過(guò)本地的RPCRuntime傳輸給遠(yuǎn)端的實(shí)例蜘醋。 遠(yuǎn)端RPCRuntime收到請(qǐng)求后交給server-stub進(jìn)行解碼后胁塞, 發(fā)起本地端調(diào)用, 調(diào)用結(jié)果再返回給user端压语。
以上是粗粒度的RPC實(shí)現(xiàn)概念結(jié)構(gòu)啸罢, 接下來(lái)我們進(jìn)一步細(xì)化它應(yīng)該由哪些結(jié)構(gòu)組成, 如下圖所示:
RPC服務(wù)方通過(guò)RpcServer去導(dǎo)出(export)遠(yuǎn)程接口方法胎食, 而客戶端通過(guò)RpcClient去導(dǎo)入(import)遠(yuǎn)程接口方法扰才。
RPC客戶端像調(diào)用本地接口方法一樣去調(diào)用遠(yuǎn)程接口方法, RPC框架提供接口的代理實(shí)現(xiàn)厕怜,實(shí)際的調(diào)用將委托給代理RpcProxy衩匣。代理封裝調(diào)用信息并將調(diào)用轉(zhuǎn)交給RpcInvoker去實(shí)際執(zhí)行。在客戶端的RpcInvoker通過(guò)連接器RpcConnector去維持與服務(wù)端的通道RpcChannel粥航, 并使用RpcProtocol執(zhí)行協(xié)議編碼(encode)并將編碼后的請(qǐng)求消息同通過(guò)通道發(fā)送給服務(wù)方琅捏。
RPC服務(wù)端接收器RpcAcceptor接收客戶端的調(diào)用請(qǐng)求,同樣使用RpcProtocol執(zhí)行協(xié)議解碼(decode)递雀。解碼后的調(diào)用信息傳遞給RpcProcessor去控制處理調(diào)用過(guò)程柄延,最后再委托給RpcInvoker去實(shí)際執(zhí)行并返回調(diào)用結(jié)果。如下時(shí)各個(gè)部分的詳細(xì)職責(zé):
1. RpcServer
負(fù)責(zé)導(dǎo)出(export)接口
2. RpcClient
負(fù)責(zé)導(dǎo)入(import)接口
3. RpcProxy
負(fù)責(zé)Rpc的代理實(shí)現(xiàn)
4. RpcInvoker
客戶方實(shí)現(xiàn): 負(fù)責(zé)編碼調(diào)用信息和發(fā)送調(diào)用請(qǐng)求至服務(wù)方并等待調(diào)用結(jié)果返回映之。
服務(wù)方實(shí)現(xiàn): 負(fù)責(zé)調(diào)用服務(wù)方具體的實(shí)現(xiàn)接口并返回調(diào)用結(jié)果
5. RpcProtocol
負(fù)責(zé)協(xié)議編碼/解碼
6. RpcConnector
負(fù)責(zé)維護(hù)客戶端和服務(wù)端的連接通道并將數(shù)據(jù)發(fā)送服務(wù)方
7.RpcAcceptor
負(fù)責(zé)接收客戶端請(qǐng)求并返回調(diào)用結(jié)果
8. RpcProcessor
負(fù)責(zé)在服務(wù)方控制調(diào)用過(guò)程拦焚, 包括管理調(diào)用線程池、超時(shí)時(shí)間等
9. RpcChannel
數(shù)據(jù)傳輸通道
RPC工作原理
RPC的設(shè)計(jì)由Client杠输、 Client stub赎败、Network、Server蠢甲、Server stub等構(gòu)成僵刮。 其中Client就是用來(lái)調(diào)用服務(wù)的, Client stub是用來(lái)把調(diào)用的方法和參數(shù)進(jìn)行序列化的(pack/unpack), Network負(fù)責(zé)再網(wǎng)絡(luò)中傳輸調(diào)用信息和返回結(jié)果搞糕, Server stub負(fù)責(zé)反序列化勇吊, Server就是服務(wù)的提供者,最終調(diào)用的就是Server實(shí)現(xiàn)的方法窍仰。
1汉规、Client像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法
2、Client stub 封裝調(diào)用信息驹吮,并進(jìn)行序列化
3针史、客戶端通過(guò)sockets將序列化后消息發(fā)送給服務(wù)方
4、服務(wù)端通過(guò)sockets接收消息
5碟狞、 Server stub將消息反序列化
6啄枕、 Server stub將消息解碼并調(diào)用本地服務(wù)
7、本地服務(wù)執(zhí)行并將結(jié)果返回給Server stub
8族沃、Server stub將返回結(jié)果封裝并序列化
9频祝、服務(wù)端通過(guò)sockets發(fā)送序列化后結(jié)果
10、客戶端接收消息并交給Client stub反序列化和解碼
11脆淹、客戶端得到最終結(jié)果
RPC調(diào)用分為2種:
1常空、 同步調(diào)用: 客戶方等待調(diào)用執(zhí)行完成并返回調(diào)用結(jié)果
2、 異步調(diào)用: 客戶方調(diào)用完成后不用等待調(diào)用結(jié)果返回未辆, 但客戶方可以通過(guò)回調(diào)通知等方式獲取返回結(jié)果窟绷。如果客戶方不關(guān)系調(diào)用結(jié)果,則會(huì)變成單向調(diào)用咐柜。
RPC能干什么
RPC 的主要功能目標(biāo)是讓構(gòu)建分布式計(jì)算(應(yīng)用)更容易兼蜈,在提供強(qiáng)大的遠(yuǎn)程調(diào)用能力時(shí)不損失本地調(diào)用的語(yǔ)義簡(jiǎn)潔性。為實(shí)現(xiàn)該目標(biāo)拙友,RPC 框架需提供一種透明調(diào)用機(jī)制为狸,讓使用者不必顯式的區(qū)分本地調(diào)用和遠(yuǎn)程調(diào)用,在之前給出的一種實(shí)現(xiàn)結(jié)構(gòu)遗契,基于 stub 的結(jié)構(gòu)來(lái)實(shí)現(xiàn)辐棒。下面我們將具體細(xì)化 stub 結(jié)構(gòu)的實(shí)現(xiàn)。
- 可以做到分布式牍蜂,現(xiàn)代化的微服務(wù)
- 部署靈活
- 解耦服務(wù)
- 擴(kuò)展性強(qiáng)
RPC的目的是讓你在本地調(diào)用遠(yuǎn)程的方法漾根,而對(duì)你來(lái)說(shuō)這個(gè)調(diào)用是透明的,你并不知道這個(gè)調(diào)用的方法是部署哪里鲫竞。通過(guò)RPC能解耦服務(wù)辐怕,這才是使用RPC的真正目的。
總結(jié)
本文講述一些RPC基本原理从绘, 一個(gè)成熟的RPC框架還涉及服務(wù)發(fā)現(xiàn)寄疏、注冊(cè)中心是牢、配置中心、限流陕截、負(fù)載均衡等驳棱。