目標
網(wǎng)絡(luò)通信領(lǐng)域知識九杂、技能的提升
方便后續(xù)項目Netty實戰(zhàn)
主要學習內(nèi)容
- 概念
- 源碼
- 黑科技
- ByteBuf todo
1、Netty概念梳理
1.1EventLoopGroup 口叙、 EventLoop 和 Channel 的關(guān)系
image.png
- Channel 是 Java NIO 的一個基本構(gòu)造。A nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind.
-
EventLoop 本身只由一個線程驅(qū)動站削,其處理了一個 Channel 的所有 I/O 事件攘蔽,并且在該
EventLoop 的整個生命周期內(nèi)都不會改變。 -
EventLoopGroup 包含一個或者多個 EventLoop;
注意政模,在這種設(shè)計中岗宣,一個給定 Channel 的 I/O 操作都是由相同的 Thread 執(zhí)行的,實際
上消除了對于同步的需要淋样。
1.2ChannelHandler 耗式、 ChannelPipeline和ChannelHandlerContext的關(guān)系
image.png
- Netty 的主要組件是 ChannelHandler,用于實現(xiàn)所有處理入站和出站數(shù)據(jù)的應用程序邏輯趁猴。ChannelHandler的方法對應一個事件刊咳。
- ChannelPipeline 提供了 ChannelHandler 鏈的容器。
- 當 ChannelHandler 被添加到 ChannelPipeline 時儡司,它將會被分配一個 ChannelHandlerContext娱挨,其代表了 ChannelHandler 和 ChannelPipeline 之間的綁定。雖然這個對象可以被用于獲取底層的 Channel捕犬,但是它主要還是被用于寫出站數(shù)據(jù)跷坝。
- ChannelHandler 的事件方法都有一個 ChannelHandlerContext參數(shù)。通過使用作為參數(shù)傳遞到每個方法的 ChannelHandlerContext或听,事件可以被傳遞給當前ChannelHandler 鏈中的下一個 ChannelHandler探孝。
- 在Netty中笋婿,有兩種發(fā)送消息的方式誉裆。你可以直接寫到Channel中,也可以 寫到和Channel- Handler 相關(guān)聯(lián)的 ChannelHandlerContext 對象中缸濒。前一種方式將會導致消息從 Channel- Pipeline 的尾端開始流動足丢,而后者將導致消息從 ChannelPipeline 中的下一個 Channel- Handler 開始流動粱腻。
1.3主要ChannelHandler及主要事件
image.png
1.4 ChannelPipeline
1.5 ChannelHandlerContext
1.6 EventLoop
Executor的執(zhí)行邏輯
image.png
為了解決上述問題,Netty 采用了串行化設(shè)計理念斩跌,從消息的讀取绍些、編碼以及后續(xù) Handler 的執(zhí)行,始終都由 IO 線程 NioEventLoop 負責耀鸦,這就意外著整個流程不會進行線程上下文的切換柬批,數(shù)據(jù)也不會面臨被并發(fā)修改的風險,