動態

詳情 返回 返回

Netty源碼解析-響應式實現(Reactor模式) - 動態 詳情

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

Add a new 評論

Some HTML is okay.