先从整体上看一下Netty的构成。
核心组件
Bootstrap&ServerBootstrap
netty程序的启动器,负责配置netty程序,把各个组件组合起来。通过客户端使用Bootstrap进行connect,服务器端使用ServerBootstrap进行bind。
EventLoop&EventLoopGroup
一个EventLoop其实就是一个线程,处理 Channel的IO操作.一个Channel的IO操作由一个EventLoop负责,但不是每个Channel都会有特定的EventLoop,而是由EventLoopGroup统一分配和回收。因此在EventLoop里面,万万不能阻塞。
通常ServerBootstrap会使用两个EventLoopGroup,一个用于接受客户端连接;另一个用于处理客户端的数据。
Handler
netty程序真正业务逻辑所在,Handler主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。其执行线程正是从EventLoopGroup分配的EventLoop。
Handler有ChannelInboundHandler、ChannelOutboundHandler两种,分别处理输入、输出数据。
ChannelPipeline
Channel是管道,数据在其中in或者out。而Handler则是管道中的过滤阀门,支持多个Handler,组成一个ChannelPipeline。其中机制类似Filter和FilterChain。
ChannelInitializer
ChannelInitializer便是用来配置这些Handler,它会提供一个ChannelPipeline,并把Handler加入到ChannelPipeline。
Encoders和Decoders
用于字节流和Message之间的相互转换。Netty中提供了很多现成的编码/解码器,我们一般从他们的名字中便可知道他们的用途,如ByteToMessageDecoder、MessageToByteEncoder,如专门用来处理Google Protobuf协议的ProtobufEncoder、 ProtobufDecoder。
其他
Unpooled
对象池。
TCP粘包/拆包
基于流的TCP,即read到的数据,有可能不是完整的数据包。netty提供了一系列的Decoder用于解决粘包/拆包的问题。比如特定分隔符、定长消息、长度+数据等等。