RPC、SOAP、HTTP REST

分布式系統(tǒng)離不開多進程之間的通信問題,包括本機進程之間的IPC通信和基于網(wǎng)絡(luò)的進程間遠程通信。各種通用的遠程通信技術(shù)不斷發(fā)展變化,比如從最古老的RPC(Remote Process Call)遠程通信技術(shù)到曾經(jīng)風(fēng)靡一時的SOAP(Web Service)協(xié)議,再到后面紅極一時的HTTP REST。

從IPC說起

古老而又有生命力的RPC

不同于復(fù)雜的Socket通信方式,RPC的初心是設(shè)計一套遠程通信的通用框架,這個框架能夠自動處理通信協(xié)議、對象序列化、網(wǎng)絡(luò)傳輸?shù)葟?fù)雜細節(jié),并且希望開發(fā)者使用這個框架以后,調(diào)用一個遠程機器上的接口代碼與以本地方法調(diào)用的代碼“看起來沒有什么區(qū)別”,從而降低分布式系統(tǒng)開發(fā)難度。

為了將一個傳統(tǒng)的程序改寫成RPC程序,要在程序里加入另外一些代碼,這個過程叫作stub過程。RPC的具體執(zhí)行流程如下:

RPC調(diào)用流程
  • ① 服務(wù)消費方(client)以本地調(diào)用方式調(diào)用服務(wù);
  • ② client stub接收到調(diào)用后,將方法、參數(shù)組裝成能夠進行網(wǎng)絡(luò)傳輸?shù)南Ⅲw,client stub連接到遠程服務(wù),并將消息發(fā)送至服務(wù)端;
  • ③ server stub接收到消息之后進行解碼;
  • ④ server stub根據(jù)解碼的結(jié)果調(diào)用本地服務(wù);
  • ⑤ 本地服務(wù)執(zhí)行并將結(jié)果返回給server stub;
  • ⑥ server stub將結(jié)果打包成消息并發(fā)送至調(diào)用方;
  • ⑦ client stub接收到消息并解碼;
  • ⑧ client stub發(fā)送調(diào)用結(jié)果給client;

編寫一個完成的RPC框架,涉及的技術(shù):

  • 高性能網(wǎng)絡(luò)編程技術(shù);
  • 對象序列化與反序列化;
  • 自動代碼生成或者動態(tài)代理編程技術(shù);

歷史上第一次創(chuàng)造一個多語言的RPC就是COBRA,但是功敗垂成。之后XML的興起,加速了COBRA的沒落。

SOAP于1999年底發(fā)布,由微軟和DevelopMentor發(fā)布,隨后提交給W3C作為標準。SOAP使用XML作為RPC新的對象序列化機制,IBM則又繼續(xù)發(fā)揚光大這條路,推出了Web Service等整套方案。

SOAP嚴格意義上是屬于XML-RPC技術(shù)的一個變種,一個XML-RPC請求消息就是一個HTTP-POST請求消息,其請求消息主體基于XML格式。同理,其響應(yīng)消息也是基于XML的,SOAP是第一次真正成功地實現(xiàn)了支持多語言多平臺的開放性RPC標準。下面分別為SOAP的請求報文和響應(yīng)報文,

SOAP的請求報文
SOAP響應(yīng)報文

從上圖可以看到SOAP的報文復(fù)雜而且臃腫,由于它是面向機器識別的表達格式,程序員很難直接理解它的報文,這個缺陷最終導(dǎo)致SOAP的末路與HTTP REST通信方式的興起。

HTTP REST采用更容易理解的JSON格式來傳遞請求與應(yīng)答參數(shù)。同時,HTTP REST已經(jīng)脫離了RPC的范濤,因為它無需客戶端stub和服務(wù)單stub,調(diào)用也不再類似本地方法調(diào)用的方式了。

HTTP REST慢慢侵占了RPC大部分應(yīng)用領(lǐng)域,并且導(dǎo)致了一度盛行的XML-RPC的滅絕。但同時促進了正統(tǒng)RPC技術(shù)走向了一個新的發(fā)展階段,追求更高性能及增加對多語言多平臺支持,成為越來越多的開源RPC框架的目標,如Thrift、Apache Avro等新生的開源框架,這些框架在大數(shù)據(jù)系統(tǒng)、大型分布式系統(tǒng)及移動互聯(lián)網(wǎng)方面被越來越多的公司使用。

話說CORBA墻倒眾人推時,最初參與CORBA的一幫技術(shù)專家們則從CORBA身上,“去其糟粕,取其精華”,另起爐灶打造了延續(xù)至今的RPC之王-- ZeroC Ice。作為RPC領(lǐng)域的絕對王者,ICE發(fā)展至今已經(jīng)成為一個很強大的微服務(wù)架構(gòu)平臺。

從RPC到服務(wù)治理框架

與一般的HTTP REST框架不同,一個可用的RPC框架不僅解決了遠程調(diào)用問題,也提了用于服務(wù)注冊和服務(wù)發(fā)現(xiàn)的基礎(chǔ)設(shè)施。如 RMI(Java的RPC)里的RMI Registry。

RMI

從RPC和CORBA發(fā)展而來的服務(wù)注冊和服務(wù)發(fā)現(xiàn)模型在后來的Web Service時代被提到了一個很高的境界,Web Service的一般架構(gòu)如下:

Web Service架構(gòu)

在Web Service的發(fā)展之下,逐漸出現(xiàn)了SOA這個新概念,雖然業(yè)界對SOA這個概念有各種“詮釋”,但“面向服務(wù)的架構(gòu)”即以服務(wù)為中心的分布式架構(gòu)深入人心。服務(wù)注冊和服務(wù)發(fā)現(xiàn)模型及RPC技術(shù)依然是SOA的核心技術(shù)。

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,692評論 19 139
  • 1974年冬,互聯(lián)網(wǎng)大師 Jon Postel發(fā)表了RFC674:“Procedure Call Protocol...
    果凍蝦仁閱讀 548評論 0 0
  • 在分布式服務(wù)框架中,一個最基礎(chǔ)的問題就是遠程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實現(xiàn)遠程通訊的技術(shù),例如:R...
    java菜閱讀 1,092評論 0 2
  • 遠程過程調(diào)用(Remote Procedure Call, RPC)是從一臺機器上通過參數(shù)傳遞的方式調(diào)用另一臺機...
    劉惜有閱讀 1,195評論 0 1
  • 早上跑步,買拜年禮物,10:00——20:00走訪親戚,去了二表哥、二舅伯、奶奶、姑奶奶、姨媽、三叔家里,有...
    董銀超閱讀 197評論 2 4

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