一、前言
前篇博文體驗了Netty的第一個示例,下面接着學習Netty的組件和其設計。
二、核心組件
2.1. Channel、EventLoop和ChannelFuture
Netty中的核心組件包括Channel、EventLoop、ChannelFuture。下面進行逐一介紹。
1. Channel接口
基礎的IO操作,如綁定、連接、讀寫等都依賴於底層網絡傳輸所提供的原語,在Java的網絡編程中,基礎核心類是Socket,而Netty的Channel提供了一組API,極大地簡化了直接與Socket進行操作的復雜性,並且Channel是很多類的父類,如EmbeddedChannel、LocalServerChannel、NioDatagramChannel、NioSctpChannel、NioSocketChannel等。
2. EventLoop接口
EventLoop定義了處理在連接過程中發生的事件的核心抽象,之后會進一步討論,其中Channel、EventLoop、Thread和EventLoopGroup之間的關系如下圖所示
可以看到。
· 一個EventLoopGroup包含一個或多個EventLoop。
· 一個EventLoop在生命中周期綁定到一個Thread上。
· EventLoop使用其對應的Thread處理IO事件。
· 一個Channel使用EventLoop進行注冊。
· 一個EventLoop可被分配至一個或多個Channel。
3. ChannelFuture接口
Netty中的所有IO操作都是異步的,不會立即返回,需要在稍后確定操作結果。因此Netty提供了ChannelFuture,其addListener方法可以注冊一個ChannelFutureListener,當操作完成時,不管成功還是失敗,均會被通知。ChannelFuture存儲了之后執行的操作的結果並且無法預測操作何時被執行,提交至Channel的操作按照被喚醒的順序被執行。
2.2. ChannelHandler和ChannelPipeline
ChannelHandler和ChannelPipeline與用戶邏輯和數據流密切相關。
1. ChannelHandler接口
從應用開發者看來,ChannelHandler是最重要的組件,其中存放用來處理進站和出站數據的用戶邏輯。ChannelHandler的方法被網絡事件觸發,ChannelHandler可以用於幾乎任何類型的操作,如將數據從一種格式轉換為另一種格式或處理拋出的異常。例如,其子接口ChannelInboundHandler,接受進站的事件和數據以便被用戶定義的邏輯處理,或者當響應所連接的客戶端時刷新ChannelInboundHandler的數據。
2. ChannelPipeline接口
ChannelPipeline為ChannelHandler鏈提供了一個容器並定義了用於沿着鏈傳播入站和出站事件流的API。當創建Channel時,會自動創建一個附屬的ChannelPipeline。ChannelHandlers按照如下步驟安裝在ChannelPipeline中。
· 一個ChannelInitializer的實現在ServerBootstrap中進行注冊。
· 當ChannelInitializer的initChannel方法被調用時,ChannelInitializer在管道中安裝一組自定義的ChannelHandlers。
· ChannelInitializer從ChannelPipeline中移除自身。
ChannelHandler可被當做放置任何代碼的容器,用於處理到達並通過ChannelPipeline的事件或者數據,數據可以沿着處理鏈進行傳遞。
當事件從客戶端移動至服務端時稱為出站,反之稱為入站。並且入站處理器和出站處理器可共存於同一個管道中,當讀取入站數據或事件時,將會從管道的頭部開始傳遞到第一個入站處理器,然后傳遞至下一個處理器直至管道的尾部,此時數據處理結束。當出站時,沿着處理鏈直到管道的頭,然后進行網絡傳輸。
2.3. Bootstrapping
Netty的引導類應用程序網絡層配置提供容器,其涉及將進程綁定到給定端口或連接一個進程到在指定主機上指定端口上運行的另一進程。引導類分為客戶端引導Bootstrap和服務端引導ServerBootstrap,兩種引導的聯系與區別如下圖所示。
其中,ServerBootstrap綁定到指定端口來監聽客戶端連接請求,Bootstrap連接至遠程服務端。並且ServerBootstrap包含兩個EventLoopGroup,而Bootstrap只包含一個EventLoopGroup。ServerBootstrap包含兩組通道,第一組包含一個ServerChannel,表示服務器綁定到本地端口的監聽套接字;第二組包含用來處理客戶端連接所創建的所有通道,每接受一個連接時便會創建一個通道,下圖顯示了ServerBootstrap的兩個EventLoopGroup。
EventLoopGroup為關聯的ServerChannel分配一個EventLoop,其為連接請求創建通道(歸屬於第二個EventLoopGroup),一旦一個連接請求被接受時,第二個EventLoopGroup將為通道創建EventLoop。
三、總結
本篇博文簡單介紹了Netty中的一些核心組件及其作用,以及各組件之間的關聯,后面還會更為詳細的講解,謝謝各位園友的觀看~