定义
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 |
|