Dubbo协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo协议相关的知识,希望对你有一定的参考价值。

参考技术A         TCP协议栈中, 每层模型都有自己的协议报文格式 ,TCP协议是网络七层模型中的 传输层 ,在TCP上层是应用层, 应用层协议常见的有telnet 等, Dubbo协议作为建立在TCP协议之上的一种协议 ,自然也有自己的协议包格式。

       Dubbo协议也是由 header和body 两部分组成,Dubbo 协议采用 经典定长包头 + 变长包体 的协议设计,包头记录了 数据的序列化方式 , 请求状态 , 数据长度 等信息,包体是 请求/响应对象序列化后的二进制数据 。格式见下图

header格式如下:

字段说明:

1)其中前两个列为魔数,类似Class类文件里面的作用,这里用来标识一个帧的开始,固定为0xdabb.其中第一个字节固定为0xda,第二个字节固定为0xbb.

2)第3个列是请求和序列化标记的组合结果requstflag|serializationId。

3)第4个列是响应报文里面才设置(请求报文里面不设置),用来标示响应的结果码

4)第5个列是请求id

5)第6个列是body内容大小,单位是byte.

请求报文设置:

响应报文设置:

Dubbo多协议支持

除了Dubbo服务暴露协议Dubbo协议外,Dubbo框架还支持另外8种服务暴露协议:RMI协议、Hessian协议、HTTP协议、WebService协议、Thrift协议、Memcached协议、Redis协议、Rest协议。但在实际生产中,使用最多的就是Dubbo服务暴露协议

(1) dubbo协议

小数据大并发使用Dubbo,大数据小并发使用其它

  • Dubbo默认传输协议
  • 连接个数:单连接
  • 连接方式:长连接
  • 传输协议:TCP
  • 传输方式:NIO 异步传输
  •  适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串

(2) rmi协议

采用 JDK 标准的 java.rmi.* 实现

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:TCP
  • 传输方式:BIO同步传输
  • 适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件

(3) hession协议

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:HTTP
  • 传输方式:BIO同步传输
  • 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者抗压能力较大,可传文件

(4) http协议

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:HTTP
  • 传输方式:BIO同步传输
  • 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件

(5) webService协议

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:HTTP
  • 传输方式:BIO同步传输
  • 适用场景:系统集成,跨语言调用

(6) thrift协议

Thrift 是 Facebook 捐给 Apache 的一个 RPC 框架,其消息传递采用的协议即为thrift协议。当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展。Thrift协议不支持null值的传递

(7) memcached协议与redis协议

它们都是高效的KV缓存服务器。它们会对传输的数据使用相应的技术进行缓存

(8) rest协议

若需要开发具有RESTful风格的服务,则需要使用该协议


多种协议使用

对于多协议的用法有两种,一种是同一个服务支持多种协议,一种是不同的服务使用不同的协议。首先来看“同一服务支持多种协议”的用法

一、同一服务支持多种协议

(1) 修改提供者配置文件

在提供者中要首先声明新添加的协议,然后在服务<dubbo:service/>标签中再增加该新的协议。若不指定,默认为dubbo协议

技术图片

这里需要理解这个服务暴露协议的意义。其是指出,消费者若要连接当前的服务,就需要通过这里指定的协议及端口号进行访问。这里的端口号可以是任意的,不一定非要使用默认的端口号(Dubbo默认为20880,rmi默认为1099)。这里指定的协议名称及端口号,在当前服务注册到注册中心时会一并写入到服务映射表中。当消费者根据服务名称查找到相应主机时,其同时会查询出消费此服务的协议、端口号等信息。其底层就是一个Socket编程,通过主机名与端口号进行连接

(2)修改消费者配置文件

在消费者引用服务时要指出所要使用的协议

技术图片

(3)应用场景

“同一服务支持多种协议”的应用场景是:系统在使用过程中其使用场景逐渐发生了变化,例如,由原来的消费者数量多于提供者数量,变为了消费者数量与提供者数量差不多了,并且原来系统不用传输文件,现在的系统需要传输文件了。此时就将将原来默认的dubbo协议更换为rmi协议。目的是为了兼容老工程,扩展新功能。

 

二、不同服务使用不同协议

(1)应用场景

同一个系统中不同的业务具有不同的特点,所以它们的传输协议就应该根据它们的特点选择不同的协议。
例如对于前面使用服务分组实现的“微信支付”与“支付宝支付”,就可以针对不同的支付方式,使用不同的协议

(2) 修改提供者配置文件

在使用<dubbo:service/>暴露服务时通过protocal属性指定所要使用的服务协议

技术图片

(3) 修改消费者配置文件

消费者端通过<dubbo:reference/>引用服务时通过添加protocal属性指定要使用的服务协议

技术图片

 


以上是关于Dubbo协议的主要内容,如果未能解决你的问题,请参考以下文章

dubbo协议

Dubbo 协议

Dubbo -- 多协议支持

dubbo内部通信用的啥协议

dubbo协议端口

Dubbo源码,详解dubbo协议数据包及解包过程