RPC發(fā)展歷史的幾個關(guān)鍵節(jié)點(diǎn)
- 奠基: 過程調(diào)用最早可以追溯到 Jon Postel 和 Jim White 在1974 年發(fā)表的 Procedure Call Protocol Documents Version 2(RFC674)。這個協(xié)議試圖定義一種通用的方法,用于解決 NSW 項(xiàng)目中多個計算節(jié)點(diǎn)通信的問題。
- 第一個RPC標(biāo)準(zhǔn): 1988年,RFC 1057 發(fā)布,ONC RPC(Sun RPC) 被定義為標(biāo)準(zhǔn)的RPC規(guī)范。ONC RPC 提供了一個編譯器,需要一個遠(yuǎn)程過程接口的定義來生成客戶端和服務(wù)器的存根函數(shù)。這個編譯器叫做 rpcgen。在運(yùn)行此編譯器之前,程序員必須提供接口定義,包含函數(shù)聲明的接口定義,通過版本號進(jìn)行分組,并被一個獨(dú)特的程序編碼來標(biāo)識。這一過程已經(jīng)成為現(xiàn)在RPC的基本調(diào)用模型。
- 第一個對象模型調(diào)用標(biāo)準(zhǔn): 1991年,OMG 發(fā)布CORBA 1.0,試圖為應(yīng)用程序開發(fā)人員提供幾個好處: 語言獨(dú)立性、操作系統(tǒng)獨(dú)立性、體系結(jié)構(gòu)獨(dú)立性、通過 IDL 中的抽象類型映射到這些類型的機(jī)器和語言特定實(shí)現(xiàn)的靜態(tài)類型,以及對象傳輸,其中對象可以通過不同機(jī)器之間的連接進(jìn)行遷移。
- HTTP誕生: 1996年:HTTP/1.x 版本發(fā)布,為互聯(lián)網(wǎng)的發(fā)展奠定了基礎(chǔ),我們今天的大部分遠(yuǎn)程調(diào)用,都基于HTTP協(xié)議。
- REST概念提出: 2000年,Roy Thomas Fielding 博士在他的博士論文 《Architectural Styles and the Design of Network-based Software Architectures》首次提出了 REST 這個詞。REST非常簡單,無需客戶端stub 代碼 和服務(wù)端 stub代碼,且所有語言都可以集成實(shí)現(xiàn)。HTTP REST慢慢侵占了RPC大部分應(yīng)用領(lǐng)地的“異類”,并且導(dǎo)致了一度盛行的XML-RPC的滅絕,但同時促進(jìn)了正統(tǒng)RPC技術(shù)走向一個新的發(fā)展階段。
注:了解更詳細(xì)的發(fā)展歷史,請閱讀RPC發(fā)展史。
分布式系統(tǒng)對象模型調(diào)用體系
從OMG發(fā)布CORBA 1.0,以對象為核心的遠(yuǎn)程調(diào)用體系隨著局域網(wǎng)應(yīng)用的發(fā)展,逐步在1990年-2005年前后成為企業(yè)內(nèi)部客戶端-服務(wù)器架構(gòu)的首要選擇,主要代表有:
第一個輕量級HTTP RPC調(diào)用標(biāo)準(zhǔn):SOAP
SOAP 是一項(xiàng)標(biāo)準(zhǔn)協(xié)議,其最初的設(shè)計意圖是讓使用不同語言且在不同平臺上構(gòu)建的應(yīng)用之間進(jìn)行通信。由于 SOAP 是一項(xiàng)協(xié)議,因此它會施加一些內(nèi)置規(guī)則,從而增加復(fù)雜性和開銷,并可導(dǎo)致頁面加載時間延長。但是,這些標(biāo)準(zhǔn)還提供了內(nèi)置合規(guī)性,使其更適合企業(yè)應(yīng)用。內(nèi)置合規(guī)性標(biāo)準(zhǔn)包括安全性、原子性、一致性、隔離性和持久性(ACID),這是一組旨在確保數(shù)據(jù)庫事務(wù)可靠性的屬性。
–SOAP
開源崛起,輕量級RPC調(diào)用框架及協(xié)議
隨著互聯(lián)網(wǎng)企業(yè)崛起及 SOA概念 的普及、疊加CPU及千兆網(wǎng)的快速發(fā)展, 云原生 及 微服務(wù) 等技術(shù)的成熟,擴(kuò)展性為主的一批開源RPC框架逐步興起,替代對象模型調(diào)用體系成為企業(yè)內(nèi)部RPC調(diào)用的主流,主要代表有:
- Protocol Buffer: 優(yōu)點(diǎn),跨語言的、無狀態(tài)的、輕量級的遠(yuǎn)程過程調(diào)用(RPC)協(xié)議,數(shù)據(jù)傳輸量小,速度比JSON快; 缺點(diǎn),序列化二進(jìn)制不可讀,調(diào)試相對困難。
- Avro: 優(yōu)點(diǎn),是一種與編程語言無關(guān)的序列化格式,schema 通過 JSON 來描述,數(shù)據(jù)被序列化成二進(jìn)制文件或 JSON 文件,為Hadoop開發(fā),支持腳本語言; 缺點(diǎn),。
- JSON-RPC: 優(yōu)點(diǎn),跨語言的、無狀態(tài)的、輕量級的遠(yuǎn)程過程調(diào)用(RPC)協(xié)議,數(shù)據(jù)傳輸量小,適用 Web 和移動應(yīng)用;缺點(diǎn),對復(fù)雜數(shù)據(jù)類型的支持較弱,不適合復(fù)雜場景。
- Thrift: 優(yōu)點(diǎn),跨語言調(diào)用型的 RPC框架,Apache維護(hù),高性能,得到了廣泛的應(yīng)用 ;缺點(diǎn),序列化二進(jìn)制不可讀,調(diào)試相對困難。
- gRPC: 優(yōu)點(diǎn),跨語言調(diào)用型的 RPC框架,基于 HTTP/2 和 Protobuf,Google維護(hù), 高性能;缺點(diǎn),對于小規(guī)模團(tuán)隊(duì)可能過于繁重,學(xué)習(xí)成本較高。
- Dubbo: 優(yōu)點(diǎn),服務(wù)治理型的RPC框架,提供豐富的治理和調(diào)用特性,Java語言友好,支持主流跨語言型RPC協(xié)議;缺點(diǎn),對于大型分布式系統(tǒng)可能過于臃腫,部分功能相對復(fù)雜。
- 其它 注:了解這些框架的差異,請閱讀常見 RPC 框架介紹
REST成為當(dāng)下互聯(lián)網(wǎng)API調(diào)用事實(shí)的標(biāo)準(zhǔn)
移動互聯(lián)網(wǎng) 的高速發(fā)展,打破了PC互聯(lián)網(wǎng) 時代的瀏覽器-服務(wù)器應(yīng)用模式,轉(zhuǎn)向以客戶端-服務(wù)器為主的應(yīng)用模式,基于HTTP的REST調(diào)用風(fēng)格逐步成為主流。REST風(fēng)格也將在AI互聯(lián)網(wǎng) 時代成為API調(diào)用標(biāo)準(zhǔn)。
–RESTfulAPI
常見問題
Dubbo與 gRPC、Spring Cloud、Istio 的關(guān)系?Go語音中類似Dubbo的框架是什么?Xml,Json,Hessian,Protocol Buffers的序列化和反序列化性能進(jìn)行對比?Avro有什么用?
參考資料
Protocol Buffer規(guī)范簡介gRPC 官方文檔中文版 V1.0JSON-RPC 2.0 規(guī)范(中文版)深入淺出RPC原理RPC框架:從原理到選型,一文帶你搞懂RPC
一站搜索、試用、比較全球API!
試用API,一次比較多個渠道