深入瞭解Netty【七】Netty核心元件
1、Bootstrap與ServerBootstrap
bootstrap用於引導Netty的啟動,Bootstrap是客戶端的引導類,ServerBootstrap是服務端引導類。類繼承關係:
2、Future與ChannelFuture
Netty中的操作都是非同步的,等待完成或者註冊監聽。如:
//b為ServerBootstrap例項
ChannelFuture f = b.bind().sync();
複製程式碼
3、Channel
- Netty網路通訊的元件,用於網路IO操作。
- 通過Channel可以獲得當前王略連線的通道的狀態與網路配置引數。
- Channel提供非同步的網路IO操作,呼叫後立即返回ChannelFuture,通過註冊監聽,或者同步等待,最終獲取結果。
Channel根據不同的協議、不同的阻塞型別,分為不同的Channel型別:
通過名稱也能大概猜出來其分別的作用。
4、Selector
Netty基於java.nio.channels.Selector物件實現IO多路複用,通過Selector一個執行緒可以監聽多個連線的Channel事件。當向一個Selector中註冊Channel後,Selector內部的機制就可以自動不斷的Select這些註冊的Channel是否有就緒的IO事件(可讀、可寫、網路連線完成等)。
5、ChannelHandler
ChannelHandler屬於業務的核心介面,用於處理IO事件或者攔截IO操作,並將其轉發到ChannelPipeline(業務處理鏈)中的下一個處理程式。 貼個實現類關係圖:
6、Pipeline與ChannelPipeline
- ChannelPipeline是一個handler的集合,它負責處理和攔截出站和入站的事件和操作。
- ChannelPipeline實現了攔截過濾器模式,使使用者能控制事件的處理方式。
- 在Netty中,每個Channel都有且只有一個ChannelPipeline與之對應。
一個 Channel 包含了一個 ChannelPipeline,而 ChannelPipeline 中又維護了一個由 ChannelHandlerContext 組成的雙向連結串列,並且每個 ChannelHandlerContext 中又關聯著一個 ChannelHandler。
7、ChannelHandlerContext
儲存Channel相關的所有上下文資訊,同時關聯一個ChannelHandler。
8、ChannelOption
Netty建立Channel例項後,可以通過ChannelOption設定引數。
9、NioEventLoop與NioEventLoopGroup
NioEventLoopGroup可以理解為執行緒池,NioEventLoop理解為一個執行緒,每個EventLoop對應一個Selector,負責處理多個Channel上的事件。
第一個boss EventLoopGroup分配一個EventLoop負責建立Channels傳入的連線請求。一旦連線接受,第二個work EventLoopGroup分配一個 EventLoop給它的Channel。