dubbo连接所使用的协议
- dubbo协议:
- rmi://协议
- hessian://协议
- HTTP://协议
- webservice://协议
- thrift://协议
- memcached://协议
- redis://协议
)
dubbo协议:
使用场景:Dubbo协议使用单一长连接和NIO异步通讯,适合小数据量大并发的场景使用,以及服务消费者数远大于服务提供者数量。
反之,Dubbo协议不适合传输大数据量的情况,比如传文件,传视频等。除非是访问量特别小。
特性:缺省协议,使用minaia1.1.7 和 hessian3.2.1的tbremoting 交互。
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出的参数较小(建议在100K之内),消费者数量比提供者数量多,单一的消费者无法压满服务提供者,尽量不要使用dubbo协议传输数据量大的文件。
使用场景:常规的远程方法调用。
rmi://协议
RMI使用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。
注意:如果正在使用RMI协议给外部提供服务,但同时在项目中依赖了,老的common-collections包,存在反序列化的危险。
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:TCP
- 传输方式:同步传输
- 序列化:Java标准二进制序列化
- 适用范围:传入传出参数大小混合,消费者和提供者数量差不多,可以传输文件。
- 使用场景:常规远程服务方法调用,与原生RMI服务互操作。
hessian://协议
使用场景:Hessian协议用于集成Hessian的服务。Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty服务器实现。
Dubbo的Hessian协议和原生的Hessian服务互操作,即:
- 提供者使用Dubbo的Hessian协议暴露服务,使用者直接调用标准Hessian接口使用
- 提供者使用标准的Hessian协议暴露服务,消费者使用Dubbo的Hessian接口直接使用。
特性:
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:HTTP
- 传输方式:同步传输
- 序列化:Hessian 二进制序列化
- 适用范围:传入传出参数数据量较大,提供者比消费者多,提供者压力较大,可以传输文件。
- 使用场景:页面传输,文件传输,或于原生的Hessian服务互操作。
HTTP://协议
基于http表单的远程调用协议,采用spring的HttpInvoker实现。
特性:
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:HTTP
- 传输方式:同步传输
- 序列化:表单序列化
- 适用范围:传入传出参数数据包大小混合,提供者比消费者多,可用浏览器查看,可用表单或者JS传入参数,暂不支持传输文件。
- 使用场景:同时给服务器和浏览器JS使用的服务。
webservice://协议
基于WebService的远程调用协议,基于Apache CXF的frontend-simple和traansports-http实现。可以和原生WebService服务互操作。
- 提供者用Dubbo的WebService协议暴露服务,消费者直接使用标准的WebService接口调用。
- 或者提供方直接使用标准的WebService暴露服务,消费者使用Dubbo的WebService协议调用。
特性:
- 连接个数:多连接
- 连接方式:短连接
- 传输协议:HTTP
- 传输方式:同步传输
- 序列化:SOAP文本序列化
- 使用场景:系统集成,跨语言调用
thrift://协议
使用场景:当前Dubbo支持的thrift协议是对thrift原生协议的扩展,在原生协议的基础上添加一些额外的头信息,比如service name,magic number等。
使用dubbo thrift协议同样需要使用thrift的idlcompiler编译生成相应的java代码,后续版本中会在这方面做一点增强。
memcached://协议
基于memcached实现的RPC协议
注册memcached服务的地址
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash"));
在客户端使用:
<dubbo:reference id="cache" interface="java.util.Map" group="member" />
也可以使用自定义的接口:
<dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" />
方法名建议和memcached的标准方法名相同,即:get(key),set(key,value),delete(value)。
如果方法名和memcached的标准方法名不同,则需要配置映射关系:
<dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" p:set="putFoo" p:get="getFoo" p:delete="removeFoo" />
redis://协议
基于Redis实现的RPC协议
注册redis服务的地址
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("redis://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash"));
在客户端使用:
<dubbo:reference id="store" interface="java.util.Map" group="member" />
或者,点对点直连:
<dubbo:reference id="store" interface="java.util.Map" url="redis://10.20.153.10:6379" />
也可以使用自定义接口:
<dubbo:reference id="store" interface="com.foo.StoreService" url="redis://10.20.153.10:6379" />
方法名建议和 redis 的标准方法名相同,即:get(key), set(key, value), delet(key)。如果方法名和 redis 的标准方法名不相同,则需要配置映射关系:
<dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" p:set="putFoo" p:get="getFoo" p:delete="removeFoo" />