众所流传,rpc协议十高性能的协议,是远超http协议的性能呢,但是现在由于异构跨语言系统的之间的交互与调用,从而springcloud 大放异彩,而springcloud 使用的就是http协议,当前跨语言协议还有thrift,protobuff、avro等。当然之前dubbo是hession序列化,导致只有java客户端。但是现在已经dubbo-nodejs,dubbo-php这些项目了(还没看,囧)。
那么这个dubbo协议长什么样呢,在我们眼中的http、tcp协议的包体应该都历历在目。大约是header + body,当然这个dubbo也不失众人所望,仍是如此结构
Header
详细头总共有128位,即16字节,第0-15位是MagicNumer
下标 | 说明 | |
---|---|---|
0-7 | 高位魔法数 | |
8-15 | 低位魔法数 | |
16 | 标记消息是请求(1)还是响应(0) | |
17 | 标记消息是否需要返回,1需要返回,0不需要 | |
18 | 标记消息是心跳、连接、断开这种事件还是普通的请求响应,1表示事件 | |
19-23 | 标记此消息的序列化方式,fastjson是6 | |
24-31 |
|
|
32-95 | 请求ID,Long类型 | |
96-127 | 消息体长度,Integer类型 |
消息体
128之后表示消息体内容,但是有个注意的点,他是有一定顺序的。在使用hession序列化的时候,直接使用的是writeUTF方法。
- Dubbo version
- Service name
- Service version
- Method name
- Method parameter types
- Method arguments
- Attachments
看一看代码,或许就比较清晰了。
hession2编码相关代码
RpcInvocation inv = (RpcInvocation) data;
out.writeUTF(inv.getAttachment(Constants.DUBBO_VERSION_KEY, DUBBO_VERSION));
out.writeUTF(inv.getAttachment(Constants.PATH_KEY));
out.writeUTF(inv.getAttachment(Constants.VERSION_KEY));
out.writeUTF(inv.getMethodName());
out.writeUTF(ReflectUtils.getDesc(in