众多周知,在进行网络通信的时候都需要编解码,而RocketMQ依托Netty框架进行网络交互,只需要在上行和下行通道处理类中进行扩展处理即可完成编解码的工作。
// 编码,下行通道往网络通道中写数据
class NettyEncoder extends MessageToByteEncoder<RemotingCommand>
class MessageToByteEncoder<I> extends ChannelOutboundHandlerAdapter
// 解码,上行通道从网络通道中读数据
class NettyDecoder extends LengthFieldBasedFrameDecoder
class LengthFieldBasedFrameDecoder extends ByteToMessageDecoder
class ByteToMessageDecoder extends ChannelInboundHandlerAdapter
创建请求
这里以broker启动后往注册中心注册自身信息为例
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.REGISTER_BROKER, requestHeader);
request.setBody(body);
创建request请求,设置请求编码以及版本号
public static RemotingCommand createRequestCommand(int code, CommandCustomHeader customHeader) {
RemotingCommand cmd = new RemotingCommand();
cmd.setCode(code);
cmd.customHeader = customHeader;
setCmdVersion(cmd);
return cmd;
}
编码NettyEncoder
编码完成后往ByteBuf中写入请求头以及body信息。
public void encode(ChannelHandlerContext ctx, RemotingCommand remotingCommand, ByteBuf out)
throws Exception {
try {
ByteBuffer header = remotingCommand.encodeHeader();
out.writeBytes(header);
byte[] body = remotingCom

RocketMQ借助Netty框架实现网络通信中的编解码。在启动时,Broker向注册中心注册信息,创建请求并设置编码和版本号。编码过程中,NettyEncoder将请求头和body写入ByteBuf,计算总长度以解决TCP拆包、粘包问题。解码时,NettyDecoder设定最大长度,读取头部信息,通过位运算解析序列化方式和长度,完成解码过程。
最低0.47元/天 解锁文章
3413

被折叠的 条评论
为什么被折叠?



