首先一张概览图
通过这张图, 我们从无到有, 从0到1讲解下Netty启动运作过程的流程.
一开始创建两个NioEventLoopGroup, 一个负责接收客户端请求, 另一个负责处理客户端的IO操作. 每个NioEventLoopGroup中都有若干个NioEventLoop.
NioEventLoop的创建过程会创建ThreadPerTaskExecutor, MpscQueue, Selector这三个主要的成员属性(ThreadPerTaskExecutor是在NioEventLoopGroup中被创建, 只是作为NioEventLoop的成员属性而已). ThreadPerTaskExecutor负责创建底层的线程, MpscQueue用于'装载'任务, 实现异步串行无锁化, Selector负责实现多路复用.
然后流程就走到了NioServerSocketChannel.
创建操作会创建id, Unsafe, Pipeline三个主要成员属性. id作为唯一标识, Unsafe负责底层读取ACCEPT请求, Pipeline负责业务流程, 其中Pipeline类似一个管道, 里面包含很多Handler, 一个主要的Handler就是ServerBootstrapAcceptor.
初始化操作主要是向Channel设置选项和属性 以及向Pipeline中添加ChannelInitializer.通过选择器EventExecutorChooser#next得到NioEventLoop并与其关联.
注册操作会以任务的形式添加到NioEventLoop的MpscQueue中. 同时也就触发了NioEventLoop的启动流程.
绑定操作也是以任务的形式添加到NioEventLoop的MpscQueue中.
NioEventLoop的启动即通过ThreadPerTaskExecutor创建一个线程.
启动完成之后就进入无限循环执行过程.
会将之前放入MpscQueue中的注册任务和绑定任务进行处理. 注册就是向Selector注册JDK-Channel, 调用handlerAdded方法, 向Pipeline中添加ServerBootstrapAcceptor, 触发channelRegistered事件. 绑定端口, 触发channelActive事件, 向Selector设置ACCEPT事件.
至此服务端就可以接收客户端的连接请求了.
关于如何接收客户端的连接, 明天再续.