從零開始實(shí)現(xiàn)RPC框架 - RPC原理及實(shí)現(xiàn)

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。如下圖所示:

20170621211251172.png

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

  • Server: 暴露服務(wù)的服務(wù)提供方狐肢。
  • Client: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方添吗。
  • Registry: 服務(wù)注冊與發(fā)現(xiàn)的注冊中心。

RPC調(diào)用流程

RPC基本流程圖:

20170121202103771 (1).png

一次完整的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ù)注冊&發(fā)現(xiàn)

20170621211344625.png

服務(wù)提供者啟動(dòng)后主動(dòng)向注冊中心注冊機(jī)器ip夺饲、port以及提供的服務(wù)列表奸汇;
服務(wù)消費(fèi)者啟動(dòng)時(shí)向注冊中心獲取服務(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ù)注冊中心
可選技術(shù):

  • Redis
  • Zookeeper
  • Consul
  • Etcd

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焊夸,一起剝皮案震驚了整個(gè)濱河市仁连,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阱穗,老刑警劉巖饭冬,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揪阶,居然都是意外死亡昌抠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門鲁僚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炊苫,“玉大人裁厅,你說我怎么就攤上這事∏劝” “怎么了姐直?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒋畜。 經(jī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
  • 文/蒼蘭香墨 我猛地睜開眼溉奕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忍啤?” 一聲冷哼從身側(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ú)居荒郊野嶺守林人離奇死亡参萄,尸身上長有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
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至导匣,卻和暖如春才菠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逐抑。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工鸠儿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屹蚊,地道東北人厕氨。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像汹粤,于是被迫代替她去往敵國和親命斧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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