1. 程式人生 > 其它 >Netty入門(二):Channel

Netty入門(二):Channel

Don't let emotion cloud your judgment.
不要讓情緒影響你的判斷。

上圖簡述了資料被讀取後的處理流程,最終通過註冊不同的Handler實現具體業務,類似職責鏈模式。

Channel

目前,可以把 Channel 看作是傳入(入站)或者傳出(出站)資料的通道,它可以被開啟或者被關閉,連線或者斷開連線。

Netty對JDK原生的ServerSocketChannel進行了封裝和增強, 相對於原生的JdkChannel, Netty的Channel增加了如下的元件

  • id 標識唯一身份資訊
  • 可能存在的parent Channel
  • 管道 pepiline,用於連結handler
  • 用於資料讀寫的unsafe內部類,實際IO操作都是該類實現的
  • 關聯唯一的EventLoop,EventGroup->EventLoop->Channel(後續章節再講,其實就是類似執行緒池的東西)

channel生命週期

ChannelUnregistered Channel 已經被建立,但還未註冊到 EventLoop
ChannelRegistered 已經被註冊到了 EventLoop
ChannelActive 處於活動狀態(已經連線到它的遠端節點)。它現在可以接收和傳送資料了
ChannelInactive 沒有連線到遠端節點

ChannelPipeline

每一個新建立的 Channel 都將會被分配一個新的 ChannelPipeline。這項關聯是唯一不變的。

核心功能:

  • ChannelPipeline 儲存了與 Channel 相關聯第一個 ChannelHandler
  • ChannelPipeline 可以根據需要,通過新增或者刪除 ChannelHandler 來動態地修改(典型應用,動態修改協議等)
  • ChannelPipeline 有著豐富的 API 用以被呼叫,以響應入站和出站事件

ChannelHandlerContext

ChannelHandlerContext類似上下文的概念,代表了 ChannelHandler 和 ChannelPipeline 之間的關聯,每當有 ChannelHandler 新增到 ChannelPipeline 中時,都會建立 ChannelHandlerContext。

ChannelHandlerContext 的主要功能是管理它所關聯的 ChannelHandler 和在同一個 ChannelPipeline 中的其他 ChannelHandler 之間的互動。

核心功能:

  • ChannelHandlerContext使得ChannelHandler能夠和它的ChannelPipeline以及其他的ChannelHandler 互動。
  • ChannelHandler 可以通知其所屬的 ChannelPipeline 中的下一個ChannelHandler
  • ChannelHandlerContext 具有豐富的用於處理事件和執行 I/O 操作的 API

ChannelHandler

生命週期:

handlerAdded 當把 ChannelHandler 新增到 ChannelPipeline 中時被呼叫
handlerRemoved 當從 ChannelPipeline 中移除 ChannelHandler 時被呼叫
exceptionCaught 當處理過程中在 ChannelPipeline 中有錯誤產生時被呼叫

ChannelInboundHandler 的方法

ChannelOutboundHandler 的方法

記憶體洩漏監控

在使用handler處理ByteBuf時,應正確處理其被引用次數,尤其是呼叫read和write後,應正確釋放其引用。

(注意:SimpleChannelInboundHandler會自動釋放引用)

本文來自部落格園,作者:新人十三,轉載請註明原文連結:https://www.cnblogs.com/hystrix/p/15105300.html