Netty的编解码器体系设计与常用实现
分析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