日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五、Netty核心组件

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五、Netty核心组件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了后期更好地理解和進一步深入 Netty,有必要總體認識一下 Netty 所用到的核心組件以及他們在整個 Netty 架構中是如何協調工作的。

一、Netty 有如下幾個核心組件

  • Bootstrap & ServerBootstrap:客戶端和服務端的引導類
  • Channel:代表了一個鏈接,與EventLoop一起用來參與IO處理。
  • ChannelFuture:Netty 為異步非阻塞,即所有的 I/O 操作都為異步的,因此,我們不能立刻得知消息是否已經被處理了。Netty 提供了 ChannelFuture 接口,通過該接口的 addListener() 方法注冊一個 ChannelFutureListener,當操作執行成功或者失敗時,監聽就會自動觸發返回結果。
  • EventLoop & EventLoopGroup:Channel處理IO操作,一個EventLoop可以為多個Channel服務。而一個EventLoopGroup會包含多個EventLoop。
  • ChannelHandler:為了支持各種協議和處理數據的方式,便誕生了Handler組件。Handler主要用來處理各種事件,這里的事件很廣泛,比如可以是連接、數據接收、異常、數據轉換等。
  • ChannelPipeline:提供了 ChannelHandler 鏈的容器,并定義了用于在該鏈上傳播入站
    和出站事件流的 API。
  • 核心組件的高層類圖如下:
  • 核心類之間的數量關系

二、Bootstrap & ServerBootstrap

這 2 個類都繼承了AbstractBootstrap,因此它們有很多相同的方法和職責。它們都是啟動器,能夠幫助 Netty 使用者更加方便地組裝和配置 Netty ,也可以更方便地啟動 Netty 應用程序。相比使用者自己從頭去將 Netty 的各部分組裝起來要方便得多,降低了使用者的學習和使用成本。它們是我們使用 Netty 的入口和最重要的 API ,可以通過它來連接到一個主機和端口上,也可以通過它來綁定到一個本地的端口上??偟膩碚f,它們兩者之間相同之處要大于不同。

Bootstrap & ServerBootstrap對于Netty就相當于 Spring Boot 是 Spring 的啟動器。
它們和其它組件之間的關系是它們將 Netty 的其它組件進行組裝和配置,所以它們會組合和直接或間接依賴其它的類。

  • Bootstrap 用于啟動一個 Netty TCP 客戶端,或者 UDP 的一端。通常使用 #connet(...) 方法連接到遠程的主機和端口,作為一個 Netty TCP 客戶端。也可以通過 #bind(...) 方法綁定本地的一個端口,作為 UDP 的一端。僅僅需要使用一個 EventLoopGroup 。

  • ServerBootstrap 往往是用于啟動一個 Netty 服務端。通常使用 #bind(...) 方法綁定本地的端口上,然后等待客戶端的連接。使用兩個 EventLoopGroup 對象( 當然這個對象可以引用同一個對象 ):第一個用于處理它本地 Socket 連接的 IO事件處理,而第二個責負責處理遠程客戶端的 IO 事件處理。

三、Channel

  • Netty網絡通信的組件,用于網絡IO操作。
  • 通過Channel可以獲得當前王略連接的通道的狀態與網絡配置參數。
  • Channel提供異步的網絡IO操作,調用后立即返回ChannelFuture,通過注冊監聽,或者同步等待,最終獲取結果。

Channel根據不同的協議、不同的阻塞類型,分為不同的Channel類型,通過名稱也能大概猜出來其分別的作用:

Channel 是 Netty 網絡操作抽象類,它除了包括基本的 I/O 操作,如 bind、connect、read、write 之外,還包括了 Netty 框架相關的一些功能,如獲取該 Channel 的 EventLoop 。在傳統的網絡編程中,作為核心類的Socket ,它對程序員來說并不是那么友好,直接使用其成本還是稍微高了點。而 Netty 的 Channel 則提供的一系列的 API ,它大大降低了直接與 Socket 進行操作的復雜性。而相對于原生 NIO 的 Channel,Netty 的 Channel 具有如下優勢 :

  • 在 Channel 接口層,采用 Facade 模式進行統一封裝,將網絡 I/O 操作、網絡 I/O相關聯的其他操作封裝起來,統一對外提供。
  • Channel 接口的定義盡量大而全,為 SocketChannel 和 ServerSocketChannel提供統一的視圖,由不同子類實現不同的功能,公共功能在抽象父類中實現,最大程度地實現功能和接口的重用。
  • 具體實現采用聚合而非包含的方式,將相關的功能類聚合在 Channel 中,由 Channel 統一負責和調度,功能實現更加靈活。

四、EventLoop && EventLoopGroup

Channel為Netty 網絡操作抽象類,EventLoop 負責處理注冊到其上的 Channel 處理 I/O 操作,兩者配合參與 I/O 操作。EventLoopGroup 是一個 EventLoop 的分組,它可以獲取到一個或者多個 EventLoop 對象,因此它提供了迭代出 EventLoop 對象的方法。

下圖是 Channel、EventLoop、Thread、EventLoopGroup 之間的關系:

EventLoopGroup可以理解為線程池,EventLoop理解為一個線程,每個EventLoop對應一個Selector,負責處理多個Channel上的事件。

第一個boss EventLoopGroup分配一個EventLoop負責創建Channels傳入的連接請求。一旦連接接受,第二個work EventLoopGroup分配一個 EventLoop給它的Channel。

  • 一個 EventLoopGroup 包含一個或多個 EventLoop ,即 EventLoopGroup : EventLoop = 1: n 。

  • 一個 EventLoop 在它的生命周期內,只能與一個 Thread 綁定,即 EventLoop : Thread = 1 : 1 。

  • 所有有 EventLoop 處理的 I/O 事件都將在它專有的 Thread 上被處理,從而保證線程安全,即 Thread :EventLoop = 1 : 1。

  • 一個 Channel 在它的生命周期內只能注冊到一個 EventLoop 上,即 Channel : EventLoop = n : 1 。

  • 一個 EventLoop 可被分配至一個或多個 Channel ,即 EventLoop : Channel = 1 : n 。

當一個連接到達時,Netty 就會創建一個 Channel,然后從 EventLoopGroup 中分配一個 EventLoop 來給這個 Channel 綁定上,在該 Channel 的整個生命周期中都是有這個綁定的 EventLoop 來服務的。

五、ChannelFuture

Netty 為異步非阻塞,即所有的 I/O 操作都為異步的,因此,我們不能立刻得知消息是否已經被處理了。Netty 提供了 ChannelFuture 接口,通過該接口的 #addListener(...) 方法,注冊一個 ChannelFutureListener,當操作執行成功或者失敗時,監聽就會自動觸發返回結果。

六、ChannelHandler

ChannelHandler ,連接通道處理器,我們使用 Netty 中最常用的組件。ChannelHandler 主要用來處理各種事件,這里的事件很廣泛,比如可以是連接、數據接收、異常、數據轉換等。ChannelHandler 有兩個核心子類 ChannelInboundHandler 和 ChannelOutboundHandler

  • ChannelInboundHandler 用于接收、處理入站( Inbound )的數據和事件
  • ChannelOutboundHandler 則相反,用于接收、處理出站( Outbound )的數據和事件。
  • ChannelInboundHandler 的實現類還包括一系列的 Decoder 類,對輸入字節流進行解碼。
  • ChannelOutboundHandler 的實現類還包括一系列的 Encoder 類,對輸入字節流進行編碼。
  • ChannelDuplexHandler 可以同時用于接收、處理入站和出站的數據和時間。

ChannelHandler 還有其它的一系列的抽象實現 Adapter ,以及一些用于編解碼具體協議的 ChannelHandler 實現類。

七、ChannelPipeline

ChannelPipeline 為 ChannelHandler 的鏈,提供了一個容器并定義了用于沿著鏈傳播入站和出站事件流的 API 。一個數據或者事件可能會被多個 Handler 處理,在這個過程中,數據或者事件經流 ChannelPipeline ,由 ChannelHandler 處理。在這個處理過程中,一個 ChannelHandler 接收數據后處理完成后交給下一個 ChannelHandler,或者什么都不做直接交給下一個 ChannelHandler。

當一個數據流進入 ChannelPipeline 時,它會從 ChannelPipeline 頭部開始,傳給第一個 ChannelInboundHandler 。當第一個處理完后再傳給下一個,一直傳遞到管道的尾部。與之相對應的是,當數據被寫出時,它會從管道的尾部開始,先經過管道尾部的“最后”一個ChannelOutboundHandler ,當它處理完成后會傳遞給前一個 ChannelOutboundHandler 。當 ChannelHandler 被添加到 ChannelPipeline 時,它將會被分配一個 ChannelHandlerContext ,它代表了 ChannelHandler 和 ChannelPipeline 之間的綁定。

其中 ChannelHandler 添加到 ChannelPipeline 中,通過 ChannelInitializer 來實現,過程如下:

  • 一個 ChannelInitializer 的實現對象,被設置到了 BootStrap 或 ServerBootStrap 中。
  • 當 ChannelInitializer.initChannel() 方法被調用時,ChannelInitializer 將在 ChannelPipeline 中創建一組自定義的 ChannelHandler 對象。
  • ChannelInitializer 將它自己從 ChannelPipeline 中移除。
  • ChannelInitializer 是一個特殊的 ChannelInboundHandlerAdapter 抽象類。

八、ChannelHandlerContext

保存Channel相關的所有上下文信息,同時關聯一個ChannelHandler。ChannelHandlerContext中也綁定了對應的pipeline和Channel信息,方便對ChannelHandler進行調用。

九、ChannelOption

Netty創建Channel實例后,可以通過ChannelOption設置channel參數。

  • 參數


參考文章
參考文章

總結

以上是生活随笔為你收集整理的五、Netty核心组件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。