分布式下的遠(yuǎn)程通信技術(shù)(RPC)的一些理解

前言

為什么需要RPC,而不是簡單的HTTP接口关噪?

剛開始還是菜鳥的時(shí)候,時(shí)常把RPC和HTTP搞混淆乌妙,本身概念還沒理解清楚使兔,心里就浮躁的不行,導(dǎo)致鬧出了不少笑話藤韵。

什么是RPC虐沥?

RPC(Remote Promote Call) 一種進(jìn)程間通信方式。允許像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)泽艘。

RPC框架的主要目標(biāo)就是讓遠(yuǎn)程服務(wù)調(diào)用更簡單欲险、透明。RPC框架負(fù)責(zé)屏蔽底層的傳輸方式(TCP或者UDP)匹涮、序列化方式(XML/JSON/二進(jìn)制)和通信細(xì)節(jié)天试。開發(fā)人員在使用的時(shí)候只需要了解誰在什么位置提供了什么樣的遠(yuǎn)程服務(wù)接口即可,并不需要關(guān)心底層通信細(xì)節(jié)和調(diào)用過程然低。

什么是HTTP喜每?

HTTP協(xié)議是應(yīng)用層的超文本傳送協(xié)議,它是Web的基礎(chǔ)雳攘。HTTP協(xié)議位于TCP/IP協(xié)議棧的應(yīng)用層带兜。基于HTTP協(xié)議的客戶/服務(wù)器模式的信息交換過程来农,分四個(gè)過程:建立連接鞋真、發(fā)送請求信息、發(fā)送響應(yīng)信息沃于、關(guān)閉連接涩咖。

OSI網(wǎng)絡(luò)結(jié)構(gòu)的七層模型

第七層:應(yīng)用層: 定義了用于在網(wǎng)絡(luò)中進(jìn)行通信和數(shù)據(jù)傳輸?shù)慕涌?- 用戶程式;提供標(biāo)準(zhǔn)服務(wù)繁莹,比如虛擬終端檩互、文件以及任務(wù)的傳輸 和處理;
第六層:表示層: 掩蓋不同系統(tǒng)間的數(shù)據(jù)格式的不同性咨演; 指定獨(dú)立結(jié)構(gòu)的數(shù)據(jù)傳輸格式闸昨; 數(shù)據(jù)的編碼和解碼;加密和解密;壓縮和 解壓縮
第五層:會(huì)話層: 管理用戶會(huì)話和對話饵较; 控制用戶間邏輯連接的建立和掛斷拍嵌;報(bào)告上一層發(fā)生的錯(cuò)誤
第四層:傳輸層: 管理網(wǎng)絡(luò)中端到端的信息傳送; 通過錯(cuò)誤糾正和流控制機(jī)制提供可靠且有序的數(shù)據(jù)包傳送循诉; 提供面向無連接的數(shù) 據(jù)包的傳送横辆;
第三層:網(wǎng)絡(luò)層: 定義網(wǎng)絡(luò)設(shè)備間如何傳輸數(shù)據(jù); 根據(jù)唯一的網(wǎng)絡(luò)設(shè)備地址路由數(shù)據(jù)包茄猫;提供流和擁塞控制以防止網(wǎng)絡(luò)資源的損耗
第二層:數(shù)據(jù)鏈路層: 定義操作通信連接的程序狈蚤; 封裝數(shù)據(jù)包為數(shù)據(jù)幀; 監(jiān)測和糾正數(shù)據(jù)包傳輸錯(cuò)誤
第一層:物理層: 定義通過網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)的物理方式划纽; 作為網(wǎng)絡(luò)媒介和設(shè)備間的接口脆侮;定義光學(xué)、電氣以及機(jī)械特性勇劣。

RPC是一種概念靖避,http也是rpc實(shí)現(xiàn)的一種方式。論復(fù)雜度比默,dubbo/hessian用起來是超級簡單的筋蓖。最近用dubbo和hessian比較多,http的幾乎都被廢棄了退敦。

至于為什么用,其實(shí)很簡單蚣抗,業(yè)務(wù)場景不一樣侈百。我最早的單位所有的代碼都在一個(gè)工程里,一次要發(fā)布幾百m的代碼翰铡。這種架構(gòu)是非常有利于小程序的钝域。但是我們?yōu)槭裁匆獞?yīng)用rpc層呢,一個(gè)功能锭魔,一套代碼下來不就解決了么例证?我覺得有幾個(gè)好處:

  1. 靈活部署
  2. 解耦

系統(tǒng)做大了,肯定是需要做微服務(wù)的迷捧。 現(xiàn)在我們做電商就是這樣织咧,單獨(dú)有一個(gè)訂單系統(tǒng),支付系統(tǒng)漠秋,商品系統(tǒng)笙蒙,用戶系統(tǒng)。都是分開部署庆锦,單獨(dú)上線的捅位。 但我們交互是用HTTP接口來交互的,我想轉(zhuǎn)用RPC,但問題是我現(xiàn)在還沒發(fā)現(xiàn)為什么需要用RPC艇搀,我還沒能理解它的作用和意義尿扯。
用http交互其實(shí)就已經(jīng)屬于rpc了

不知道大家看到這里有沒有解決掉文章開頭的那個(gè)問題呢焰雕?看似普普通通的一個(gè)問題衷笋,實(shí)際上暗藏了很多玄機(jī),只有從頭到尾都完完整整的了解過一遍之后才能真正地得到想要的答案淀散。大部分程序員應(yīng)該都有在工作過程中碰到各式各樣的問題右莱,那是否都深入去追究過問題的本質(zhì)呢?如果有機(jī)會(huì)不妨去試一試档插,你會(huì)發(fā)現(xiàn)海面下隱藏的“冰山”是表面上的許多倍慢蜓。

為什么面試官問的都是同樣的問題,有的人覺得沒什么太多能回答的點(diǎn)郭膛,有的人卻能滔滔不絕晨抡?我想每個(gè)人思維的深度面試官一眼就能看出來,正好就印證了那句話:架構(gòu)是一種思想则剃,技術(shù)只是外殼耘柱。技術(shù)可能淘汰,思想才能長存棍现。

人因?yàn)橛辛怂枷氲骷澹艣]有成為野獸。
在這里推薦一個(gè)架構(gòu)群895244712己肮,除了分布式士袄、微服務(wù)、性能優(yōu)化等技術(shù)點(diǎn)的技術(shù)分享谎僻,更重要的是架構(gòu)思想的形成娄柳。

這邊不再糾結(jié),詳細(xì)理解一下RPC的相關(guān)問題艘绍。

廣義和狹義的RPC

廣義的遠(yuǎn)程通訊技術(shù)包括:RPC , WebService , RMI , JMS , EJB , JNDI .

  • CORBA:面向?qū)ο蟮木幊腆w系規(guī)范,分布式系統(tǒng),跨語言,對標(biāo)RMI(競爭關(guān)系)赤拒。
  • SOAP:簡單對象訪問協(xié)議,微軟聯(lián)合廠商對xml-rpc標(biāo)準(zhǔn)化,soap協(xié)議就是聯(lián)合標(biāo)準(zhǔn)化的結(jié)果,而且微軟搶先完善了soap協(xié)議,推出了webservice。對象訪問協(xié)議指的是使用XML描述web service的信息(URI/類/參數(shù)/返回值),理論上SOAP就是一段xml
  • WebService:屬于廣義rpc的一種(常見的廣義rpc實(shí)現(xiàn)還有xml-rpc和json-rpc),支持異構(gòu)系統(tǒng)間的交互, 支持不同語言的通信,使用http通信,通過serlvet提供XML格式的數(shù)據(jù),是SOAP協(xié)議的封裝,WSDL是它的描述方式诱鞠。
  • WSDL:webservice描述語言,描述SOAP協(xié)議的,也是段XML
  • RMI:遠(yuǎn)程調(diào)用對象,其實(shí)是java實(shí)現(xiàn)了RPC的一組接口
  • JMS:MQ
  • EJB:大型分布式,rmi-iiop協(xié)議

廣義RPC發(fā)展歷程

狹義RPC技術(shù)框架

由于目前跨內(nèi)存調(diào)用的普遍性,RPC往往代稱更加具體的基于底層協(xié)議二進(jìn)制流的RPC框架,與WebService最大的不同就是: 狹義的RPC基于二進(jìn)制流的序列化和反序列化,故不能夠提供跨語言的服務(wù),但是比基于文本解析的WebService更加高效挎挖。

狹義RPC框架一般需要高性能的網(wǎng)絡(luò)框架,如Netty,Mina,高性能的序列化反序列化框架,尋址方式,如果是帶會(huì)話的RPC,還要有會(huì)話和狀態(tài)保持功能。

當(dāng)下XML-RPC,SOAP,WebService技術(shù)的缺陷

  • 冗余數(shù)據(jù)太多,處理速度太慢般甲。
  • RPC 風(fēng)格的 Web Service 跨語言性不佳,而 Document 風(fēng)格的 Web Service 又太過難用肋乍。
  • Web Service 沒有解決用戶的真正問題,只是把一個(gè)問題變成了另一個(gè)問題。
  • Web Service 的規(guī)范太過復(fù)雜,以至于在 .NET 和 Java 平臺(tái)以外沒有真正好用的實(shí)現(xiàn),甚至沒有可用的實(shí)現(xiàn)敷存。
  • 跨語言跨平臺(tái)只是 Web Service 的一個(gè)口號,雖然很多人迷信這一點(diǎn),但事實(shí)上它并沒有真正實(shí)現(xiàn)墓造。

RPC框架實(shí)現(xiàn)的幾個(gè)核心技術(shù)點(diǎn):

  • 遠(yuǎn)程提供者需要以某種形式提供服務(wù)調(diào)用相關(guān)的信息堪伍,包括但不限于服務(wù)接口定義、數(shù)據(jù)結(jié)構(gòu)觅闽、或者中間態(tài)的服務(wù)定義文件帝雇。例如Facebook的 Thrift的IDL文件,Web service的WSDL文件蛉拙;服務(wù)的調(diào)用者需要通過一定的圖景獲取遠(yuǎn)程服務(wù)調(diào)用相關(guān)的信息尸闸。
  • 遠(yuǎn)程代理對象:服務(wù)調(diào)用者用的服務(wù)實(shí)際是遠(yuǎn)程服務(wù)的本地代理。說白了就是通過動(dòng)態(tài)代理來實(shí)現(xiàn)孕锄。
  • 通信:RPC框架與具體的協(xié)議無關(guān)吮廉。
  • 序列化:畢竟是遠(yuǎn)程通信,需要將對象轉(zhuǎn)化成二進(jìn)制流進(jìn)行傳輸畸肆。不同的RPC框架應(yīng)用的場景不同宦芦,在序列化上也會(huì)采取不同的技術(shù)

RPC面臨的挑戰(zhàn)

在大規(guī)模服務(wù)化之前,應(yīng)用可能只是通過RPC框架轴脐,簡單的暴露和引用遠(yuǎn)程服務(wù)调卑,通過配置URL地址進(jìn)行遠(yuǎn)程服務(wù)調(diào)用,路由則通過F5負(fù)載均衡器等進(jìn)行簡單的負(fù)載均衡大咱。

當(dāng)服務(wù)越來越多的時(shí)候恬涧,服務(wù)的URL配置管理變得更加困難。單純的使用RPC就有點(diǎn)吃不消碴巾。所以在大規(guī)模分布式集群中溯捆,RPC只是作為集群的一個(gè)方法調(diào)用手段。例如在Hadoop的進(jìn)程間交互都是通過RPC來進(jìn)行的厦瓢,比如Namenode與Datanode直接现使,Jobtracker與Tasktracker之間等。

服務(wù)化架構(gòu)的演進(jìn)

  • MVC架構(gòu):當(dāng)業(yè)務(wù)規(guī)模很小時(shí)旷痕,將所有功能都不熟在同一個(gè)進(jìn)程中,通過雙機(jī)或者負(fù)載均衡器實(shí)現(xiàn)負(fù)債分流顽冶;此時(shí)欺抗,分離前后臺(tái)邏輯的MVC架構(gòu)是關(guān)鍵。

  • PRC架構(gòu):當(dāng)垂直應(yīng)用越來越多强重,應(yīng)用之間交互不可避免绞呈,將核心和公共業(yè)務(wù)抽取出來,作為獨(dú)立的服務(wù)间景,實(shí)現(xiàn)前后臺(tái)邏輯分離佃声。此時(shí),用于提高業(yè)務(wù)復(fù)用及拆分的RPC框架是關(guān)鍵倘要。

  • SOA架構(gòu):隨著業(yè)務(wù)發(fā)展圾亏,服務(wù)數(shù)量越來越多十拣,服務(wù)生命周期管控和運(yùn)行態(tài)的治理成為瓶頸,此時(shí)用于提升服務(wù)質(zhì)量的SOA服務(wù)治理是關(guān)鍵志鹃。

  • 微服務(wù)架構(gòu):通過服務(wù)的原子化拆分夭问,以及微服務(wù)的獨(dú)立打包、部署和升級曹铃,小團(tuán)隊(duì)的交付周期將縮短缰趋,運(yùn)維成本也將大幅度下降。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陕见,一起剝皮案震驚了整個(gè)濱河市秘血,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌评甜,老刑警劉巖灰粮,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜕着,居然都是意外死亡谋竖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門承匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖乘,“玉大人,你說我怎么就攤上這事韧骗〖问悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵袍暴,是天一觀的道長些侍。 經(jīng)常有香客問我,道長政模,這世上最難降的妖魔是什么岗宣? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮淋样,結(jié)果婚禮上耗式,老公的妹妹穿的比我還像新娘。我一直安慰自己趁猴,他們只是感情好刊咳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著儡司,像睡著了一般娱挨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捕犬,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天跷坝,我揣著相機(jī)與錄音酵镜,去河邊找鬼。 笑死探孝,一個(gè)胖子當(dāng)著我的面吹牛笋婿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顿颅,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼缸濒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粱腻?” 一聲冷哼從身側(cè)響起庇配,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绍些,沒想到半個(gè)月后捞慌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柬批,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年啸澡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮帐。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗅虏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出上沐,到底是詐尸還是另有隱情皮服,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布参咙,位于F島的核電站龄广,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蕴侧。R本人自食惡果不足惜择同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望净宵。 院中可真熱鬧奠衔,春花似錦、人聲如沸塘娶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刁岸。三九已至,卻和暖如春她我,著一層夾襖步出監(jiān)牢的瞬間虹曙,已是汗流浹背迫横。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酝碳,地道東北人矾踱。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像疏哗,于是被迫代替她去往敵國和親呛讲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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

  • 在分布式服務(wù)框架中返奉,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的贝搁,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:R...
    java菜閱讀 988評論 0 2
  • 在分布式服務(wù)框架中芽偏,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的雷逆,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:R...
    wyatt_plus閱讀 828評論 0 4
  • 廣義的遠(yuǎn)程通訊技術(shù)包括:RPC污尉,WebService膀哲,RMI,JMS被碗,EJB某宪,JNDI 一、概念解釋 RPC:遠(yuǎn)程...
    飛來來閱讀 1,858評論 0 2
  • Runloop 什么是RunloopRunloop就是消息循環(huán)蛮放,每一個(gè)線程內(nèi)部都有一個(gè)消息循壞缩抡。只有主線程的消息循...
    冷漠叻葒顏閱讀 8,556評論 4 27
  • 其實(shí)我很害怕 我害怕失去你 我真的不想再經(jīng)歷那種從陌生人到戀人,經(jīng)歷了那么多的事情包颁,最后卻又是分開的決定瞻想,想想就覺...
    TASUYAN閱讀 325評論 0 0