1. 程式人生 > >Netty中的這些知識點,你需要知道!

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

一、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,來規避不必要的介面實現。

相關推薦

Netty這些知識點需要知道

一、Channel Channel是一個介面,而且是一個很大的介面,我們稱之為“大而全”,囊括了server端及client端介面所需要的介面。 Channel是一個門面,封裝了包括網路I/O及相關的所有操作。 Channel聚合了包括網路讀寫、鏈路管理、網路連線資訊、獲取EventL

C++語言中std::array的神奇用法總結需要知道

摘要:在這篇文章裡,將從各個角度介紹下std::array的用法,希望能帶來一些啟發。 td::array是在C++11標準中增加的STL容器,它的設計目的是提供與原生陣列類似的功能與效能。也正因此,使得std::array有很多與其他容器不同的特殊之處,比如:std::array的元素是直接存放在例項內部,

在Docker執行Java:為了防止失敗需要知道這些

摘要: 很多開發者會(或者應該)知道,當我們為執行在Linux容器(Docker、rkt、runC、lxcfs等)中的Java程式去設定JVM的GC、堆大小和執行時編譯器的引數時並沒有得到預想的效果。當我們通過“java -jar mypplication-fat.jar

趨勢:“無人化”的未來這些事情需要知道

編輯機器人 寫作機器人 當下,“無人化”的話題火的不要不要的。無人公交、無人貨架、無人便利店、無人旅館、無人倉庫、無人港口、無人工廠、無人編輯、無人駕駛垃圾箱……一個個新詞不斷沖擊著我們的眼球,刷新著我們的認知。   乍看之下,“無人化”似乎成為了下一個時代發展的風向標,資金與大家的關註都聚焦在它身

web的監聽器需要知道這些...

Listener是Servlet規範的另一個高階特性,它用於監聽java web程式的事件,例如建立、修改、刪除session,request,context等,並觸發相應的處理事件,這個處理事件是由web容器回掉的。 學過安卓開發的同學一定很熟悉view.setonClickLister();這樣

關於晶片之爭需要知道這些本質

核心技術到底是個啥? 把技術分分類,第一類姑且叫“可山寨技術”,或者叫“純燒錢技術”,有人喜歡往左邊燒,有人喜歡往右邊燒,於是就燒出了不同的應用技術。 這本質上是用舊技術整合出新玩意兒,比如,美帝登月的土星五號,土工的跨海大橋,小鬍子的鼠式坦克,甚至包括中國長城和埃及

關於QT需要知道這些基礎知識

Qt一開始是由奇趣公司開發的,後來被Nokia收購了,然後再被Digia收購了。所以有的人會誤以為Qt就是為了塞班系統而生,是個落伍的產物。但是很多嵌入式軟體、桌面工具都是用Qt來開發的,包括Quartus和Cadence也有用到Qt。誠然,Qt也是類似於C#、JAVA那樣,

python3基礎教程:列舉與閉包需要知道知識點

列舉   字典表示方法:{‘yellow’:1,'green':2} 型別一旦確定下來是不能被改變的 列舉的保護功能:禁止修改標籤的值 避免出現重複的標籤 更多Python視訊、原始碼、資料加群960410445免費獲取  

2月技術周 | OVS實現安全組需要知道這些

訪問控制 分享圖片 各類 eth 網絡協議 索引 網絡連接 靜態 路由 防火墻 防火墻是避免網絡信息基礎設施免受復雜網絡環境中安全***的必要設施。高效的防火墻則更需要實時跟蹤來往於不同網絡設備間的各類網絡連接,即“有狀態防火墻”。對於實際的硬件物理網絡基礎設施需要防火墻,

國家網絡安全事件應急預案需要知道哪些重點

nbsp 規範化 值班 重要 單位 承擔 行為 本地 健全 本月27日,Petya勒索病毒在歐洲爆發,這是自五月Wanncry勒索病毒之後發生的第二起跨國界的大型網絡安全問題,網絡安全事件的規模和頻率在逐漸上升。而面對逐漸嚴峻的形式,中央網信辦在6月27號向社會印發了《國家

Java架構的路上必學知識點知道多少?(轉)

主從復制 高可用 技術架構 讀寫 actuator git flow io緩沖區 生成 應用 我把它分為了五大專題 工程化專題 工程化專題 git git安裝使用 git日常使用:fetc

人工智能創業需要知道的 6 大核心問題

黑色素 營銷 來看 轉化 類別 ast 既然 系統 原來 第一個問題:互聯網 vs 人工智能 首先如果今天大家選擇創業,我建議更應該關註人工智能,而非互聯網。為什麽這麽講? 1. 互聯網的流量紅利已經消失; 最新最熱的IT技術付費社區 IT幫 itbang.me,你發帖提問

監視EntityFramework的sql流轉需要知道的三種方式Log,SqlServerProfile, EFProfile

div tex 安裝 all pan generated form int info 大家在學習entityframework的時候,都知道那linq寫的叫一個爽,再也不用區分不同RDMS的sql版本差異了,但是呢,高效率帶來了差靈活性,我們 無法控制sql的生成策略,

關於分散式儲存需要知道的真相

很多人可能對分散式儲存耳熟能詳,但是,大多數人對其概念或者知識點卻瞭解得都過於分散,看了很多卻“只見樹木,不見森林”,學了很多往往只能“知其然,卻不能知其所以然”。因此,有必要對分散式儲存的概念、問題和矛盾進行一下分析和解讀。 為什麼需要分散式儲存? 很多人可能從來沒

關於阿里訊息佇列RocketMQ(安裝、使用和坑)需要知道的事情

為什麼選擇RocketMQ Apache RocketMQ作為阿里開源的一款高效能、高吞吐量的分散式訊息中介軟體。因為阿里有海量的資料量,無數業務場景的應用,是RocketMQ搶盡風頭風頭,成為不可多得中介軟體專案,加上已經正式加入Apach俱樂部,作為頂級的開源專案! 一、關於

[譯] 關於 Angular 的變化檢測需要知道的一切

原文地址:Everything you need to know about change detection in Angular 原文作者:Max, Wizard of the Web 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold-m…

一個優秀的java程式設計師需要知道的10個程式碼優化方式

程式碼優化不息以來都是一個軌範員經常要掛在嘴邊的一個詞,特別是對付如今軌範員越來越普及,網上教程一大把的時代,良多軌範員寫出的程式碼都是為了了局而寫程式碼,從來不去考慮程式碼的優化問題,如許的程式碼拿去應聘也是非常虧損的,程式碼的優化可以直接浮現出來一個軌範員的根基功以及可塑性. 而程式碼

關於Python 解包需要知道的一切

導讀:本文總結了 Python 解包操作的方方面面,文章略長,看本文前,首先確保身邊有多個不同版本 Python 直譯器的電腦(公眾號回覆 conda ,瞭解如何安裝多個環境),以便隨時驗證程式碼。看完記得收藏,方便查閱) 解包在英文裡叫做 Unpacking,就是將容器裡面的元素逐個取

關於Android Service真正的完全詳解需要知道的一切

  Service全部內容基本會在本篇涉及到,我們將圍繞以下主要知識點進行分析: Service簡單概述 Service在清單檔案中的宣告 Service啟動服務實現方式及其詳解 Service繫結服務的三種實現方式 關於啟動服務與繫結服務間的轉換問題 前臺服

5分鐘關於Python 解包需要知道的一切

導讀:本文總結了 Python 解包操作的方方面面,文章略長,看本文時,身邊最好有多個不同版本 Python 直譯器的電腦。 本文閱讀時間大約:5分鐘 解包在英文裡叫做 Unpacking,就是將容器裡面的元素逐個取出來(防槓精:此處描述並不嚴謹,因為容器中的元素並沒