Dubbo——协议详解
Dubbo协议详解
Dubbo协议设计参考了现有TCP/IP协议。一次RPC调用包括协议头和协议体两个部分。16字节
长的报文头部主要携带了魔法数(0xdabb)
,以及当前请求报文是否是Request、REsponse、心跳和事件的信息,请求时也会携带当前报文体内序列化协议编号。除此之外还携带了请求状态,以及请求唯一标识和报文体长度。
Dubbo协议字段解析:
偏移比特位 | 字段描述 | 作用 |
---|---|---|
0~7 | 魔数高位 | 存储的是魔法数高位(0xda00) |
8~15 | 魔数低位 | 存储的是魔法数低位(0xbb) |
16 | 数据包类型 | 是否为双向RPC调用(比如方法调用有返回值),0为Response,1为Request |
17 | 调用方式 |
仅在第16位被这设为1的情况下有效 0为单向调用,1位双向调用 比如在优雅停机时服务端发送readoly不需要双向调用,这里标志位就不会设定 |
18 | 事件标识 |
0为当前数据包是请求或响应包 1为当前数据包是心跳包,比如框架为了保活TCP连接,每次客户端和服务端相互发送心跳包时这个标志位被设定 设置了心跳报文不会透传到业务方法调用,仅用于框架内部保活机制 |
19~23 | 序列化器编号 |
2为HessianSerializatiion 3为JavaSerialization 4为CompactedJavaSerialization 6为FastJsonSerialization 7为NativJavaSerialization 8为KryoSerialization 9为FstSerialization |
24~31 | 状态 |
20为OK 30为CLIENT_TIMEOUT 31为SERVER_TIMEOUT 40为BAD_REQUEST 50为BAD_RESPONSE … |
32~95 | 请求编号 | 这8个字节存储RPC请求的唯一id,用来将请求和响应做关联 |
96~127 | 消息体长度 | 占用的4个字节存储消息体长度。在一次RPC请求过程中,消息体中一次会存储7部分内容 |
在消息体中,客户端严格按照序列化顺序写入消息,服务端也会遵循相同的顺序读取消息,客户端发起请求的消息体一次保存下列内容:Dubbo版本号、服务接口名、服务接口版本、方法名、参数类型、方法参数值和请求额外参数(attachment)。
完整状态响应码和作用:
状态值 | 状态符号 | 作用 |
---|---|---|
20 | OK | 正确返回 |
30 | CLIENT_TIMEOUT | 客户端超时 |
31 | SERVER_TIMEOUT | 服务端超时 |
40 | BAD_REQUEST | 请求报文格式错误 |
50 | BAD_RESPONSE | 响应报文格式错误 |
60 | SERVICE_NOT_FOUND | 未找到匹配的服务 |
70 | SERVICE_ERROR | 服务调用错误 |
80 | SERVER_ERROR | 服务端内部错误 |
90 | CLIENT_ERROR | 客户端错误 |
100 | SERVER_THREADPOOL_EXHAUSTED_ERROR | 服务端线程池满拒绝执行 |
Dubbo响应标记:
状态值 | 状态符号 | 作用 |
---|---|---|
5 | RESPONSE_NULL_VALUE_WITH_ATTACHEMENTS | 响应空值包含隐藏参数 |
4 | RESPONSE_VALUE_WITH_ATTACHEMENTS | 响应结果包含隐藏参数 |
3 | RESPONSE_WITH_EXCEPTION_WITH_ATTACHMENTS | 异常返回包含隐藏参数 |
2 | RESPONSE_NULL_VALUE | 响应空值 |
1 | RESPONSE_VALUE | 响应结果 |
0 | RESPONSE_WITH_EXCEPTION | 异常返回 |
在返回消息体中,会先把返回值状态标记写入输入流,根据标记状态判断RPC是否正常,比如一次正常RPC调用成功,则先往消息体中写一个标记1,紧接着再写方法返回值。
在网络通信中(基于TCP)需要解决网络粘包/解包的问题,一些常用解决办法比如用回车、换行、固定长度和特殊分隔符等进行处理,通过对前面协议的理解,很容易发现Dubbo其实就是用特殊符号0xdabb魔数
来分隔处理粘包问题的。
客户端会使用多线程并发调用服务,Dubbo是如何做到正确响应调用线程的呢?
当客户端多个线程并发请求时,框架内部会调用Defaultfutre对象的get方法进行等待。在请求发起时,框架内部会创建Request对象,这个时候会被分配一个唯一的id,DefaultFuture可以从Request对象中获取id,并将关联关系存储到静态HashMap中,就是上图中的Future集合。当客户端收到响应时,会根据Response对象中的id,从Futures集合中查找对应的DefaultFuture对象,最终会唤醒对应的线程并通知结果。客户端也会启动一个定时扫描线程去探测超时没有返回的请求。
Dubbo——协议详解相关推荐
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔 ...
- HTTP协议详解(真的很经典)
转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...
- Http 协议详解笔记
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...
- Http协议 详解(转载)
http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...
- ARP协议详解之ARP动态与静态条目的生命周期
ARP协议详解之ARP动态与静态条目的生命周期 ARP动态条目的生命周期 动态条目随时间推移自动添加和删除. q 每个动态ARP缓存条目默认的生命周期是两分钟.当超过两分钟,该条目会被删掉.所以,生 ...
- ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御
ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3 ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...
- HTTP协议详解 转自小坦克
HTTP协议详解 转自小坦克 -- 有些文章是引用别人的,为了方便我以后或不再备注;引用目的是因为直接网摘里面的地址经常被重置,找不到原来的文章 当今web程序的开发技术真是百家争鸣,ASP.NET, ...
- nbns协议_网络协议详解1 - NBNS
NetBIOS 简介 NetBIOS,Network Basic Input/Output System的缩写,一般指用于局域网通信的一套API,相关RFC文档包括 RFC 1001, RFC 100 ...
- 转:SSL 握手协议详解
SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...
最新文章
- 99_leetcode_Best Time to Buy and sell Stock
- 程序员如何乘风破浪?从数据库历史看技术人发展 | CSDN 高校俱乐部
- Windows与Linux区别3
- 一文弄懂YOLO目标检测算法
- 上周热点回顾(6.20-6.26)
- tftp 在线更新 cisco switch IOS
- java 删除二进制内容_从二进制矩阵中仅删除一个元素的行/列
- leetcode 561. 数组拆分 I(Java版)
- 计算机集成制造 pdf,计算机集成制造系统方法论9412536127640μ.pdf
- C语言 define 防止头文件重复包含 - C语言零基础入门教程
- 【系列8】使用Dockerfile创建带MongoDB的Centos Docker镜像
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
- Scikit-learn:模型选择之调参grid search
- tcpreplay,tcprewrite的使用
- WCDMA功率控制与BER/BLER
- 在服务器上如何打开mdf文件,在没sql server数据库状况下怎么打开.mdf文件
- 微信浏览器内打开App Store链接,并跳转到App指定安装页面
- 使用手机号登录、注册、重置密码
- 智能+建筑>智能建筑
- OSChina 周二乱弹 ——程序员在聊天中注意观察什么细节
热门文章
- 【单片机】温湿度传感器 DHT11
- [视野] AI创业必知6大核心问题:如何选择赛道、搭配团队和应对巨头挑战
- 60 个程序员才懂的梗!太形象了!
- 计算机学院创新基金项目题目,大学生科技创新基金项目立项
- 2.1 rtthread pin设备详解
- 和AI一起玩儿剧本杀:居然比我还入戏
- 4.有两个知阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于知阵相加。如:c=a+b。
- memset的使用方法
- $axios.post 表单序列化 URLSearchParams
- 饿了么的定位android,外卖订餐服务“饿了么”Android版应用正式上线,未来或可对每个外卖员进行位置跟踪...