Dubbo协议的设计与解析
为什么要先聊一下 Dubbo 的协议呢?
因为反序列化的时候涉及到一些响应头(head)和响应体(body)解析的相关内容,是需要先进行一下铺垫的。
首先去官网上撸个图片过来:
可以看到 Dubbo 数据包分为消息头(head)和消息体(body)。
消息头用于存储一些元信息,包括:魔数、数据包类型、调用方式、事件标识、序列化器编号、状态、请求编号、消息体长度。
消息体中用于存储具体的调用消息,包含七部分内容:
- Dubbo 版本号(Dubbo version)
- 服务接口名(service name)
- 服务接口版本(service version)
- 方法名(method name)
- 参数类型(parameter types)
- 方法参数值(arguments)
- 上下文信息(attachments)
客服端发起请求的时候严格按照上面的顺序写入消息,服务端按照同样的顺序读取消息,这样就能解析出消息体里面的内容。
对于协议字段的解析,官网上也是有详细说明的。撸过来:
每个 class 文件的头 4 个字节就是魔数,它的唯一作用就是确定这个文件是否为一个能被 JVM 接受的 class 文件。
在 Dubbo 中这个魔数是用来干什么的呢?
也许你不太清楚,但是我希望我一说你就
能恍然大悟。因为你不悟,也不是本文要讲的东西,我也不好给你解释清楚。
它是用来解决网络粘包/解包问题的。恍然大悟有没有?
没有?
对不起,本文不扩展相关内容。大学的时候《计算机网络》课程的时候逃课处对象去了吧?
首先这个字段仅在第 16 位设置为 1 的情况下有效。
从表里面我们可以知道,第 16 位为 1 就是指:request 请求。
在 rpc 中既然是 request ,那么就分为两种调用方式:有去无回(单向)、有来有回(双向)。
熟悉吗?
不熟悉?呸,你个假粉丝,这张图在我的文章中至少出现过两次:
oneway 就是单向,其他的调用类型都是有返回的。
所以调用分为两种类型,因此需要一个 bit 来存放调用方式。
第三个说说事件标识字段:
状态里面有个省略号,说明没有枚举完。但是代码里面肯定是齐的,这些状态对应的代码在这个类里面,一共 11 个,给大家补充完
整: org.apache.dubbo.remoting.exchange.Response