【Netty】Netty核心元件介紹

leesf發表於2017-05-09

一、前言

  前篇博文體驗了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中的一些核心元件及其作用,以及各元件之間的關聯,後面還會更為詳細的講解,謝謝各位園友的觀看~  

相關文章