RPC调用框架比较分析--转载
原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90
什么是RPC:?
RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過(guò)程調(diào)用協(xié)議,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。?
簡(jiǎn)言之,RPC使得程序能夠像訪問(wèn)本地系統(tǒng)資源一樣,去訪問(wèn)遠(yuǎn)端系統(tǒng)資源。?
比較關(guān)鍵的一些方面包括,通訊協(xié)議,序列化,資源(接口)描述,服務(wù)框架,性能,語(yǔ)言支持等。?
典型RPC調(diào)用框架:?
RPC的實(shí)現(xiàn)和調(diào)用框架,五花八門,簡(jiǎn)單介紹其中幾種比較典型的。?
RMI實(shí)現(xiàn),利用java.rmi包實(shí)現(xiàn),基于Java遠(yuǎn)程方法協(xié)議(Java Remote Method Protocol)?
和java的原生序列化。?
Hessian,是一個(gè)輕量級(jí)的remoting onhttp工具,使用簡(jiǎn)單的方法提供了RMI的功能。 基于HTTP協(xié)議,采用二進(jìn)制編解碼。?
protobuf-rpc-pro?是一個(gè)Java類庫(kù),提供了基于 Google 的 Protocol Buffers 協(xié)議的遠(yuǎn)程方法調(diào)用的框架。基于 Netty 底層的 NIO 技術(shù)。支持 TCP 重用/ keep-alive、SSL加密、RPC 調(diào)用取消操作、嵌入式日志等功能。?
THRIFT是一種可伸縮的跨語(yǔ)言服務(wù)的軟件框架。它擁有功能強(qiáng)大的代碼生成引擎,無(wú)縫地支持C + +,C#,Java,Python和PHP和Ruby。thrift允許你定義一個(gè)描述文件,描述數(shù)據(jù)類型和服務(wù)接口。依據(jù)該文件,編譯器方便地生成RPC客戶端和服務(wù)器通信代碼。????
? >>>最初由facebook開發(fā)用做系統(tǒng)內(nèi)個(gè)語(yǔ)言之間的RPC通信 。?
? >>>2007年由facebook貢獻(xiàn)到apache基金 ,現(xiàn)在是apache下的opensource之一 。?
? >>>支持多種語(yǔ)言之間的RPC方式的通信:php語(yǔ)言client可以構(gòu)造一個(gè)對(duì)象,調(diào)用相應(yīng)的服務(wù)方法來(lái)調(diào)用java語(yǔ)言的服務(wù) ,跨越語(yǔ)言的C/S RPC調(diào)用 。?
? >>>底層通訊基于SOCKET。?
AVRO,Avro出自Hadoop之父Doug Cutting, 在Thrift已經(jīng)相當(dāng)流行的情況下Avro的推出,其目標(biāo)不僅是提供一套類似Thrift的通訊中間件更是要建立一個(gè)新的,標(biāo)準(zhǔn)性的云計(jì)算的數(shù)據(jù)交換和 存儲(chǔ)的Protocol。支持HTTP,TCP兩種協(xié)議。?
RPC調(diào)用框架的過(guò)程原理基本類似,以Thrift為例?
Thrift 協(xié)議棧 以及各層的使用(java 為例)?
?
1、model?? interface?
?????? 服務(wù)的調(diào)用接口以及接口參數(shù)model、返回值model?
2、Tprotocol??? 協(xié)議層?
???????? 將數(shù)據(jù)(model)編碼 、解碼 。?
3、Ttramsport 傳輸層?
??????? 編碼后的數(shù)據(jù)傳輸(簡(jiǎn)單socket、http)?
5、Tserver?
??????? 服務(wù)的Tserver類型,實(shí)現(xiàn)了幾種rpc調(diào)用(多線程、單線程非阻塞IO、多線程非阻塞IO)?
RPC調(diào)用框架比較:?
Thrift與protobuf-rpc-pro比較?
1、Another important difference are the languages supported by default.????
protobuf: Java, C++, Python????
Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml?
支持語(yǔ)言不同,thrift支持著更多的語(yǔ)言?
2、Thrift supports ‘exceptions 。?
?? thrift支持服務(wù)的異常 。?
3、Protocol Buffers much easier to read 。Protobuf API looks cleaner, though the generated classes are all packed as an inner classes which is not so nice.?
?? Protocol Buffers 在文檔方面比thrift豐富,而且比thrift簡(jiǎn)單 。?
4、Protobuf serialized objects are about 30% smaller then Thrift.?
?? Protocol Buffers在序列化/反序列化、傳輸上性能更優(yōu) 。?
5、RPC is another key difference. Thrift generates code to implement RPC clients and servers wheres Protocol Buffers seems mostly designed as a data-interchange format alone.??
??? thrift提供了一套完整的rpc服務(wù)實(shí)現(xiàn)(多線程socket、單線程非阻塞的socket、多線程非阻塞socket)?
6、And according to the wiki the Thrift runtime doesn't run on Windows.?
?? thrift 對(duì)有些語(yǔ)言在windows上不支持:C++???
摘選自:?http://gemantic.iteye.com/blog/1199214?thrift的使用介紹?
Apache Avro 與 Thrift 比較?
轉(zhuǎn)自網(wǎng)絡(luò),?http://www.360doc.com/content/12/0515/08/2716732_211104190.shtml?
文章有比較詳細(xì)的對(duì)比,值得仔細(xì)研讀。摘部分內(nèi)容,如下。?
Avro和Thrift都是跨語(yǔ)言,基于二進(jìn)制的高性能的通訊中間件. 它們都提供了數(shù)據(jù)序列化的功能和RPC服務(wù). 總體功能上類似,但是哲學(xué)不一樣. Thrift出自Facebook用于后臺(tái)各個(gè)服務(wù)間的通訊,Thrift的設(shè)計(jì)強(qiáng)調(diào)統(tǒng)一的編程接口的多語(yǔ)言通訊框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已經(jīng)相當(dāng)流行的情況下Avro的推出,其目標(biāo)不僅是提供一套類似Thrift的通訊中間件更是要建立一個(gè)新的,標(biāo)準(zhǔn)性的云計(jì)算的數(shù)據(jù)交換和 存儲(chǔ)的Protocol。 這個(gè)和Thrift的理念不同,Thrift認(rèn)為沒(méi)有一個(gè)完美的方案可以解決所有問(wèn)題,因此盡量保持一個(gè)Neutral框架,插入不同的實(shí)現(xiàn)并互相交互。 而Avro偏向?qū)嵱?#xff0c;排斥多種方案帶來(lái)的 可能的混亂,主張建立一個(gè)統(tǒng)一的標(biāo)準(zhǔn),并不介意采用特定的優(yōu)化。Avro的創(chuàng)新之處在于融合了顯式,declarative的Schema和高效二進(jìn)制的 數(shù)據(jù)表達(dá),強(qiáng)調(diào)數(shù)據(jù)的自我描述,克服了以往單純XML或二進(jìn)制系統(tǒng)的缺陷。Avro對(duì)Schema動(dòng)態(tài)加載功能,是Thrift編程接口所不具備的,符合 了Hadoop上的Hive/Pig及NOSQL 等既屬于ad hoc,又追求性能的應(yīng)用需求。?
目前階段Thrift比Avro支持的語(yǔ)言更豐富.?
Thrift: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.
Avro: C, C++, Java, Python, Ruby, PHP.?
Avro和Thrift處理Schema方法截然不同。?
Thrift是一個(gè)面向編程的系統(tǒng), 完全依賴于IDL->Binding Language的代碼生成。?
Avro支持2種方式。Avro-specific方式和Thrift的方式相似,依賴代碼生成產(chǎn)生特定的類,并內(nèi)嵌JSON Schema. Avro-generic方式支持Schema的動(dòng)態(tài)加載,用通用的結(jié)構(gòu)(map)代表數(shù)據(jù)對(duì)象,不需要編譯加載直接就可以處理新的數(shù)據(jù)源。?
Avro的Schema文件有三種格式,依次是avdl,avpr,avsc,后兩種是json格式,avdl可以轉(zhuǎn)成avpr。?
關(guān)于序列化,avro的機(jī)制,有更好的數(shù)據(jù)的透明度和可操作性,更高的存儲(chǔ)效率。?
Thrift提供了多種序列化的實(shí)現(xiàn):?
TCompactProtocol: 最高效的二進(jìn)制序列化協(xié)議,但并不是所有的綁定語(yǔ)言都支持。?
TBinaryProtocol: 缺省簡(jiǎn)單二進(jìn)制序列化協(xié)議.?
RPC服務(wù)?
Avro提供了?
HttpServer : 缺省,基于Jetty內(nèi)核的服務(wù).?
NettyServer: 新的基于Netty的服務(wù).?
Thrift提供了:?
TThreadPolServer: 多線程服務(wù)?
TNonBlockingServer: 單線程 non blocking的服務(wù)?
THsHaServer: 多線程 non blocking的服務(wù)?
性能測(cè)試Benchmarking,兩者差相仿佛。?
Conclusion?
Thrift適用于程序?qū)Τ绦蜢o態(tài)的數(shù)據(jù)交換,要求schema預(yù)知并相對(duì)固定。?
Avro在Thrift基礎(chǔ)上增加了對(duì)schema動(dòng)態(tài)的支持且性能上不輸于Thrift。?
Avro顯式schema設(shè)計(jì)使它更適用于搭建數(shù)據(jù)交換及存儲(chǔ)的通用工具和平臺(tái),特別是在后臺(tái)。?
目前Thrift的優(yōu)勢(shì)在于更多的語(yǔ)言支持和相對(duì)成熟?
比較分析結(jié)論:?
基于以上三種框架比較分析,個(gè)人決定采用AVRO框架。?
相關(guān)資源?
protobuf-rpc-pro-demo-1.1.0及源碼 包含在附件中,該文件包中,包含一個(gè)1.1.0版本的運(yùn)行環(huán)境(bin,lib中)以及最新3.3版本的demo源碼和protobuf-rpc-pro源碼。相關(guān)代碼在官網(wǎng)都可以下載到,?http://code.google.com/p/protobuf-rpc-pro/?
protobuf-rpc-readme,個(gè)人的一點(diǎn)總結(jié)?
thrifttest源碼,包含在附件中,該項(xiàng)目包含一個(gè)rmi的實(shí)現(xiàn),以及thrift的實(shí)現(xiàn)。?
Avrotest源碼,包含在附件中,該項(xiàng)目包含官網(wǎng)提供的一個(gè)數(shù)據(jù)序列化反序列化的兩種實(shí)現(xiàn),SpecificMain,GenericMain;Specific方式的接口調(diào)用MailMain*;Generic方式的多接口調(diào)用,包含http方式和netty方式,http/,netty/;項(xiàng)目涵蓋了三種不同的Schema格式。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4801439.html
總結(jié)
以上是生活随笔為你收集整理的RPC调用框架比较分析--转载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hbase快速入门
- 下一篇: spring-data-redis 使用