RPC入門(mén)

什么是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è)部分:

  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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市农曲,隨后出現(xiàn)的幾起案子社搅,更是在濱河造成了極大的恐慌,老刑警劉巖乳规,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罚渐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驯妄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)合砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)青扔,“玉大人,你說(shuō)我怎么就攤上這事翩伪∥⒉” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缘屹,是天一觀的道長(zhǎng)凛剥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)轻姿,這世上最難降的妖魔是什么犁珠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮互亮,結(jié)果婚禮上犁享,老公的妹妹穿的比我還像新娘。我一直安慰自己豹休,他們只是感情好炊昆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著威根,像睡著了一般凤巨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洛搀,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天敢茁,我揣著相機(jī)與錄音,去河邊找鬼姥卢。 笑死卷要,一個(gè)胖子當(dāng)著我的面吹牛渣聚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播僧叉,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼奕枝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瓶堕?” 一聲冷哼從身側(cè)響起隘道,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎郎笆,沒(méi)想到半個(gè)月后谭梗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宛蚓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年激捏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凄吏。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡远舅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痕钢,到底是詐尸還是另有隱情图柏,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布任连,位于F島的核電站蚤吹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏随抠。R本人自食惡果不足惜裁着,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暮刃。 院中可真熱鬧跨算,春花似錦、人聲如沸椭懊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氧猬。三九已至背犯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盅抚,已是汗流浹背漠魏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妄均,地道東北人柱锹。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓哪自,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親禁熏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壤巷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

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