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