2

Netty基本介绍,请参考juejin.cn/post/740884…

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


杜若
70 声望3 粉丝