傳統(tǒng)的跨語(yǔ)言通信方案:
基于SOAP消息格式的WebService
基于JSON消息格式的RESTful 服務(wù)
主要弊端:
XML體積太大纺座,解析性能極差
JSON體積相對(duì)較小彤守,解析相對(duì)較快,但表達(dá)能力較弱
現(xiàn)在比較流行的跨語(yǔ)言通信方案:
Google protobuf (http://code.google.com/p/protobuf)
Apache Thrift (http://thrift.apache.org/)
Apache Avro (http://avro.apache.org/)
Google protobuf:
優(yōu)點(diǎn)
二進(jìn)制消息,性能好/效率高(空間和時(shí)間效率都很不錯(cuò))
proto文件生成目標(biāo)代碼,簡(jiǎn)單易用
序列化反序列化直接對(duì)應(yīng)程序中的數(shù)據(jù)類,不需要解析后在進(jìn)行映射(XML,JSON都是這種方式)
支持向前兼容(新加字段采用默認(rèn)值)和向后兼容(忽略新加字段)浓利,簡(jiǎn)化升級(jí)
支持多種語(yǔ)言(可以把proto文件看做IDL文件)
Netty等一些框架集成
缺點(diǎn)
官方只支持C++,JAVA和Python語(yǔ)言綁定
二進(jìn)制可讀性差(貌似提供了Text_Fromat功能)
二進(jìn)制不具有自描述特性
默認(rèn)不具備動(dòng)態(tài)特性(可以通過(guò)動(dòng)態(tài)定義生成消息類型或者動(dòng)態(tài)編譯支持)
只涉及序列化和反序列化技術(shù)挤庇,不涉及RPC功能(類似XML或者JSON的解析器)
Apache Thrift:
應(yīng)用
Facebook的開(kāi)源的日志收集系統(tǒng)(scribe: https://github.com/facebook/scribe)
淘寶的實(shí)時(shí)數(shù)據(jù)傳輸平臺(tái)(TimeTunnel http://code.taobao.org/p/TimeTunnel/wiki/index)
Evernote開(kāi)放接口(https://github.com/evernote/evernote-thrift)
Quora(http://www.quora.com/Apache-Thrift)
HBase( http://abloz.com/hbase/book.html#thrift )
…
優(yōu)點(diǎn)
支持非常多的語(yǔ)言綁定
thrift文件生成目標(biāo)代碼钞速,簡(jiǎn)單易用
消息定義文件支持注釋
數(shù)據(jù)結(jié)構(gòu)與傳輸表現(xiàn)的分離,支持多種消息格式
包含完整的客戶端/服務(wù)端堆棧嫡秕,可快速實(shí)現(xiàn)RPC
支持同步和異步通信
缺點(diǎn)
和protobuf一樣不支持動(dòng)態(tài)特性
Apache Avro:
應(yīng)用
Hadoop RPC (http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F)
優(yōu)點(diǎn)
二進(jìn)制消息渴语,性能好/效率高
使用JSON描述模式
模式和數(shù)據(jù)統(tǒng)一存儲(chǔ),消息自描述昆咽,不需要生成stub代碼(支持生成IDL)
RPC調(diào)用在握手階段交換模式定義
包含完整的客戶端/服務(wù)端堆棧驾凶,可快速實(shí)現(xiàn)RPC
支持同步和異步通信
支持動(dòng)態(tài)消息
模式定義允許定義數(shù)據(jù)的排序(序列化時(shí)會(huì)遵循這個(gè)順序)
提供了基于Jetty內(nèi)核的服務(wù)基于Netty的服務(wù)
缺點(diǎn)
只支持Avro自己的序列化格式
語(yǔ)言綁定不如Thrift豐富