Netty基本介绍,参考 Netty与网络编程
1、Netty如何支持Reactor模式
1.1 主从Reactor模式
实现这种模式需要定义两个EventLoopGroup,bossGroup就是mainReactor, workerGroup就是subReactor,
接着我们进入下图的b.group方法
1.1.2 进入ServerBootstrap.group方法
如下图,parentGroup和childGroup被赋值给属性,parentGroup在父类被赋值
1.2 为什么bossGroup处理连接事件呢?我们看一下
1.2.1 进入ServerBootstrap.bind(继承自AbstractBootstrap)方法
1.2.2 bind里面继续调用bind,继续进入bind-> 进入doBind()
1.2.3 doBind方法,进入initAndRegister方法
1.2.4 initAndRegister方法
我们看到上面通过channelFactory构造了channel,最下面一行通过config().group().register(channel)注册channel。
那么我们进入group()看一下
1.2.5 group()方法
group方法里面返回的bootstrap的group,bootstrap正是我们的ServerBootstrap,而ServerBootstrap的group正是在1.1.2中通过ServerBootstrap.group方法被赋值进去的bossGroup,即我们的mainReactor
1.2.6 register方法
我们从1.1.3.4 进入register方法,我们进入MultithreadEventLoopGroup.register方法。可以看到通过next()获取一个EventLoop注册,所以是单线程的
1.2.7 总结
mainReactor需要自己定义,即是ServerBootstrap的两个EventLoopGroup中的parentGroup,初始化的时候设置进去。然后在bind的时候将Group注册到channel上,
同时只会注册一个。
1.3 workGroup
1.3.1 AbstractBootstrap.initAndRegister方法
跟1.2一样,我们进入到AbstractBootstrap.initAndRegister方法,这次我们看init(channel)这一行,这里完成了初始化
1.3.2 由于subReactor是处理读和发送时间的,我们找到ServerBootstrap的channelRead方法
下面childGroup就被注册到child,即channel(看方法第一行) ,childGroup就是ServerBootstrap初始化的时候赋值的workGroup
1.3.3 总结
workerGroup即是subReactor,也就是在ServerBootstrap的childGroup