Netty中的這些知識點,你需要知道!

WindWant發表於2020-06-19

一、Channel

Channel是一個介面,而且是一個很大的介面,我們稱之為“大而全”,囊括了server端及client端介面所需要的介面。

Channel是一個門面,封裝了包括網路I/O及相關的所有操作。

Channel聚合了包括網路讀寫、鏈路管理、網路連線資訊、獲取EventLoop、Pipeline等相關功能類;統一分配,排程實現相應場景的功能。

一個Channel 對應一個物理連線,是基於物理連線上的操作包裝。

二、EventLoop

EventLoop,Event意為事件、Loop意為環,EventLoo即為事件環

EventLoop是一種程式設計結構等待以及分發事件。

NioEventLoop,是一個Netty工作執行緒,又不僅僅是一個Netty工作執行緒。

標準的netty執行緒模型 中我們講過Netty的標準執行緒池模型,池子裡的每個執行緒物件就是一個NioEventLoop物件。或負責接受連線,或負責網路I/O

說它不僅僅是一個Netty執行緒,因為它實現了很多功能,我們可以看下它的繼承圖:

它的上方有兩個枝丫,一個執行緒屬性,一個EventLoop,它是Netty的Reactor執行緒

既然是Reactor執行緒,那麼首先我們需要一個多路複用器。在Netty NioEventLoop中,包就含一個 Selector,它的操作物件是Channel。

NioEventLoop的主要邏輯在它的run()方法,方法體內是一個無限迴圈 for (;;),迴圈體內實現Loop功能。這也是通用的NIO執行緒實現方式。

 

Loop 從任務佇列裡獲取任務,然後檢查多路複用器中就緒的Channel進行處理。

三、Unsafe

Netty中的Unsafe,一個Channel內部聚合介面,用以處理實際的網路I/O讀寫。當然,取Unsafe命名,原始碼中釋義:提供的網路相關的操作方法,永遠不應該被開發人員操作使用。

它是Channel的一個輔助介面,主要方法:

1、register:註冊Channel

2、deregister:取消註冊

3、bind:繫結地址,服務端繫結監聽特定埠;客戶端指定本地繫結Socket地址。

4、connect:建立連線

5、disconnect:斷開連線

6、close:關閉連線

7、write:排程寫,將資料寫入buffer,並未真正進入Channel

8、flush:將緩衝區中的資料寫入Channel

四、AdaptiveRecvByteBufAllocator

動態緩衝區分配器,原始碼說明:根據實時的反饋動態的增加或者減少預需的緩衝區大小。

如果一次分配的緩衝區被填滿了,則調高下一次分配的緩衝區大小。

如果連續兩次實際使用的容量低於分配的緩衝區大小特定比例,則減小下一次分配的緩衝區大小。

其它情景,保持分配大小不變。

Netty的這種“智慧化”處理,可以說是相當有用的:

1、首先,實際的應用場景千差萬別,同一場景下不同時刻的緩衝區需求也是實時變化(一句話可以是一個字,也可能是1000個字),這就需要Netty動態調整緩衝分配大小以適應不同的業務場景,時刻場景

2、其次,過大的不必要的記憶體分配,會導致Buffer處理效能下降;過小的記憶體分配,則會導致頻繁的分配釋放。這都是一個優良的網路框架不應該有的。 

3、最後,動態的調整最直接的好處就是記憶體的的高效使用,一定程度上做到了按需分配。 

五、ChannelPipeline

Pipeline 管道,Channel的資料流通管道,在這個管道中,可以做很多事情。

ChannelPipeline 是一種職責鏈,可以對其中流動的資料進行過濾、攔截處理,是一種插拔式的鏈路裝配器

1、ChannelPipline是一個容器

支援查詢、新增、刪除、替換等容器操作。

2、ChannelPipline支援動態的新增和刪除 Handler

ChannelPipline的這種特性給了我們相當的想象空間,例如動態的新增系統擁塞保護Handler,敏感資料過濾Handler、日誌記錄Handler、效能統計Handler等。

3、ChannelPipline 是執行緒安全的

ChannelPipline使用 synchronized 實現執行緒安全,業務執行緒可以併發的操作ChannelPipline。但需要注意的是,Handler是非執行緒安全的

六、HandlerAdapter

Adapter是一種介面卡,對於使用者自定義的Handler,可以通過繼承HandlerAdapter,來規避不必要的介面實現

相關文章