文章目录
版本声明
- 基于
rocketmq-all-4.3.1
版本
RemotingCommand
-
RocketMQ
自定义的协议格式4字节 4字节 n字节 m字节 总长度(大端字节) 序列化类型(1个字节)+消息头长度(3个字节) 消息头数据 消息体数据 -
消息头格式
大小 2Byte 1Byte 2Byte 4Byte 4Byte 4Byte 4Byte 类型 int byte int int int String HashMap<String,String> 字段 code language version opaque flag remark extFields -
消息头格式详解
- code: 请求命令码(
ReqeustCode
)或响应命令码(ResponseCode
) - language: 调用语言实现. 对应
LanguageCode
枚举。 - version: 请求或响应的版本号, 对应RemotingCommand.version
- opaque: 请求发起方在同一连接上不同的请求标识代码,多线程连接复用使用.响应直接返回
- flag: 通信层标志, 比如标识是否为请求(偶数)还是响应(奇数),单向(2的倍数+2)还是双向
- remark: 请求的自定义文本信息或响应的错误描述信息
- extFields: 请求或响应自定义字段
- code: 请求命令码(
编码和解码
-
消息的编码和解码分别在
RemotingCommand
类的encode
和decode
方法中完成,数据在网络中传输是按照字节流的方式传输,所以需要把数据编码为字节。encode
方法将RemotingCommand
转换为ByteBuffer
public ByteBuffer encode() { // 1> header length size int length = 4; //消息头长度4字节 // 2> header data length 消息头数据长度 byte[] headerData = this.headerEncode(); length += headerData.length; // 3> body data length 消息体数据长度 if (this.body != null) { length <