Dubbox:來自當當網的SOA服務框架
Dubbo是一個來自阿里巴巴的開源分布式服務框架,當當根據自身的需求,為Dubbo實現了一些新的功能,包括REST風格遠程調用、Kryo/FST序列化等等。并將其命名為Dubbox(即Dubbo eXtensions)。Dubbox主要的新功能包括:
一、支持REST風格遠程調用(HTTP + JSON/XML)
dubbo支持多種遠程調用方式,例如dubbo RPC(二進制序列化 + tcp協議)、http invoker(二進制序列化 + http協議,至少在開源版本沒發現對文本序列化的支持)、hessian(二進制序列化 + http協議)、WebServices (文本序列化 + http協議)等等,但缺乏對當今特別流行的REST風格遠程調用(文本序列化 + http協議)的支持。
dubbox基于非常成熟的JBoss RestEasy框架,在dubbo中實現了REST風格(HTTP + JSON/XML)的遠程調用,以顯著簡化企業內部的跨語言交互,同時顯著簡化企業對外的Open API、無線API甚至AJAX服務端等等的開發。事實上,這個REST調用也使得Dubbo可以對當今特別流行的“微服務”架構提供基礎性支持。 另外,REST調用也達到了比較高的性能,在基準測試下,HTTP + JSON與Dubbo 2.x默認的RPC協議(即TCP + Hessian2二進制序列化)之間只有1.5倍左右的差距。
REST的優點(摘自維基百科):
- 可更高效利用緩存來提高響應速度
- 通訊本身的無狀態性可以讓不同的服務器的處理一系列請求中的不同請求,提高服務器的擴展性
- 瀏覽器即可作為客戶端,簡化軟件需求
- 相對于其他疊加在HTTP協議之上的機制,REST的軟件依賴性更小
- 不需要額外的資源發現機制
- 在軟件技術演進中的長期的兼容性更好
基于簡單的文本格式消息和通用的HTTP協議,使REST具備極廣的適用性,幾乎所有語言和平臺都對它提供支持,同時其學習和使用的門檻也較低。在dubbo中支持REST,可以為當今多數主流的遠程調用場景都帶來好處:
- 顯著簡化企業內部的異構系統之間的(跨語言)調用。此處主要針對這種場景:dubbo的系統做服務提供端,其他語言的系統(也包括某些不基于 dubbo的java系統)做服務消費端,兩者通過HTTP和文本消息進行通信。即使相比Thrift、ProtoBuf等二進制跨語言調用方 案,REST也有自己獨特的優勢(詳見后面討論)
- 顯著簡化對外Open API(開放平臺)的開發。既可以用dubbo來開發專門的Open API應用,也可以將原內部使用的dubbo service直接“透明”發布為對外的Open REST API(當然dubbo本身未來最好可以較透明的提供諸如權限控制、頻次控制、計費等諸多功能)
- 顯著簡化手機(平板)APP或者PC桌面客戶端開發。類似于2,既可以用dubbo來開發專門針對無線或者桌面的服務器端,也可以將原內部使用的 dubbo service直接“透明”的暴露給手機APP或桌面程序。當然在有些項目中,手機或桌面程序也可以直接訪問以上場景2中所述的Open API。
- 顯著簡化瀏覽器AJAX應用的開發。類似于2,既可以用dubbo來開發專門的AJAX服務器端,也可以將原內部使用的dubbo service直接“透明”的暴露給瀏覽器中JavaScript。當然,很多AJAX應用更適合與web框架協同工作,所以直接訪問dubbo service在很多web項目中未必是一種非常優雅的架構。
- 為企業內部的dubbo系統之間(即服務提供端和消費端都是基于dubbo的系統)提供一種基于文本的、易讀的遠程調用方式。
- 一定程度簡化dubbo系統對其它異構系統的調用。可以用類似dubbo的簡便方式“透明”的調用非dubbo系統提供的REST服務(不管服務提供端是在企業內部還是外部)
需要指出的是, 1~3是dubbo的REST調用最有價值的三種應用場景,并且為dubbo添加REST調用,其最主要到目的也是面向服務的提供端,即開發REST服務來提供給非dubbo的(異構)消費端。歸納起來,所有應用場景如下圖所示:
二、支持基于Kryo和FST的Java高效序列化實現
dubbo RPC是dubbo體系中最核心的一種高性能、高吞吐量的遠程調用方式,簡單的說:
- 長連接:避免了每次調用新建TCP連接,提高了調用的響應速度
- 多路復用:單個TCP連接可交替傳輸多個請求和響應的消息,降低了連接的等待閑置時間,從而減少了同樣并發數下的網絡連接數,提高了系統吞吐量。
dubbo RPC主要用于兩個dubbo系統之間作遠程調用,特別適合高并發、小數據的互聯網場景。而序列化對于遠程調用的響應速度、吞吐量、網絡帶寬消耗等同樣也 起著至關重要的作用,是我們提升分布式系統性能的最關鍵因素之一。在dubbo RPC中,同時支持多種序列化方式,例如:
- dubbo序列化:阿里尚未開發成熟的高效java序列化實現,阿里不建議在生產環境使用它
- hessian2序列化:hessian是一種跨語言的高效二進制序列化方式。但這里實際不是原生的hessian2序列化,而是阿里修改過的hessian lite,它是dubbo RPC默認啟用的序列化方式
- json序列化:目前有兩種實現,一種是采用的阿里的fastjson庫,另一種是采用dubbo中自己實現的簡單json庫,但其實現都不是特別成熟,而且json這種文本序列化性能一般不如上面兩種二進制序列化。
- java序列化:主要是采用JDK自帶的Java序列化實現,性能很不理想。
在通常情況下,這四種主要序列化方式的性能從上到下依次遞減。對于dubbo RPC這種追求高性能的遠程調用方式來說,實際上只有1、2兩種高效序列化方式比較般配,而第1個dubbo序列化由于還不成熟,所以實際只剩下2可用, 所以dubbo RPC默認采用hessian2序列化。但hessian是一個比較老的序列化實現了,而且它是跨語言的,所以不是單獨針對java進行優化的。而 dubbo RPC實際上完全是一種Java to Java的遠程調用,其實沒有必要采用跨語言的序列化方式(當然肯定也不排斥跨語言的序列化)。
最近幾年,各種新的高效序列化方式層出不窮,不斷刷新序列化性能的上限,最典型的包括:
- 專門針對Java語言的:Kryo,FST等等
- 跨語言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等
這些序列化方式的性能多數都顯著優于hessian2(甚至包括尚未成熟的dubbo序列化)。有鑒于此,我們為dubbo引入Kryo和FST這 兩種高效Java序列化實現,來逐步取代hessian2。其中,Kryo是一種非常成熟的序列化實現,已經在推ter、Groupon、 Yahoo以及多個著名開源項目(如Hive、Storm)中廣泛的使用。而FST是一種較新的序列化實現,目前還缺乏足夠多的成熟使用案例,但它還是非 常有前途的。
三、其他新功特性
- 支持基于嵌入式Tomcat的HTTP remoting體系:基于嵌入式tomcat實現dubbo的 HTTP remoting體系(即dubbo-remoting-http),用以逐步取代Dubbo中舊版本的嵌入式Jetty,可以顯著的提高REST等的遠 程調用性能,并將Servlet API的支持從5升級到3.1。(注:除了REST,dubbo中的WebServices、Hessian、HTTP Invoker等協議都基于這個HTTP remoting體系)。
- 升級Spring:將dubbo中Spring由x升級到目前最常用的3.x版本,減少項目中版本沖突帶來的麻煩。
- 升級ZooKeeper客戶端:將dubbo中的zookeeper客戶端升級到最新的版本,以修正老版本中包含的bug。
參考文檔:
</div> 來自:http://www.biaodianfu.com/dubbox.html