同学们以为Dubbo只有一个RPC协议吗?非也,既然是阿里巴巴出品的开源项目,那自然秉承了“包罗万象”的一贯传统。Dubbo的底层有支持多达9种通信协议,并且他们都有各自的适用场景。我们快速的一扫而过:
我们先来看一看 Dubbo协议的特性:
项目 | 说明 |
---|---|
连接个数 | 单连接 |
连接方式 | 长连接 |
传输协议 | TCP |
底层通信框架 | Netty异步NIO |
序列化方式 | Hessian2或Dubbo序列化 |
在官方的测试报告中,由于Dubbo将底层的通信框架从mina换成了Netty,大大提升了稳定性,主要体现在JVM Old区对象的数量减少了很多,因此Full GC的触发频率大幅减少。
尺有所短寸有所长,Dubbo并不是万能药,我们在使用它之前务必要知道它的适用场景:
适用场景传入传出参数数据包较小(建议小于100K),但是并发量高的场景。简单来说就是短平快,QPS/TPS高但是数据量小的情况
不适场景尽量不要用Dubbo协议传输大数据包(比如大文件、视频、超大字符串等),这类场景建议使用上面介绍过的其他协议栈
接下来我们通过一幅图,看一下Dubbo协议的工作流程
这次我们换个姿势,采用从中间向两边展开的方式解读这个协议工作流程
大家注意看图片底部最中间的Transporter,这个是底层网络传输组件,目前Dubbo支持Mina和Netty。大家可能对Netty比较熟悉,但并没有接触过Mina。在Dubbo的2.0版本以后已经从Mina全面替换为Netty,基于Netty的传输层在稳定性和性能上都要更好一些。
接下来我们看图中的绿色部分,就是Header和Body,这部分是Dubbo定义的私有RPC协议中的数据格式部分,它是一个变长协议,由定长的Header和不定长的Body组成。
上面是Header的结构,图片中的数字代表Header中Bit位置,下 面的文字表示这段字节所携带的信息,Header总 长度为16字节。其中Magic High=0xda, Magic Low=0xbb,标识了这是个Dubbo协议。
后面紧跟着16-23比特位带有两个信息:当前请求的类型以及序列化的方式。其中高四位表示当前请求的Request flag (有 三种类型: REQUEST, TWOWAY和EVENT),低四位表示序列化的方式,Du bbo有四种序列化方式,分别对应Dubbo, FastJson, Hessian2和Java 原生序列化。
接下来24-31位是响应报文才有的信息,作为Request报文并不包含这部分信息。其中定义了详情请求的状态,比如OK,BAD_ RESP ONSE,SERVER TIMEOUT。注意这些Status Code可不是HTTP St atus,而是Dubbo自定义的状态。
最后两个部分分别对应Request ID (唯一请求ID)和经过序列化后的Body内容的长度。
这部分是Dubbo协议中不定长的部分,在传输之前会经过序列化处理,对于一个请求包来说,主要包含三部分的信息:
Client对应调用发起方,Server对 应服务提供方。
Dispatcher用来创建具有线程派发能力的ChannelHandler,将来访Request派发到线程池或当前I0线程。我们可以给Dispatcher配置5种派发策略
策略 | 说明 |
---|---|
all | 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件等 |
direct | 所有消息都不派发到线程池,全部在IO线程上直接执行 |
message | 只有请求和响应消息派发到线程池,其它消息均在IO线程上执行 |
execution | 只有请求消息派发到线程池,不含响应。其它消息均在IO线程上执行 |
connection | 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池 |
既然Dubbo协议应用了序列化和反序列化技术,那么对我们数据传输有几个约束条件:
Dubbo支持同步和异步两种调用方式,整个链路流程非常复杂,我们只抓重点看下两个调用模式的不同
本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。