RPC入門

什么是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使得開發(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í)開發(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è)部分:

  1. User
  2. User-stub
  3. RPCRuntime
  4. Server-stub
  5. Server
image.png

這里的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)組成, 如下圖所示:

image.png

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)的方法。

image.png

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ù)載均衡等。

參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • go rpc 入門 rpc(Romote Procedure Call,遠(yuǎn)程過(guò)程調(diào)用)。相對(duì)應(yīng)的就是本地過(guò)程調(diào)用,...
    _AlphaBaby_閱讀 2,089評(píng)論 0 0
  • RPC框架原理 Remote Procedure Call——遠(yuǎn)程過(guò)程調(diào)用 轉(zhuǎn)載自:https://mp.weix...
    劉敏_15da閱讀 366評(píng)論 0 0
  • 前言 RPC到底是什么?gRPC又是什么》與HTTP直接存在什么關(guān)系? 本文將討論一下RPC相關(guān)的概念并以Pyth...
    Java天天閱讀 689評(píng)論 0 0
  • 背景 最近幾天準(zhǔn)備學(xué)習(xí)thrift,百度百科解釋: Thrift是一種接口描述語(yǔ)言和二進(jìn)制通訊協(xié)議,它被用來(lái)定義和...
    憤怒的老照閱讀 724評(píng)論 0 1
  • RPC 什么是RPC RPC全稱Remote Procedure Call,即遠(yuǎn)程過(guò)程調(diào)用。要理解RPC,首先要...
    Byrondo閱讀 327評(píng)論 0 0

友情鏈接更多精彩內(nèi)容