定义
netty是一款异步的事件驱动的网络应用程序框架,支持快速开发可维护的高性能面向协议的服务器。
netty提供了对TCP/IP、UDP和文件传输的支持,具有高并发,传输快和封装好的优点。
高并发:netty基于NIO开发的网络通信框架,并发性能得到了提升。
传输快:netty基于NIO的零拷贝,接受数据时,开辟一块内存直接从IO读取数据到ByteBuf,操作时直接操作ByteBuf,加快了传输速度。
封装好:隐藏了很多NIO的细节,提供了易于使用的API,提供心跳、重连机制、拆包、粘包等处理方案。
线程模型
单线程模型
单线程模型是又一个线程响应客户端连接
多线程模型
一个线程响应客户端消息,相应成功后为每一个连接开启一个线程取处理业务
主从线程模型
线程池处理客户端响应,另一个线程池处理业务
数据结构
NioEventLoop与NioEventLoopGroup
NioEventLoop是一个线程,后者是一个线程池,包含多个线程。
每一个NioEventLoop都绑定了一个Selector,所以在Netty线程模型中,是由多个Selector在监听IO就绪事件。
一个Channel绑定一个线程,这个连接所有的ChannelHandler都是在一个线程中执行的,避免多线程干扰。多个ChannelHandler注册到ChannelPipline链表中,按照顺序执行。
Channel
java原生api提供的网络通道接口,在jdk1.4之前采用ServerSocket和Socket代表服务端和客户端,1.4之后使用ServerSocketChannel和SocketChannel代表服务端和客户端。Netty对这两个接口进行了封装,使用NioServerSocketChannel和NioSocketChannel进行封装。
ChannelHandler
netty抽象了一个ChannelHandler来处理输入输出事件,对于输入输出事件,只需要集成适配器,重新需要使用的方法就可以用于专享处理。提供的适配器有三种ChannelHandlerAdapter、ChannelInboundHandlerAdapter 、ChannelOutboundHandlerAdapter
ChannelPipeline
netty建立了一个管道的概念,让多个handler顺序执行,一般的处理顺序为:粘包解包,数据反序列化,业务处理,每个Channel调用一次构造函数,因此在构造Channel的时候需要将管道建好,默认使用DefaultChannelPipeline来构造管道。
DefaultChannelPipeline内部通过双向链表建立ChannelHandler的前后关系,内部节点为AbstractChannelHandlerContext类。DefaultChannelPipeline是将普通的Handler包装成AbstractChannelHandlerContext类再添加到链表中。
ChannelHandler
Channel事件处理器,它的子接口ChannelInboundHandler和ChannelOutboundHandler用于处理事件的输入和输出
ChannelInboundHandler所提供的回调方法处理时机
回调方法 | 触发时机 | client | server | 用途 |
channelRegistered | 当前channel注册到EventLoop | true | true | 记录连接用户 |
channelUnregistered | 当前channel从EventLoop取消注册 | true | true | 断线重连 |
channelActive | 当前channel激活的时候 | true | true |
|
channelInactive | 当前channel不活跃的时候 | true | true | 主动断线 |
channelRead | 当前channel从远端读取到数据 | true | true |
|
channelReadComplete | read消费完读取的数据的时候被触发 | true | true |
|
userEventTriggered | 用户事件触发的时候 | true | true | 心跳机制 |
channelWritabilityChanged | channel的写状态变化的时候触发 | true | true |
|
ChannelOutboundHandler回调方法
回调方法 | 触发时机 | client | server | 用途 |
bind | bind操作执行前触发 | false | true |
|
connect | connect 操作执行前触发 | true | false |
|
disconnect | disconnect 操作执行前触发 | true | false |
|
close | close操作执行前触发 | false | true |
|
deregister | deregister操作执行前触发 | true | true |
|
read | read操作执行前触发 | true | true |
|
write | write操作执行前触发 | true | true |
|
flush | flush操作执行前触发 | true | true |
|