Java领域中的RPC开源方案

jopen 9年前

1. Avro  http://avro.apache.org/ 大名鼎鼎的Hadoop的子项目。它本身即是一个序列化框架,同时也实现RPC的功能;

Avro序列化特点:支持跨语言实现,与 Apache Thrift GoogleProtocol Buffers相比,Avro的优势在于支持动态模式,即可以不生成代码,避免了侵入性,作为POJODTO(数据传输对象)是不适合用代码生成的。还有Avro序列化时由于不需要字段标识符来打标签,所以使用它序列化生成的数据小(应该是现有序列化系统中最精简的了),最后它的性能也非常优秀。

Avro自带的RPC实现有自己的亮点,比如支持同步和异步调用,有握手协议功能,状态监控完善。但是它绑定了Avro序列化,不支持协议的扩展,也不支持扩展序列化方式,在扩展性上有待改进。

2. nfs-rpc http://code.google.com/p/nfs-rpc/ 淘宝牛人开源的一个RPC框架。传输层使用mina/netty,协议层灵活可扩展,支持多种序列化方式目前支持Hessian JavaProtocol 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 GoogleProtocol BuffersAvro应该是属于同一个级别的框架,都能跨语言,性能优秀,数据精简,但是Avro的动态模式(不用生成代码,而且性能很好)这个特点让人非常喜欢,比较适合RPC的数据交换。

2) RPC逻辑上分为二层,一是传输层,负责网络通信;二是协议层,将数据按照一定协议格式打包和解包。 决定参考前面三个开源框架的特点,实现一个轻量级的RPC框架。

 

 

3avro-rpc介绍

avro-rpc 是一个支持跨语言实现的RPC服务框架。非常轻量级,实现简洁,使用方便,同时也方便使用者进行二次开发,逻辑上该框架分为两层:

1:网络传输层。使用NettyNio实现。

2:协议层。可扩展目前支持的数据序列化方式有AvroJson, Hessian,Java序列化。 使用者可以注册自己的协议格式及序列化方式。

主要特点:

1:客户端传输层与应用层逻辑分离,传输层主要职责包括创建连接,连接查找与复用,传输数据,接收服务端回复后回调应用层;

2:客户端支持同步调用和异步调用。服务异步化能很好的提高系统吞吐量,建议使用异步调用。为防止异步发送请求过快,客户端增加了“请求流量限制”功能,调用超时管理。

3:服务端有一个协议注册工厂和序列化注册工厂。这样方便针对不同的应用场景来定制服务方式。RPC应该只是服务方式的一种。在分布式的系统架构中,分布式节点之间的通信会存在多种方式,比如MQTOP消息,一个消息可以有多个订阅者。因此avro-rpc不仅仅是一个RPC服务框架,还是一个分布式通信的一个基础骨架,提供了很好的扩展性;

4:非常轻量级,性能好,适合二次开发。



运行性能测试实例

1. 启动服务端 code.google.dsf.test.StartServerTest

2. 运行客户端 code.google.dsf.test.performance.RPSTest

测试对象,客户端采用异步方式发送一个POJO10个属性字段)对象

两台,一台运行客户端,一台运行服务端,配置如下:

· CPU: E5645 @ 2.40GHz 2 core

· Memory: 2G

· Network: 1000Mb

 

JVM Options: -server -XX:+UseParallelGC  -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx1024M

 

程序执行6分钟,RPS: 70108