分布式系統(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í)行流程如下:

- ① 服務(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的報文復(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。

從RPC和CORBA發(fā)展而來的服務(wù)注冊和服務(wù)發(fā)現(xiàn)模型在后來的Web Service時代被提到了一個很高的境界,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ù)。