dubbo 协议

news/2024/7/4 22:58:08
  • 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” />  


(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存储服务器。

 

最后欢迎大家访问我的个人网站:1024s


http://www.niftyadmin.cn/n/1275819.html

相关文章

解决软件开发中常见的问题

互联网行业火吗?火。火到了什么地步?大概已经到了让大家已经离不开的程度了。在前端时在网上就看到一个话题&#xff0c;很多人在谈论互联网的是绑架人类还是帮助了人类。我就不由想起前段时间&#xff0c;人们在家里隔离&#xff0c;只能靠着互联网娱乐、购物、社交、工作、…

在2021年, Python是否会全面超越 Java?

第一&#xff0c;简单地看 Python是否比 Java更受欢迎并没有多大意义&#xff0c;事实上&#xff0c;尽管 Java和 Python都是非常受欢迎的全场景编程语言&#xff0c;但 Python和 Java仍然各有侧重。 在IT互联网行业的生产环境下&#xff0c;Java的应用还是非常普遍的&#xf…

程序员编程入门一定知道!程序员需要学什么?

编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码&#xff0c;并最终得到结果的过程。在信息时代的背景下&#xff0c;计算机的应用扮演着重要的角色&#xff0c;而对于巨大的市场需求来说&#xff0c;精通计算机的人才仍然稀缺&#xff0c;所以计算机行业的…

day1 学习历程

day1 我是一个在校大三学生&#xff0c;一个依然迷茫不知前景的大学混子 &#xff0c;可以这么说吧 大学混子 真正开始决定好好学习大概在去年的12月份 那时经老师的提醒 开始正式接触软件开发 于是 从头开始学习语言 下了很大的决心 开始从C学习开始 然后学习了不到一个星期 听…

dubbo 并发控制 和 连接控制

并发控制 &#xff08;1&#xff09;服务端并发执行&#xff08;或占用线程池线程数&#xff09;不能超过10个。 <dubbo:service interface"com.foo.BarService" executes"10" /> &#xff08;2&#xff09;限制到方法 <dubbo:service interfac…

运动APP软件开发具有什么好处?

人的身体健康离不开有效的运动&#xff0c;为了满足用户在运动方面的需求&#xff0c;健身运动 APP开发也开始出现&#xff0c;通过方便的手机平台为用户提供一条龙的运动服务。 运动APP软件开发具有什么好处&#xff1f; 对经营者来说&#xff1a; 降低用户管理的难度&…

linux下用户管理命令详细解释

linux下用户管理命令详细解释1.useradd,增加用户命令格式&#xff1a;useradd [选项] 用户名选项&#xff1a;-u 表示UID举例说明: useradd -u 888 user11-g 表示GID举例说明: useradd -g mysql user12-G 表示GID,GID,GID,...额外组即用户可以属于其他多个组举例说明: useradd …