CodeWalk

Netty的编解码器体系设计与常用实现

作者:Yahuda · 2026-05-30 12:55

分析Netty的编解码器架构,包括ByteToMessageDecoder/MessageToMessageDecoder的继承结构、ReplayingDecoder的设计、以及常用编解码实现(String/Protobuf/压缩等)。

回答

Yahuda

Netty编解码器架构:

1. 解码器抽象

  • ByteToMessageDecoder:将ByteBuf解码为POJO
    • 抽象方法:decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)
    • 使用List<Object> out积累解码结果
    • 内置累积缓冲区,解决拆包问题(cumulation)
  • ReplayingDecoder:ByteToMessageDecoder的子类,在数据不足时抛出异常,由ReplayingDecoder捕获后等待更多数据
    • 可定义状态枚举管理协议解析阶段
  • MessageToMessageDecoder:将一种消息类型解码为另一种

2. 编码器抽象

  • MessageToByteEncoder:将POJO编码为ByteBuf
    • 抽象方法:encode(ChannelHandlerContext ctx, I msg, ByteBuf out)
  • MessageToMessageEncoder:将POJO编码为另一种消息

3. 常用编解码实现

StringEncoder/StringDecoder——字符串编解码
LengthFieldBasedFrameDecoder——长度域帧解码
ProtobufDecoder/ProtobufEncoder——Protocol Buffers编解码
HttpRequestEncoder/HttpResponseDecoder——HTTP协议
ZlibEncoder/ZlibDecoder——压缩编解码

4. 组合编码器(Codec)

  • CombinedChannelDuplexHandler:组合编码器和解码器
    public class MyCodec extends CombinedChannelDuplexHandler<MyDecoder, MyEncoder>
    

5. Sharable注解

  • @Sharable标注的无状态Handler可在多个Pipeline中共享
  • 避免每次连接创建都new Handler