目录
目标
源码版本
io.netty.channel
Channel
what
提供一个用户试图
所有IO操作都是异步的
结构化 parent
支持向下转型down-cast
释放资源
ChannelId
Channel的全局唯一标示
相关因素
ChannelHandler
what
开发者需要做什么
ChannelHandlerContext引用的作用
信息存储
@Sharable
子类ChannelInboundHandler
子类ChannelOutboundHandler
DefaultChannelHandlerContext
ChannelPipeline
what
与channel的关系
结构图示
addLast方法
如何避免handler阻塞
事件传递
ChannelPipeline应包含三类的ChannelHandler
随时添加handler
子类DefaultChannelPipeline
pipeline中主要field tail
pipeline中主要field head
ChannelFuture
what
状态
addListener好于await
IO操作超时与await超时是没有关系的
EventLoop
what
类层次图示
eventLoop与eventLoopGroup的关系
MultithreadEventLoopGroup
SingleThreadEventLoop
io.netty.bootstrap
NIO封装
通过io.netty.channel和io.netty.bootstrap两个package,对netty进行总体认知。进一步查看netty对NIO的封装,了解源码实现,梳理类层次关系与源码流程。
Netty v4.1.5
Channel作为网络socket或IO组件的连接体。
extends AttributeMap, ChannelOutboundInvoker, Comparable
io操作需要通过channel发起,所以继承了outbound.
所有IO操作都会立即返回,且返回channelFuture,当IO已经完成时,会notify该future。
指明该channel时如何被创建的
用来支持特殊传输操作,因为某些传输实现拥有特有的操作。
close时,确保释放所有资源
处理IO事件/IO操作,并传递给下一个handler。
开发者需要实现channelHandler具体实现类
handler通过context的引用,才可以与其所归属的pipeline进行交互。
当channelHandler需要存储信息时,建议使用成员变量。因为信息是与channel相关的,所以为channel生成单独的handler实例。
如果想复用handler实例,请为handler使用注解@Sharable,请使用ChannelHandlerContext提供的AttributeKey。
在handler上使用该注解,表示可以复用。否则不可复用,因为其已被标示为unshared。
添加状态变化的回调方法 adds callbacks for state changes
获取到IO outbound操作的notify通知
channelHandler的上下文,对channelHandler进行包装。
private final ChannelHandler handler
包含由多个ChannelHandler组成的双向链表,用来控制与Channel相关的IO事件与操作。ChannelPipeline实现了一个起到拦截过滤作用的结构,让用户可以充分控制如何处理事件,handler间如何交互。
Channel:ChannelPipeline=1:1
当Channel创建时,会自动创建ChannelPipeline
图来自netty java文件
inbound事件,handler处理顺序为从下到上。
outbound事件,handler处理顺序为从上到下。
注意:inbound data的生成与outbound data的操作,均是由netty内部的IO线程完成的。
addLast方法是把handler加在上层,既tail。
如果handler处理时间较长,为避免IO Thread被block,在添加Handler时可以启用EventExecutorGroup。
如果handler是异步的或快速的,可以不考虑group。
handler通过调用ChannelHandlerContext的事件传播方法完成事件传递。
线程安全的,任何时间都可从ChannelPipeline中添加或删除ChannleHanler
// 双向链表
final AbstractChannelHandlerContext head;
final AbstractChannelHandlerContext tail;
final class TailContext extends AbstractChannelHandlerContext implements ChannelInboundHandler
作用:作为最后一个inboundHandler存在,主要任务是release msg,引用数refenrence count减一,当引用数为0时销毁msg。
final class HeadContext extends AbstractChannelHandlerContext
implements ChannelOutboundHandler, ChannelInboundHandler
作用:作为第一个intboundHandler存在,作为最后一个outboundHandler存在。
将hanler和IO event与操作衔接在一起。例如写请求,经过一系列outboundHandler处理后到达这里,再由其调用对应channel的unsafe的方法进行与jdkNIOChannel的操作。读事件,首先调用channel的unsafe对应方法,
在Netty中所有IO操作都是异步的。可以通过返回的ChannelFuture来获取执行结果或状态信息。
ChannelFuture两个终态,未完成与完成。完成态分为:成功,失败,取消。
得到ChannelFuture后,可等待完成,也可添加addListener(当操作完成时会notify)
两种终态的图示,来自netty java源码
addListener是非阻塞的;await是阻塞IO Thread。
确保不要在IO Thread中调用await(),可以使用await(timeout),否则可能导致dead lock,会抛出BlockingOperationException。
IO超时,future将是failure的。IO超时需要配置,而不是通过await控制。
负责event(轮询)发现与event执行
其管理的eventloop共享一个executor
自由门
自由门