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