netty核心組件總結

Bootstrap和ServerBootstrap

Bootstrap 意思是引導,一個 Netty 應用通常由一個 Bootstrap 開始,主要作用是配置整個 Netty 程序,串聯各個組件,Netty 中 Bootstrap 類是客戶端程序的啓動引導類,ServerBootstrap 是服務端啓動引導類

常見的方法有:

public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup),該方法用於服務器端,用來設置兩個 EventLoop
public B group(EventLoopGroup group) ,該方法用於客戶端,用來設置一個 EventLoop
public B channel(Class<? extends C> channelClass),該方法用來設置一個服務器端的通道實現
public <T> B option(ChannelOption<T> option, T value),用來給 ServerChannel 添加配置
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value),用來給接收到的通道添加配置
public ServerBootstrap childHandler(ChannelHandler childHandler),該方法用來設置業務處理類(自定義的 handler)
public ChannelFuture bind(int inetPort) ,該方法用於服務器端,用來設置佔用的端口號
public ChannelFuture connect(String inetHost, int inetPort) ,該方法用於客戶端,用來連接服務器端

Future和ChannelFuture

Netty 中所有的 IO 操作都是異步的,不能立刻得知消息是否被正確處理。但是可以過一會等它執行完成或者直接註冊一個監聽,具體的實現就是通過 Future 和 ChannelFutures,他們可以註冊一個監聽,當操作執行成功或失敗時監聽會自動觸發註冊的監聽事件

常見的方法有:

Channel channel(),返回當前正在進行 IO 操作的通道
ChannelFuture sync(),等待異步操作執行完畢

Channel

1)Netty 網絡通信的組件,能夠用於執行網絡 I/O 操作。
2)通過Channel 可獲得當前網絡連接的通道的狀態
3)通過Channel 可獲得 網絡連接的配置參數 (例如接收緩衝區大小)
4)Channel 提供異步的網絡 I/O 操作(如建立連接,讀寫,綁定端口),異步調用意味着任何 I/O 調用都將立即返回,並且不保證在調用結束時所請求的 I/O 操作已完成
5)調用立即返回一個 ChannelFuture 實例,通過註冊監聽器到 ChannelFuture 上,可以 I/O 操作成功、失敗或取消時回調通知調用方
6)支持關聯 I/O 操作與對應的處理程序
7)不同協議、不同的阻塞類型的連接都有不同的 Channel 類型與之對應,常用的 Channel 類型:

NioSocketChannel,異步的客戶端 TCP Socket 連接。
NioServerSocketChannel,異步的服務器端 TCP Socket 連接。
NioDatagramChannel,異步的 UDP 連接。
NioSctpChannel,異步的客戶端 Sctp 連接。
NioSctpServerChannel,異步的 Sctp 服務器端連接,這些通道涵蓋了 UDP 和 TCP 網絡 IO 以及文件 IO

Selector

1)Netty 基於 Selector 對象實現 I/O 多路複用,通過 Selector 一個線程可以監聽多個連接的 Channel 事件。
2)當向一個 Selector 中註冊 Channel 後,Selector 內部的機制就可以自動不斷地查詢(Select) 這些註冊的 Channel 是否有已就緒的 I/O 事件(例如可讀,可寫,網絡連接完成等),這樣程序就可以很簡單地使用一個線程高效地管理多個 Channel

ChannelHandler 及其實現類

1)ChannelHandler 是一個接口,處理 I/O 事件或攔截 I/O 操作,並將其轉發到其 ChannelPipeline(業務處理鏈)中的下一個處理程序。
2)ChannelHandler 本身並沒有提供很多方法,因爲這個接口有許多的方法需要實現,方便使用期間,可以繼承它的子類
3)ChannelHandler 及其實現類一覽圖(後)
在這裏插入圖片描述

  • ChannelInboundHandler 用於處理入站 I/O 事件。
  • ChannelOutboundHandler 用於處理出站 I/O 操作。
  • ChannelInboundHandlerAdapter 用於處理入站 I/O 事件。
  • ChannelOutboundHandlerAdapter 用於處理出站 I/O 操作。
  • ChannelDuplexHandler 用於處理入站和出站事件。

4)我們經常需要自定義一個 Handler 類去繼承 ChannelInboundHandlerAdapter,然後通過重寫相應方法實現業務邏輯

Pipeline 和 ChannelPipeline

1)ChannelPipeline 是一個 Handler 的集合,它負責處理和攔截 inbound 或者 outbound 的事件和操作,相當於一個貫穿 Netty 的鏈。(也可以這樣理解:ChannelPipeline 是 保存 ChannelHandler 的 List,用於處理或攔截 Channel 的入站事件和出站操作)
2)ChannelPipeline 實現了一種高級形式的攔截過濾器模式,使用戶可以完全控制事件的處理方式,以及 Channel 中各個的 ChannelHandler 如何相互交互
3)在 Netty 中每個 Channel 都有且僅有一個 ChannelPipeline 與之對應,它們的組成關係如下:
在這裏插入圖片描述

  • 一個 Channel 包含了一個 ChannelPipeline,而 ChannelPipeline 中又維護了一個由
    ChannelHandlerContext 組成的雙向鏈表,並且每個 ChannelHandlerContext 中又關聯着一個
    ChannelHandler

  • 入站事件和出站事件在一個雙向鏈表中,入站事件會從鏈表 head 往後傳遞到最後一個入站的 handler,出站事件會從鏈表 tail 往前傳遞到最前一個出站的 handler,兩種類型的 handler 互不干擾

4)常用方法:

ChannelPipeline addFirst(ChannelHandler... handlers),把一個業務處理類(handler)添加到鏈中的第一個位置
ChannelPipeline addLast(ChannelHandler... handlers),把一個業務處理類(handler)添加到鏈中的最後一個位置

ChannelHandlerContext

1)保存 Channel 相關的所有上下文信息,同時關聯一個 ChannelHandler 對象
2)即ChannelHandlerContext 中包含一個具體的事件處理器 ChannelHandler , 同 時ChannelHandlerContext 中也綁定了對應的 pipeline 和 Channel 的信息,方便對 ChannelHandler進行調用.
3)常用方法:

ChannelFuture close(),關閉通道
ChannelOutboundInvoker flush(),刷新
ChannelFuture writeAndFlush(Object msg) , 將數據寫到ChannelPipeline中當前
ChannelHandler 的下一個 ChannelHandler 開始處理(出站)

ChannelOption

1)Netty 在創建 Channel 實例後,一般都需要設置 ChannelOption 參數。
2)ChannelOption 參數如下:

  • ChannelOption.SO_BACKLOG:對應 TCP/IP 協議 listen 函數中的 backlog
    參數,用來初始化服務器可連接隊列大小。服務端處理客戶端連接請求是順序處理的,所以同一時間只能處理一個客戶端連接。多個客戶端來的時候,服務端將不能處理的客戶端連接請求放在隊列中等待處理,backlog
    參數指定了隊列的大小。

  • ChannelOption.SO_KEEPALIVE:一直保持連接活動狀態

EventLoopGroup 和其實現類 NioEventLoopGroup

1)EventLoopGroup 是一組 EventLoop 的抽象,Netty 爲了更好的利用多核 CPU 資源,一般會有多個 EventLoop 同時工作,每個 EventLoop 維護着一個 Selector 實例。
2)EventLoopGroup 提供 next 接口,可以從組裏面按照一定規則獲取其中一個 EventLoop來處理任務。在 Netty 服務器端編程中,我們一般都需要提供兩個 EventLoopGroup,例如:BossEventLoopGroup 和 WorkerEventLoopGroup。
3)通常一個服務端口即一個 ServerSocketChannel 對應一個Selector 和一個 EventLoop 線程。BossEventLoop 負責接收客戶端的連接並將 SocketChannel 交給 WorkerEventLoopGroup 來進行 IO 處理,如下圖所示:
在這裏插入圖片描述

  • BossEventLoopGroup 通常是一個單線程的 EventLoop,EventLoop
    維護着一個註冊了ServerSocketChannel 的 Selector 實例;BossEventLoop 不斷輪詢 Selector
    將連接事件分離出來

  • 通常是 OP_ACCEPT 事件,然後將接收到的 SocketChannel 交給 WorkerEventLoopGroup

  • WorkerEventLoopGroup 會由 next 選擇其中一個 EventLoop 來將這個 SocketChannel 註冊到其維護的 Selector 並對其後續的 IO 事件進行處理

4)常用方法:

public NioEventLoopGroup(),構造方法
public Future<?> shutdownGracefully(),斷開連接,關閉線程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章