Dubbo 的通信协议

/ 分布式 / 297浏览

Dubbo所支持8种通信协议供我们选择使用。在实际项目中,不同的应用一般对应不同的服务,选择合适的协议便是一件非常重要的事情。

那么,我们可以根据自己的应用特性来进行选择相应的协议,例如:

dubbo://

Dubbo协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
Dubbo协议不适合传送大数据量的场景,比如传文件,传视频等,除非请求量很低;
Dubbo官方推荐使用Dubbo协议,Dubbo协议也是Dubbo默认的协议;

连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO 异步传输
序列化:Hessian 二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,尽量不要用 dubbo 协议传输大文件或超大字符串。
⭐适用场景:常规远程服务方法调用。

配置位置:

<dubbo:protocol name="dubbo" />
<dubbo:provider protocol="dubbo" />
<dubbo:service protocol="dubbo" />
<dubbo:reference protocol="dubbo" />

hessian://

Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。

连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件;
⭐适用场景:页面传输,文件传输,或与原生hessian服务互操作。

Hessian是Caucho开源的一个RPC框架:http://hessian.caucho.com,其通讯效率高于WebService和Java自带的序列化。

http://

采用Spring的HttpInvoker实现,基于http表单的远程调用协议。

连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化

⭐适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。

⭐适用场景:需同时给应用程序和浏览器JS使用的服务。

rmi://

RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式,是Java标准的远程调用协议。

连接个数:多连接
连接方式:短连接
传输协议:TCP
传输方式:同步传输
序列化:Java标准二进制序列化
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。

⭐适用场景:常规远程服务方法调用,与原生RMI服务互操作。

webservice://

基于CXF的frontend-simple和transports-http实现,CXF是Apache开源的一个RPC框架:http://cxf.apache.org,由Xfire和Celtix合并而来。

提供者用Dubbo的WebService协议暴露服务,消费者直接用标准WebService接口调用,或者提供方用标准WebService暴露服务,消费方用Dubbo的WebService协议调用。

基于WebService的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:SOAP文本序列化

⭐适用场景:系统集成,跨语言调用。

thrift://

Thrift是Facebook捐给Apache的一个RPC框架;
参见:http://thrift.apache.org

当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。

使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码,后续版本中会在这方面做一些增强。

memcached://

Memcached是一个高效的KV缓存服务器;
参见:http://memcached.org/

redis://

Redis是一个高效的KV存储服务器;
参见:http://redis.io