初学Netty,就对官网上Netty的介绍印象很深,其中有一句话,“Netty是一款高性能的异步事件驱动的网络编程框架”,一直疑惑,明明是设计基于NIO
(当然也支持传统BIO
),却说他是异步事件驱动,这个异步事件驱动到底体现在什么地方。随着逐渐的理解,终于有了自己的答案。这个答案在于 Netty 对 EventExecutor
、EventExecutorGroup
和ChannelHandler
事件处理这部分的设计。其重要子类就是,大家熟知的EventLoop
和 EventLoopGroup
。如果还不熟悉,它的“孙子”就是 NIOEventLoop
和 NIOEventLoopGroup
。
EventExecutor
和EventExecutorGroup
顶级接口设计:
大概绘制一下,Netty是如何进行异步事件驱动设计的,下图参考了 NIOEventLoop
和 NIOEventLoopGroup
- EventExecutorGroup :一般来说是包含了 n 个 EventExecutor ,比如: NioEventLoopGroup 通过构造参数设置 EventExecutor 的数量,在初始化时会对应产生这么多的 EventExecutor。
- EventExecutor:负责处理具体的事件逻辑,在 NioEventLoop 中,每一个 NioEventLoop 都是一个线程,循环去队列中拉去任务执行,并且负责绑定 channel 的 selector.select .
- HandlerContext:虚构的,这个上图依据了,ChannelHandlerContext,主要责任是:1. 事件处理责任链。2. 识别事件,依据不同事件,将EventHandler的对应的逻辑,交给绑定了 EventExecutor 处理。Context在创建时,就会从EventExecutorGroup 中 获得一个 EventExecutor 和他绑定,这样做的好处就是,减少从Group取Executor的频率(即不用每个事件过来都去找一个Executor去处理)
- Event:表示事件,一般都是一个标识,比如说 Selector.select() 的 keys。
事件,驱动一系列行为,行为逻辑执行交由线程池中选择出的线程(EventExcutor
) 完成,执行完毕后,可以通过 Future 和 Promise setSucees setFairure 方法,获取结果或触发相关回调代码,这便是 Netty 的 异步事件驱动。