Netty服务端启动之后,每有一个客户端连接进入,就会创建一个新的Channnel对象以表示两端之间的连接。后续两者之间的数据传输读写就都发生在Channel之上。不同Channel之间的处理,肯定是并发的。同一个Channel之上的处理,则有一定顺序。但何时会有数据对Netty服务端来说是未知的,
Netty是一个异步化处理框架,Channel创建之后,从Channel中读写数据都可能异步化,这种能力通过Channel上绑定的EventLoop来提供。EventLoop即事件循环,在网络I/O处理上,数据的到来时机无法控制,服务端获取到数据之后需要进行相应处理,这种处理对应到Netty中则是触发ChannelHandler中的方法或事件,而这些方法调用或是事件相应的实际运行都在EventLoop当中。
Netty是如何保障这一点的,就需要来具体看一下EventLoop的相关实现了。
EventLoop在代码层面是什么
EventLoop首先是Netty中的接口定义,其继承关系如图,
从接口定义上可以发现EventLoop是一个Executor,且是一个保证执行顺序的OrderedEventExecutor。向EventLoop中submit的任务最终会按顺序执行。保证按顺序执行,那么EventLoop
Netty异步处理框架 异步的实现EventLoop EventLoop&EventLoopGroup ServerBootstrap在构建的时候需要传递
DefaultEventLoop实现,SingleThreadEventLoop
类继承关系
一个Channel只会有一个EventLoop,一个EventLoop可能绑定到多个Channel上 一个EventLoop背后只会有一个线程
为什么异步,异步的来源于IO事件本身的异步性, 收到io时间后交由eventloop进行处理。
channelhandler是作为逻辑实现的重点,如何保证与eventloop之间的关联 通过channel获取到eventloop,判定当前线程是否与eventloop线程相同,相同则执行,否则则放入队列
Channel 与EventLoop 绑定
Executor 与 EventExecutor 的关系 ThreadExecutorMap通过ThreadLocal维系了两者之间的关联,在Runnable任务中获取eventExector时能获取到原先的EventExecutor
MultithreadEventExecutorGroup
channel 与 EventLoopGroup 之间关系
EventLoopGroup创建多个EventLoop,每个EventLoop与Channel关系