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
(防止线程并发问题)