14-高并发-netty原理和基础-处理器详解
- 反应器模式中,反应器查询到IO事件后,分发到Handler业务处理器,由Handler完成IO操作和业务处理。
- 整个IO操作包含五个环节。只有首尾两位环节由netty底层负责完成。
这里详细描述一下出站和入站的操作:
- 出站处理:触发方向为自顶向下。从channelOutboundHandler-->netty内部-->系统内核缓冲区。会处理数据(读取)解码+业务处理。关键是netty通道操作底层java IO通道。
- 入站处理:触发方向为自底向上。从系统内核缓冲区--->netty内部-->channelInboundHandler。会处理数据编码+数据写入通道。关键是底层java IO通道操作netty通道。
channelInboundHandler
1.channelRegistered
当通道注册完成后,Netty会调用fireChannelRegistered,触发通道注册事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelRegistered方法,会被调用到。
2.channelActive
当通道**完成后,Netty会调用fireChannelActive,触发通道**事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelActive方法,会被调用到。
3.channelRead
当通道缓冲区可读,Netty会调用fireChannelRead,触发通道可读事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelRead方法,会被调用到。
4.channelReadComplete
当通道缓冲区读完,Netty会调用fireChannelReadComplete,触发通道读完事件。通道会启动该入站操作的流水线处理,在通道注册过的入站处理器Handler的channelReadComplete方法,会被调用到。
5.channelInactive
当连接被断开或者不可用,Netty会调用fireChannelInactive,触发连接不可用事件。通道会启动对应的流水线处理,在通道注册过的入站处理器Handler的channelInactive方法,会被调用到。
6.exceptionCaught
当通道处理过程发生异常时,Netty会调用fireExceptionCaught,触发异常捕获事件。通道会启动异常捕获的流水线处理,在通道注册过的处理器Handler的exceptionCaught方法,会被调用到。注意,这个方法是在通道处理器中ChannelHandler定义的方法,入站处理器、出站处理器接口都继承到了该方法。
inboundHandler生命周期【生命周期方法】【入站回调方法】
- 【生命周期方法】handlerAdded()
当业务处理器被加入到流水线后,此方法被回调。就是完成ch.pipeline().addLast(handler)后。
- 【生命周期方法】channelRegistered()
当通道成功绑定一个NioEventLoop线程后,会通道流水线回调所有业务处理器的channelRegistered()方法。
- 【生命周期方法】channelActive()
当通道成功**后,会通过流水线回调所有业务处理器的channelActive()方法。
- 【入站方法回调】channelRead()
有数据入站,通道可读。流水线会启动入站处理流程。入站处理器的channelRead()方法会被一次回调到。
- 【入站方法回调】channelReadCompleted()
流水线完成入站处理后,会从前向后,依次回调每个入站处理器的channelReadCompleted()方法,表示数据读取完毕。
- 【生命周期方法】channelInactive()
当通道底层连接已经不是ESTABLISH或者关闭时,会通过流水线回调所有业务处理器的channelInactive()方法。
- 【生命周期方法】channelUnregistered()
当通道和NioEventLoop线程解除绑定,回调所有处理器的channelUnregistered()方法。
- 【生命周期方法】handlerRemoved()
当通道移除掉所有业务处理器后,回调所有处理器的handlerRemoved()方法。
channelOutboundHandler
再强调一下,出站处理的方向:是通过上层Netty通道,去操作底层Java IO通道。关键是操作底层java IO通道。主要出站(Outbound)的操作如下:
1.bind
监听地址(IP+端口)绑定:完成底层Java IO通道的IP地址绑定。如果使用TCP传输协议,这个方法用于服务器端。
2.connect
连接服务端:完成底层Java IO通道的服务器端的连接操作。如果使用TCP传输协议,这个方法用于客户端。
3.write
写数据到底层:完成Netty通道向底层Java IO通道的数据写入操作。此方法仅仅是触发一下操作而已,并不是完成实际的数据写入操作。
4.flush
腾空缓冲区中的数据,把这些数据写到对端:将底层缓存区的数据腾空,立即写出到对端。
5.read
从底层读数据:完成Netty通道从Java IO通道的数据读取。
6.disConnect
断开服务器连接:断开底层Java IO通道的服务器端连接。如果使用TCP传输协议,此方法主要用于客户端。
7.close
主动关闭通道:关闭底层的通道,例如服务器端的新连接监听通道。