Dubbo RPC服务框架支持丰富的传输协议、序列化方式等通讯相关的配置和扩展。dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC请求,注册中心分配服务URL并路由到具体服务提供方(Provider),消费者和服务提供方建立网络连接,服务提供方在本地创建连接池对象并提供远程服务,对于长连接类型协议(如dubbo协议)将保持连接,减少握手认证,调用过程中可以避免频繁建立和断开连接导致的性能开销,保持长连接需要有心跳包的发送,所以对于非频繁调用的服务保持连接同样会有消耗。更多关于dubbo详细介绍请参照官方文档(http://alibaba.github.io/dubbo-doc-static/Home-zh.htm)。
1、支持常见的传输协议:RMI、Dubbo、Hessain、WebService、Http等,其中Dubbo和RMI协议基于TCP实现,Hessian和WebService基于HTTP实现。
2、传输框架:Netty、Mina、以及基于servlet等方式。
3、序列化方式:Hessian2、dubbo、JSON(fastjson 实现)、JAVA、SOAP 等。
本文主要基于dubbo框架下的通讯协议进行性能测试对比。
二、测试方案
基于dubbo 2.5.3框架,使用zookeeper作为dubbo服务注册中心,分别以单线程和多线程的方式测试以下方案:
| Protocol | Transporter | Serialization | Remark | |
| A | dubbo 协议 | netty | hessian2 | |
| B | dubbo 协议 | netty | dubbo | |
| C | dubbo 协议 | netty | java | |
| D | RMI 协议 | netty | java | |
| E | RMI 协议 | netty | hessian2 | |
| F | Hessian 协议 | servlet | hessian2 | Hessian,基于tomcat容器 |
| G | WebService 协议 | servlet | SOAP | CXF,基于tomcat容器 |
三、传输测试数据
1、单POJO对象,嵌套复杂集合类型
2、POJO集合,包含100个单POJO对象
3、1K字符串
4、100K字符串
5、1M字符串
四、服务接口和实现
1、服务接口相关代码:
1 package ibusiness; 2 3 import java.util.List; 4 5 import model.*; 6 7 public interface IBusinessOrder { 8 public String SendStr(String str); 9 10 public List<OrderInfo> LoadOrders(List<OrderInfo> orders); 11 12 public OrderInfo LoadOrder(OrderInfo order); 13 }
2、服务实现相关代码,测试数据在服务器端不做任何处理原样返回:
1 package business; 2 3 import ibusiness.IBusinessOrder; 4 5 import java.util.List; 6 7 import model.*; 8 9 public class BusinessOrder implements IBusinessOrder { 10 public String SendStr(String str) { 11 return str; 12 } 13 14 public List<OrderInfo> LoadOrders(List<OrderInfo> orders) { 15 return orders; 16 } 17 18 public OrderInfo LoadOrder(OrderInfo order) { 19 return order; 20 } 21 }