Dubbo连接使用协议

doMore 1,181 2019-09-27

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" />