• dubbo://

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器远大于服务提供者机器数的情况。

设置默认协议:

<dubbo:provider protocol="dubbo"/>

为服务设置协议:

<dubbo:service protocol="dubbo"/>

多端口:

<dubbo:protocol id="dubbo1" name="dubbo" port="20880"/>  
<dubbo:protocol id="dubbo2" name="dubbo" port="20881"/>

Dubbo协议的默认选项:

 

<dubbo:protocol name=“dubbo” port=“9090” server=“netty” client=“netty” codec=“dubbo” serialization=“hessian2” charset=“UTF-8” threadpool=“fixed” threads=“100” queues=“0” iothreads=“9” buffer=“8192” accepts=“1000” payload=“8388608” />

dubbo使用其他协议 dubbo默认通信协议_java

(1)Transporter(传输层):

 mina, netty, grizzy

(2)Serialization(序列化):

dubbo, hessian2, java, json

(3)Dispatcher

all, direct, message, execution, connection

(4)ThreadPool

fixed, cached

 

 

Dubbo协议缺省每服务每提供者每消费者使用单一长连接,如果数据量大,可以使用多个连接 。

<dubbo:protocol name="dubbo"connections="2"/>
<dubbo:service connections=”0”>或<dubbo:reference connections=”0”>表示该服务使用JVM共享长连接。(缺省)
<dubbo:service connections=”1”>或<dubbo:reference connections=”1”>表示该服务使用独立长连接。
<dubbo:service connections=”2”>或<dubbo:reference connections=”2”>表示该服务使用独立两条长连接

 

为防止被大量连接撑挂,可在服务提供方限制最大接收连接数,以实现服务提供方自我保护。

 

<dubbo:protocol name="dubbo" accepts="1000"/>

缺省协议,使用基于mina+hessian的交互。

(1)连接个数:单连接。

(2)连接方式:长连接。

(3)传输方式:TCP。

(4)传输方式:NIO异步传输。

(5)序列化:Hessian二进制序列化。

(6)适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dbbuo协议传输大文件或超大字符串。

(7)适用场景:常规远程服务方法调用。

 

为什么要消费者比提供者个数多:

因为dubbo协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte),根据测试经验数据每条连接最多只能压满7MByte,理论上1个服务提供者需要20个服务消费者才能压江网卡。

 

为什么不能传大包:

如果每次请求的数据包大小为500KByte,假设网络为千兆网卡,每条连接最大7MByte那么

(1)单个服务提供者的TPS最大为128MByte/500KByte = 262

(2)单个消费者调用单个服务提供者的TPS最大为:7MByte/500KByte = 14

如果能接受,可以考虑使用,否则网络将成为瓶颈。

 

为什么采用异步单一长连接:

(1)通过单一连接,保证单一消费者不会压死提供者,因为服务的现状大都是服务提供者少,而服务消费者多。

(2)长连接,减少连接握手验证等。

(3)使用异步IO,复用线程池,防止C10k(concurrent 10000,指的是服务器同时支持成千上万个客户端的问题)问题。

 

约束:

(1)参数及返回值需实现Serializable接口。

(2)参数及返回值 不能自定义实现List , Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为Hessian会做特殊处理,自定义实现类中的属性值都会丢失。

数据通讯 

情况 

结果 

A->B 

类A多一种 属性(或者说类B少一种 属性) 

不抛异常,A多的那 个属性的值,B没有, 其他正常 

A->B 

枚举A多一种 枚举(或者说B少一种 枚举),A使用多 出来的枚举进行传输 

抛异常 

A->B 

枚举A多一种 枚举(或者说B少一种 枚举),A不使用 多出来的枚举进行传输 

不抛异常,B正常接 收数据 

A->B 

A和B的属性 名相同,但类型不相同 

抛异常 

A->B 

serialId 不相同 

正常传输 

 

  • rmi://

RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。如果正在使用RMI提供服务组外部 访问,同时应用里依赖了老的common-collections包,存在反序列化安全风险。

(1)将commons-collections3 升级到3.2.2版本。

(2)将commons-collections4升级到4.1版本。

 

 

(1)如果服务接口继承了java.rmi.Remote接口,可以和原生RMI互操作,即:

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

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

(2)如果服务接口没有继承java.rmi.Remote接口

缺省Dubbo将自动生成一个com.xxx.XxxService$Remote的接口,并继承java.rmi.Remote接口,并以此接口暴露服务。

如果设置 了<dubbo:protocol name="rmi" codec="spring" />,将不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服务,和Spring美容。

 

 

设置为默认协议:

<dubbo:provider protocol="rmi"/>

为服务设置协议:

<dubbo:service protocol="rmi"/>

兼容Spring

<dubbo:protocol name="rmi" codec="spring"/>

 

(1)连接个数:多连接。

(2)连接方式:短连接。

(3)传输协议:TCP。

(4)传输方式:同步传输。

(5)序列化:Java标准二进序列化。

(6)适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。

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

 

约束:

(1)参数及返回值 需要实现Serializable接口。

(2)dubbo配置中的超时时间对rmi无效,需要用java 启动参数设置:

 

java -Dsun.rmi.transport.tcp.responseTimeout=3000

 

  •  hessian://

Hessian底层采用Http通讯,采用Servlet暴露服务,是Caucho开源的一个RPC框架,其通讯效率高于Webservice和java自带的充钱化。

可以和原生Hessian服务互操作。

(1)连接个数:多连接。

(2)传输方式:短连接。

(3)传输协议:HTTP。

(4)传输方式:同步传输。

(5)序列化:Hessian二进制序列化。

(6)适用范围:传入传出参数数据包较大,提供者比消费者个数大,可传文件。

(7)适用场景:页面传输,文件传输,或与原生hessian服务互操作。

 

约束:

(1)参数及返回值需要实现Serializable接口。

(2)参数及返回值不能自定义 实现List, Map, Number, Date Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失。

 

设置为默认协议:

<dubbo:provider protocol="hessian"/>

为服务设置协议:

<dubbo:service protocol="hessian"/>

直接指定提供者:

<dubbo:reference id="helloService" interface="HelloWorld" url="hessian://10.20.153.10:8080/helloWorld"/>

 

  • http://

采用Spring的HttpInvoker实现。

(1)连接个数:多连接。

(2)连接方式:短连接。

(3)传输协议:HTTP。

(4)传输方式:同步传输。

(5)序列化:表单序列化。

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

(7)适用场景:需同进给应用程序和浏览器JS使用的服务。

 

约束:

参数及返回值需符合Bean规范。

 

  • webservice://

基于CXF,CXF是Apache开源的一个RPC框架,由Xfire和Celtix合并而来。

可以和原生WebService服务互操作。

(1)连接个数:多个连接。

(2)连接方式:短连接。

(3)传输协议:HTTP

(4)传输方式:同步传输。

(5)序列化:SOAP文本序列化。

(6)适用场景:系统集成,跨语言调用。

 

约束:

(1)参数及返回值需实现Serializable接口。

(2)参数尽量使用基本类型和POJO。

 

 

  • thrift://

Thrift是Facebook捐给Apache的一个RPC框架,当前dubbo支持的thrift协议是对thrift原生协议的扩展,在原生协议的基础上添加一些窗外的头信息。

null值不能在thrift协议中传递。

  • memcached://

Memcached是一个高效的KV缓存服务器。

 

  • redis://

Redis是一个高效的KV存储服务器。