欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dubbo连接使用协议

程序员文章站 2022-07-15 15:55:07
...


)

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" />
相关标签: Dubbo 协议 Java