netty 是一个一基于NIO跟事件模型驱动和Pipes And Filter的框架。运行时的几个主要的类:
# Bootstarp 、ServerBootstarp
# EventLoop
# EventLoopGroup
# ChannelPipeline
# Channel
# Futrue、ChannelFuture
# ChannelInitializer
# ChannelHandler
在netty运行时,他们结合在一起,加上自己扩展的相关部件,构成了我们的应用。
# Bootstarp 、ServerBootstarp
我们的应用起动,需要"引导程序",bootstarp进行配置我们需要的组件。
使用Bootrstarp,指定host,跟port 建立客户端连接。
使用ServerBootstrap , 绑定端口,建立服务。
Bootstarp.connect() 跟ServerBootstarp.bind() 成功后,便建立了Channel, 他的生命周期由ChanelFture引用。
Bootrstarp跟ServerBootstarp都使用了EventLoopGroup, 但两者数量不同。
Bootrstarp只使用一个EventLoopGroup,而ServerBootstarp使用了两个,区别在于:
ServerBootstarp使用两个EvenLoopGroup,一个用于accpect连接, 一个用于执行接收跟发送信息的处理;而Bootstarp只使用了一个EventLoopGroup,同时处理连接跟信息接收发送。
ServerBootstart的EvenloopGroup运行:
# EventLoop、EventLoopGroup
EventLoopGroup可以包含多个EventLoop,其是一个组合关系,每个EventLoopGroup,或EventLoop同时也是一个条执行线程。
关系:
运行过程:
Bootstarp跟ServerBootstarp建立Channel后,EventLoopGroup贯穿的在整个Channel中,ServerBootstarp对于不同的客户端连接,会创建多个Channel , 多个Channel经常使用者同一个EventLoopGroup,应避免进行阻塞EventLoopGroup的操作。
#Channel、ChannelPipeline:
Channel 实际包含了一种协议的通道,由Bootstarp配置,如NioSocketChannel;并且将通道读取IO,跟写IO等操作,包装成了EventLoop,嵌入到EventLoopGroup。Channel在事件触发时经过管道ChannelPipeline,组装多个Handler运行按顺序执行,并委托处理相关事件。
#ChannelHandler
在管道中执行:
在管道中执行
InboundHandler -> Head到Tail
outboundHandler -> Tail 到 Head
几个Adapter
- ChannelHandlerAdapter
- ChannelInboundHandlerAdapter
- ChannelOutboundHandlerAdapter
- ChannelDuplexHandlerAdapter
#Futrue、ChannelFuture :
ChannelFuture 扩展了 java.util.current.Futrue。并包装了一个Channel,Future模式下监控的该Channel的生命周期,同时可注册多个监听器,进行对应的操作。对于ServerBootstarp,进行bind()操作后返回的一个Server端的Channel。前面提到ServerBootstarp对于客户端连接创建的是对应客户端的Channel。
#ChannelInitializer
本身是一个ChannelHandler接口,Channel创建后,将Handler加入ChanelPipleline中执行。