從無到有RPC框架 - RPC原理及實(shí)現(xiàn)(文末還有開源的優(yōu)秀RPC框架)

RPC概述

RPC(Remote Procedure Call)即遠(yuǎn)程過程調(diào)用奏候,允許一臺(tái)計(jì)算機(jī)調(diào)用另一臺(tái)計(jì)算機(jī)上的程序得到結(jié)果,而代碼中不需要做額外的編程畔规,就像在本地調(diào)用一樣译株。

現(xiàn)在互聯(lián)網(wǎng)應(yīng)用的量級(jí)越來越大吉执,單臺(tái)計(jì)算機(jī)的能力有限,需要借助可擴(kuò)展的計(jì)算機(jī)集群來完成牲尺,分布式的應(yīng)用可以借助RPC來完成機(jī)器之間的調(diào)用卵酪。

RPC框架原理

在RPC框架中主要有三個(gè)角色:Provider、Consumer和Registry谤碳。如下圖所示:

節(jié)點(diǎn)角色說明:

* Server: 暴露服務(wù)的服務(wù)提供方溃卡。

* Client: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。

* Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心蜒简。

RPC調(diào)用流程

RPC基本流程圖:

一次完整的RPC調(diào)用流程(同步調(diào)用瘸羡,異步另說)如下:

1)服務(wù)消費(fèi)方(client)調(diào)用以本地調(diào)用方式調(diào)用服務(wù);

2)client stub接收到調(diào)用后負(fù)責(zé)將方法搓茬、參數(shù)等組裝成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw犹赖;

3)client stub找到服務(wù)地址,并將消息發(fā)送到服務(wù)端卷仑;

4)server stub收到消息后進(jìn)行解碼峻村;

5)server stub根據(jù)解碼結(jié)果調(diào)用本地的服務(wù);

6)本地服務(wù)執(zhí)行并將結(jié)果返回給server stub系枪;

7)server stub將返回結(jié)果打包成消息并發(fā)送至消費(fèi)方雀哨;

8)client stub接收到消息,并進(jìn)行解碼;

9)服務(wù)消費(fèi)方得到最終結(jié)果雾棺。

RPC框架的目標(biāo)就是要2~8這些步驟都封裝起來膊夹,讓用戶對(duì)這些細(xì)節(jié)透明。

服務(wù)注冊(cè)&發(fā)現(xiàn)

服務(wù)提供者啟動(dòng)后主動(dòng)向注冊(cè)中心注冊(cè)機(jī)器ip捌浩、port以及提供的服務(wù)列表放刨;

服務(wù)消費(fèi)者啟動(dòng)時(shí)向注冊(cè)中心獲取服務(wù)提供方地址列表,可實(shí)現(xiàn)軟負(fù)載均衡和Failover尸饺;

使用到的技術(shù)

1进统、動(dòng)態(tài)代理

生成 client stub和server stub需要用到 Java 動(dòng)態(tài)代理技術(shù) ,我們可以使用JDK原生的動(dòng)態(tài)代理機(jī)制浪听,可以使用一些開源字節(jié)碼工具框架 如:CgLib螟碎、Javassist等。

2迹栓、序列化

為了能在網(wǎng)絡(luò)上傳輸和接收 Java對(duì)象掉分,我們需要對(duì)它進(jìn)行 序列化和反序列化操作。

* 序列化:將Java對(duì)象轉(zhuǎn)換成byte[]的過程克伊,也就是編碼的過程酥郭;

* 反序列化:將byte[]轉(zhuǎn)換成Java對(duì)象的過程;

可以使用Java原生的序列化機(jī)制愿吹,但是效率非常低不从,推薦使用一些開源的、成熟的序列化技術(shù)犁跪,例如:protobuf椿息、Thrift、hessian耘拇、Kryo撵颊、Msgpack

關(guān)于序列化工具性能比較可以參考:jvm-serializers

3、NIO

當(dāng)前很多RPC框架都直接基于netty這一IO通信框架惫叛,比如阿里巴巴的HSF倡勇、dubbo,Hadoop Avro嘉涌,推薦使用Netty 作為底層通信框架妻熊。

4、服務(wù)注冊(cè)中心

可選技術(shù):

* Redis

* Zookeeper

* Consul

* Etcd

編程實(shí)踐

本人基于 Netty4 + Zookeeper + protostuff + Spring 實(shí)現(xiàn)了一個(gè)簡(jiǎn)單仑最、高效的RPC框架Mango:https://github.com/TiFG/mango扔役,歡迎大家fork/star。

開源的優(yōu)秀RPC框架

阿里巴巴 Dubbo:https://github.com/alibaba/dubbo

新浪微博 Motan:https://github.com/weibocom/motan

gRPC:https://github.com/grpc/grpc

rpcx :https://github.com/smallnest/rpcx

Apache Thrift :https://thrift.apache.org/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末警医,一起剝皮案震驚了整個(gè)濱河市亿胸,隨后出現(xiàn)的幾起案子坯钦,更是在濱河造成了極大的恐慌,老刑警劉巖侈玄,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婉刀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡序仙,警方通過查閱死者的電腦和手機(jī)突颊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潘悼,“玉大人律秃,你說我怎么就攤上這事≈位剑” “怎么了棒动?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肝劲。 經(jīng)常有香客問我迁客,道長(zhǎng),這世上最難降的妖魔是什么辞槐? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮粘室,結(jié)果婚禮上榄檬,老公的妹妹穿的比我還像新娘。我一直安慰自己衔统,他們只是感情好鹿榜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锦爵,像睡著了一般舱殿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上险掀,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天沪袭,我揣著相機(jī)與錄音,去河邊找鬼樟氢。 笑死冈绊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埠啃。 我是一名探鬼主播死宣,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碴开!你這毒婦竟也來了毅该?” 一聲冷哼從身側(cè)響起博秫,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眶掌,沒想到半個(gè)月后台盯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畏线,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年静盅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝殴。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒿叠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚣常,到底是詐尸還是另有隱情市咽,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布抵蚊,位于F島的核電站施绎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贞绳。R本人自食惡果不足惜谷醉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冈闭。 院中可真熱鬧俱尼,春花似錦、人聲如沸萎攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耍休。三九已至刃永,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羊精,已是汗流浹背斯够。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工骂远, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留花墩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓划址,卻偏偏與公主長(zhǎng)得像裸违,于是被迫代替她去往敵國(guó)和親掖桦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 摘自: https://my.oschina.net/hosee/blog/711632摘要: 本文主要說明RPC...
    holy_z閱讀 1,123評(píng)論 0 7
  • RPC概述 RPC(Remote Procedure Call)即遠(yuǎn)程過程調(diào)用供汛,允許一臺(tái)計(jì)算機(jī)調(diào)用另一臺(tái)計(jì)算機(jī)上的...
    huanfuan閱讀 3,313評(píng)論 0 5
  • 在分布式服務(wù)框架中枪汪,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的涌穆,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:R...
    java菜閱讀 982評(píng)論 0 2
  • 生活中的慢雀久。時(shí)尚專家弗洛克在一本名為《享樂主義手冊(cè)》的小冊(cè)子中給出了很多讓生活慢下來的建議宿稀,都挺有意思的,這里列舉...
    蕙蕙0029閱讀 346評(píng)論 0 1
  • 最近JD新聞?wù)紦?jù)火熱頭條赖捌,有的文章分析很到位祝沸,JD的下滑有其必然性,完全非東哥事件的偶然性越庇。明州事件發(fā)性前罩锐,JD已...
    青山逸云閱讀 128評(píng)論 0 1