標籤:read ram list 客戶 核心 span app 無法 自身
一、前言
前篇博文體驗了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中的一些核心組件及其作用,以及各組件之間的關聯,後面還會更為詳細的講解,謝謝各位園友的觀看~
【Netty】Netty核心組件介紹