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

1、Channel

Channel是一個接口,並且是一個很大的接口,咱們稱之爲「大而全」,囊括了server端及client端接口所須要的接口。html

Channel是一個門面,封裝了包括網絡I/O及相關的全部操做。安全

Channel聚合了包括網絡讀寫、鏈路管理、網絡鏈接信息、獲取EventLoop、Pipeline等相關功能類;統一分配,調度實現相應場景的功能。網絡

一個Channel 對應一個物理鏈接,是基於物理鏈接上的操做包裝。併發

2、EventLoop

EventLoop,Event意爲事件、Loop意爲環,EventLoo即爲事件環框架

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

NioEventLoop,是一個Netty工做線程,又不只僅是一個Netty工做線程。性能

標準的netty線程模型 中咱們講過Netty的標準線程池模型,池子裏的每一個線程對象就是一個NioEventLoop對象。或負責接受鏈接,或負責網絡I/Ospa

說它不只僅是一個Netty線程,由於它實現了不少功能,咱們能夠看下它的繼承圖:線程

它的上方有兩個枝丫,一個線程屬性,一個EventLoop,它是Netty的Reactor線程設計

既然是Reactor線程,那麼首先咱們須要一個多路複用器。在Netty NioEventLoop中,包就含一個 Selector,它的操做對象是Channel。

NioEventLoop的主要邏輯在它的run()方法,方法體內是一個無限循環 for (;;),循環體內實現Loop功能。這也是通用的NIO線程實現方式。

 

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

3、Unsafe

Netty中的Unsafe,一個Channel內部聚合接口,用以處理實際的網絡I/O讀寫。固然,取Unsafe命名,源碼中釋義:提供的網絡相關的操做方法,永遠不該該被開發人員操做使用。

它是Channel的一個輔助接口,主要方法:

一、register:註冊Channel

二、deregister:取消註冊

三、bind:綁定地址,服務端綁定監聽特定端口;客戶端指定本地綁定Socket地址。

四、connect:創建鏈接

五、disconnect:斷開鏈接

六、close:關閉鏈接

七、write:調度寫,將數據寫入buffer,並未真正進入Channel

八、flush:將緩衝區中的數據寫入Channel

4、AdaptiveRecvByteBufAllocator

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

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

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

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

Netty的這種「智能化」處理,能夠說是至關有用的:

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

二、其次,過大的沒必要要的內存分配,會致使Buffer處理性能降低;太小的內存分配,則會致使頻繁的分配釋放。這都是一個優良的網絡框架不該該有的。 

三、最後,動態的調整最直接的好處就是內存的的高效使用,必定程度上作到了按需分配。 

5、ChannelPipeline

Pipeline 管道,Channel的數據流通管道,在這個管道中,能夠作不少事情。

ChannelPipeline 是一種職責鏈,能夠對其中流動的數據進行過濾、攔截處理,是一種插拔式的鏈路裝配器

一、ChannelPipline是一個容器

支持查詢、添加、刪除、替換等容器操做。

二、ChannelPipline支持動態的添加和刪除 Handler

ChannelPipline的這種特性給了咱們至關的想象空間,例如動態的添加系統擁塞保護Handler,敏感數據過濾Handler、日誌記錄Handler、性能統計Handler等。

三、ChannelPipline 是線程安全的

ChannelPipline使用 synchronized 實現線程安全,業務線程能夠併發的操做ChannelPipline。但須要注意的是,Handler是非線程安全的

6、HandlerAdapter

Adapter是一種適配器,對於用戶自定義的Handler,能夠經過繼承HandlerAdapter,來規避沒必要要的接口實現

相關文章
相關標籤/搜索