Netty启动过程
主线过程
Main Thread
- 创建Selector
- 创建NioServerSocketChannel
- 初始化NioServerSocketChannel
- 从Boss Group中选择一个NioEventLoop给NioServerSocketChannel使用
Boss Thread
- 将NioServerSocketChannel注册到选择的NioEventLoop的Selector上
- 绑定地址启动
- 注册接受连接事件OP_ACCEPT到Selector上
本质
- Selector selector = sun.nio.ch.SelectorProviderImpl.openSelector() 创建Selector多路复用器
- ServerSocketChannel channel = provider.openServerSocketChannel() 创建NioServerSocketChannel
- SelectionKey selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this) NioServerSocketChannel注册到NioEventLoop的Selector
- javaChannel().bind(localAddress, config.getBacklog()) 绑定地址启动
- selectionKey.interestOps(SelectionKey.OP_ACCEPT) 注册接受连接事件(OP_ACCEPT)
知识点
- Selector是在创建NioEventLoopGroup(创建一批NioEventLoop)时创建的
- 第一次Register监听的是0而不是OP_ACCEPT,SelectionKey selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);
- 监听OP_ACCEPT是通过bind完成后的fireChannelActive()异步触发
- NioEventLoop是通过Register操作的执行来完成启动的
- ChanneInitializer是一次性的,用完后就会移除。一些handler也可以设计成一次性的,例如授权
总结
Netty启动过程最核心的操作就是做好接受连接的准备