Netty ServerBootStrap服务端启动流程
注意阅读顺序,正常是从左到右,然后从上到下,注解说明了一些比较重要的东西
1.设置NioServerSocketChannelFactory,
1.1 初始化 bossExecutor
1.2 初始化 workerExecutor(服务端启动过程中,并没有用到)
1.3 初始化 ChannelSink ( NioServerSocketChannelSink)
2.设置ChannelPipeLineFactory
2.1 通过多个ChnnelHander组装ChannelPipeline
2.2 通过ChannelPipeline 初始化ChannelPipelineFactory
3. bind一个ip地址,调用ServerBootStrap.bind方法,返回NioServerSocketChannel
通过了一个阻塞队列与ChannelFuture,实现异步的控制是否启动成功
3.1 创建一个带有Binder处理器的channelPipeline,
3.2 通过1中初始化的channelFactory 创建一个NioServerSocketChannel
返回的NioServerSocketChannel as channel组合了java.nio.channels.ServerSocketChannel as NativeChannel,在new channel的时候,看到了熟悉的原生初始化NativeChannel的代码
3.2.1 执行了 Channels.fireChannelOpen()方法,触发ChannelState.OPEN事件,执行Channel的pipeline链的upstreamHandler,这个时候只有一个即Binder
3.2.2 Binder重写了channelOpen方法,并在这个方法里面调用了Channel的bind方法,这个方法会触发1.3中配置的ChannelSink中的eventSunk方法,并最终调用NioServerSocketChannel.socket.socket().bind(ip)这个实际的函数,并通过DeakLockProofWorker启动一个Boss线程,最后触发Channel.BOUND事件。
在Boss线程中,我又看到了熟悉的原生的NIO的东东,初始化Selector,注册serverChannel感兴趣的Accept事件,并启动for(;;)循环,接受SocketChannel,但是处理方式与便利SelectKeys貌似不太一样,继续看