Java領域中的RPC開源方案
1. Avro http://avro.apache.org/ 大名鼎鼎的Hadoop的子項目。它本身即是一個序列化框架,同時也實現RPC的功能;
Avro序列化特點:支持跨語言實現,與 Apache Thrift 和Google的Protocol Buffers相比,Avro的優勢在于支持動態模式,即可以不生成代碼,避免了侵入性,作為POJO的DTO(數據傳輸對象)是不適合用代碼生成的。還有Avro序列化時由于不需要字段標識符來打標簽,所以使用它序列化生成的數據小(應該是現有序列化系統中最精簡的了),最后它的性能也非常優秀。
Avro自帶的RPC實現有自己的亮點,比如支持同步和異步調用,有握手協議功能,狀態監控完善。但是它綁定了Avro序列化,不支持協議的擴展,也不支持擴展序列化方式,在擴展性上有待改進。
2. nfs-rpc http://code.google.com/p/nfs-rpc/ 淘寶牛人開源的一個RPC框架。傳輸層使用mina/netty,協議層靈活可擴展,支持多種序列化方式目前支持Hessian ,Java,Protocol Buffers,序列化方式可擴展。該框架設計非常優秀,代碼質量高,可讀性強,結構清晰,層次分明。
nfs-rpc是一個非常優秀的RPC基礎框架,在它的基礎上進行擴展開發也非常方便。從序列化方式來看Java序列化雖然使用簡單,但性能不高,不能跨語言。Hessian,能跨語言,使用也很方便,但性能不占優勢。
3. Dubbo http://code.alibabatech.com/wiki/display/dubbo/Home-zh 阿里開源的一個分布式服務框架,致力于提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。功能非常強大,尤其是提供了完善的服務治理功能,非常適合大型的分布式應用。但是對于中小型應用來說似乎有點太重了。
4、missian也是類似的 http://missian.iteye.com/blog/829780
5、http://summercool-hsf.googlecode.com/svn/trunk/
總結:
1) 從序列化方式來看,Apache Thrift 和Google的Protocol Buffers和Avro應該是屬于同一個級別的框架,都能跨語言,性能優秀,數據精簡,但是Avro的動態模式(不用生成代碼,而且性能很好)這個特點讓人非常喜歡,比較適合RPC的數據交換。
2) RPC邏輯上分為二層,一是傳輸層,負責網絡通信;二是協議層,將數據按照一定協議格式打包和解包。 決定參考前面三個開源框架的特點,實現一個輕量級的RPC框架。
3.avro-rpc介紹
avro-rpc 是一個支持跨語言實現的RPC服務框架。非常輕量級,實現簡潔,使用方便,同時也方便使用者進行二次開發,邏輯上該框架分為兩層:
1:網絡傳輸層。使用Netty的Nio實現。
2:協議層。可擴展目前支持的數據序列化方式有Avro,Json, Hessian,Java序列化。 使用者可以注冊自己的協議格式及序列化方式。
主要特點:
1:客戶端傳輸層與應用層邏輯分離,傳輸層主要職責包括創建連接,連接查找與復用,傳輸數據,接收服務端回復后回調應用層;
2:客戶端支持同步調用和異步調用。服務異步化能很好的提高系統吞吐量,建議使用異步調用。為防止異步發送請求過快,客戶端增加了“請求流量限制”功能,調用超時管理。
3:服務端有一個協議注冊工廠和序列化注冊工廠。這樣方便針對不同的應用場景來定制服務方式。RPC應該只是服務方式的一種。在分布式的系統架構中,分布式節點之間的通信會存在多種方式,比如MQ的TOP消息,一個消息可以有多個訂閱者。因此avro-rpc不僅僅是一個RPC服務框架,還是一個分布式通信的一個基礎骨架,提供了很好的擴展性;
4:非常輕量級,性能好,適合二次開發。
運行性能測試實例
1. 啟動服務端 code.google.dsf.test.StartServerTest
2. 運行客戶端 code.google.dsf.test.performance.RPSTest
測試對象,客戶端采用異步方式發送一個POJO(10個屬性字段)對象
兩臺,一臺運行客戶端,一臺運行服務端,配置如下:
· CPU: E5645 @ 2.40GHz 2 core
· Memory: 2G
· Network: 1000Mb
JVM Options: -server -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx1024M
程序執行6分鐘,RPS: 70108