首页 > 代码库 > Netty的几个要点

Netty的几个要点

  • Netty是一个传输层的框架,主要的功能就是两个:封装了NIO的操作,封装了CodeC接口,从而使得NIO的开发者只需要关注与业务功能本身的ChannelHandler。

  • 不只是Netty,传输层主要解决的问题就是这两个,处理IO,处理CodeC

  • CodeC主要处理的问题就是字节流的分帧(Frame),一般有以下几种
  1. 按结束符,比如http
  2. 定长
  3. 使用消息头消息体的方式,在消息头指定长度,比如TCP, Thrift
  • Netty的前端实现了多线程的Reactor模式,可以指定Accept处理的线程池和IO读写的线程池,由Netty框架来管理事件的分发和线程池。

  • Netty采用职责链ChannelPipeline来管理ChannelHandler. 这个职责链中的每个节点可以选择关注的事件去触发,节点的顺序很重要。Netty抽象了inbound和outbound事件的概念,由底层IO向用户层发出的事件称为inbound 事件,从pipeline 的HeadHandler向TailHandler传递事件。由用户层向底层IO发出的事件,比如write,是outbond事件,从TailHandler向HeadHandler传递,调用Unsafe 来完成网络操作。所以使用Netty时理解inbound 和 outbound 事件很重要。最新的netty-5.0取消了inbound / outbound Handler 接口,采用Facade模式设计ChannelHandler,包含了所有的inbound 和 outbound事件。采用Adapter 模式用ChannelHandlerAdapter空实现了ChannelHandler,具体的ChannelHandler只需要继承ChannelHandlerAdapter即可。

  • XXXXEncoder是由用户向底层IO写时使用的,把业务数据编码成字节流,所以XXXEncoder覆盖了ChannelHandlerAdapter的Write 方法,响应outbound事件

  • XXXXDecoder是由底层IO向用户层发出IO事件时使用的,把字节流编码成业务数据,或把字节流转化成ByteBuf,再由ByteBuf 转化成业务数据,响应inbound 事件

Netty的几个要点