Netty工作架构图

模块组件
Bootstrap
Bootstrap是启动引导类,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件
Bootstrap类是客户端程序的启动引导类ServerBootstrap类是服务端启动引导类
Channel
Channel的本质是对操作系统产生的FD(文件描述符)的映射,并且提供绑定到Selector多路选择器上的能力
ChannelFuture
在 Netty 中所有的IO操作都是异步的,不能立刻得知消息是否被正确处理。 Future 对象可以看作是一个异步操作结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
Netty 提供了ChannelFuture,用于在执行异步操作的时候使用。每个Netty的出站IO操作都会返回一个ChannelFuture。ChannelFuture可以注册ChannelFutureListener 实例,其中的回调方法operationComplete(),将会在对应的操作完成时被调用
|
|
ChannelHandler
ChannelHandler 是一个接口,它充当了所有处理入站和出站数据的应用程序逻辑的容器,并将其转发到其 ChannelPipeline中的下一个ChannelHandler;该类是基于事件驱动的,它会响应相关的事件然后去调用其关联的回调函数,例如:当一个新的连接被建立时,ChannelHandler的channelActive()方法将会被调用
ChannelHandler子类,例如:
ChannelInboundHandler:用于处理入站IO事件。ChannelOutboundHandler:用于处理出站IO操作。
ChannelPipline
ChannelPipeline 是聚合了 ChannelHandler 的管道,本质上是一个职责链路(用于处理Channel的入站事件和出站操作),在Worker线程中会对每一个Channel执行其所对应的pipeline链,完成整个生命周期。


蓝色表示 ChannelInboundHandler ,绿色表示 ChannelOutboundHandler,黄色则承担两个角色,而每个Handler又会使用 ChannelHandlerContext 封装起来,在 ChannelPipeline 中组装成双向链表。
ChannelPipeline handler 执行顺序:
- 入站事件流从头到尾执行所有的
handler(入站的时候也会经过OutboundChannelHandler,只不过略过了这个ChannelHandler) - 出站事件流从尾到头执行所有的
handler(出站的时候也会经过InboundChannelHandler,只不过略过了这个ChannelHandler)
注意: 在具体业务处理类ProcessingHandler中将响应数据发出有2种方式:
ChannelHandlerContext.writeAndFlush(msg):不用经过TailConext, 从该handler开始往前执行OutboundChannelHandler,性能更好一些ChannelHandlerContext.pipeline().writeAndFlush(msg):从TailConext开始执行, 往前执行OutboundChannelHandler
|
|
EventLoop
EventLoop 是事件循环,对应Reactor线程,以 NioEventLoop 为例,实现原理是:维护了一个线程和任务队列,支持异步提交任务,线程启动时会调用NioEventLoop 的 run 方法,执行IO任务和非IO任务,由于 EventLoop 是单线程,因此在使用时要注意耗时操作,阻塞操作都不要放到 EventLoop 中,其适合处理耗时短并且简单的任务
- IO任务:即
selectionKey中事件,如accept、connect、read、write等,由processSelectedKeys方法触发。 - 非IO任务:添加到
taskQueue中的任务,如延迟任务,由runAllTasks方法触发。
两种任务的执行时间比由变量 ioRatio 控制,默认为50%,则表示允许非IO任务执行的时间与IO任务的执行时间相等
EventLoopGroup
EventLoopGroup包含一个或者多个EventLoop,主要管理EventLoop的生命周期,可以理解为一个线程池,内部维护了一组线程,每个线程(EventLoop)可以负责处理多个Channel上的事件,而一个Channel只能注册于一个EventLoop(防止线程并发问题)