Netty 的設(shè)計(jì)主要基于主從 Reactor 多線程模式,并有一定的優(yōu)化
逐步遞進(jìn)來(lái)講一下Netty模型
1.簡(jiǎn)單版Netty模型

·BossGroup 線程維護(hù) Selector,ServerSocketChannel 注冊(cè)到這個(gè) Selector 上,只關(guān)注連接
建立請(qǐng)求事件(主 Reactor)
·當(dāng)接收到來(lái)自客戶端的連接建立請(qǐng)求事件的時(shí)候,通過(guò) ServerSocketChannel.accept 方法獲
得對(duì)應(yīng)的 SocketChannel,并封裝成 NioSocketChannel 注冊(cè)到 WorkerGroup 線程中的
Selector,每個(gè) Selector 運(yùn)行在一個(gè)線程中(從 Reactor)
·當(dāng) WorkerGroup 線程中的 Selector 監(jiān)聽(tīng)到自己感興趣的 IO 事件后,就調(diào)用 Handler 進(jìn)行
處理
2.進(jìn)階版Netty模型

·有兩組線程池:BossGroup 和 WorkerGroup,BossGroup 中的線程專門(mén)負(fù)責(zé)和客戶端建立
連接,WorkerGroup 中的線程專門(mén)負(fù)責(zé)處理連接上的讀寫(xiě)
·BossGroup 和 WorkerGroup 含有多個(gè)不斷循環(huán)的執(zhí)行事件處理的線程,每個(gè)線程都包含一
個(gè) Selector,用于監(jiān)聽(tīng)注冊(cè)在其上的 Channel
·每個(gè) BossGroup 中的線程循環(huán)執(zhí)行以下三個(gè)步驟
1 輪訓(xùn)注冊(cè)在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
2 處理 accept 事件,與客戶端建立連接,生成一個(gè) NioSocketChannel,并將其注冊(cè)到
WorkerGroup 中某個(gè)線程上的 Selector 上
3 再去以此循環(huán)處理任務(wù)隊(duì)列中的下一個(gè)事件
每個(gè) WorkerGroup 中的線程循環(huán)執(zhí)行以下三個(gè)步驟
1.輪訓(xùn)注冊(cè)在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事
件)
2.在對(duì)應(yīng)的 NioSocketChannel 上處理 read/write 事件
3.再去以此循環(huán)處理任務(wù)隊(duì)列中的下一個(gè)事件
3.詳細(xì)版Netty模型

--Netty 抽象出兩組線程池:BossGroup 和 WorkerGroup,也可以叫做
BossNioEventLoopGroup 和 WorkerNioEventLoopGroup。每個(gè)線程池中都有
NioEventLoop 線程。BossGroup 中的線程專門(mén)負(fù)責(zé)和客戶端建立連接,WorkerGroup 中的
線程專門(mén)負(fù)責(zé)處理連接上的讀寫(xiě)。BossGroup 和 WorkerGroup 的類型都是NioEventLoopGroup
--NioEventLoopGroup 相當(dāng)于一個(gè)事件循環(huán)組,這個(gè)組中含有多個(gè)事件循環(huán),每個(gè)事件循環(huán)就
是一個(gè) NioEventLoop
--NioEventLoop 表示一個(gè)不斷循環(huán)的執(zhí)行事件處理的線程,每個(gè) NioEventLoop 都包含一個(gè)
Selector,用于監(jiān)聽(tīng)注冊(cè)在其上的 Socket 網(wǎng)絡(luò)連接(Channel)
--NioEventLoopGroup 可以含有多個(gè)線程,即可以含有多個(gè) NioEventLoop
--每個(gè) BossNioEventLoop 中循環(huán)執(zhí)行以下三個(gè)步驟
1 select:輪訓(xùn)注冊(cè)在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
2 processSelectedKeys:處理 accept 事件,與客戶端建立連接,生成一個(gè)
3 NioSocketChannel,并將其注冊(cè)到某個(gè) WorkerNioEventLoop 上的 Selector 上
runAllTasks:再去以此循環(huán)處理任務(wù)隊(duì)列中的其他任務(wù)
每個(gè) WorkerNioEventLoop 中循環(huán)執(zhí)行以下三個(gè)步驟
1 select:輪訓(xùn)注冊(cè)在其上的 NioSocketChannel 的 read/write 事件
(OP_READ/OP_WRITE 事件)
2 processSelectedKeys:在對(duì)應(yīng)的 NioSocketChannel 上處理 read/write 事件
3 runAllTasks:再去以此循環(huán)處理任務(wù)隊(duì)列中的其他任務(wù)
--在以上兩個(gè)processSelectedKeys步驟中,會(huì)使用 Pipeline(管道),Pipeline 中引用了
Channel,即通過(guò) Pipeline 可以獲取到對(duì)應(yīng)的 Channel,Pipeline 中維護(hù)了很多的處理器
(攔截處理器、過(guò)濾處理器、自定義處理器等)。