Netty學習四:Channel

1. Channel

Channel是Netty的核心概念之一,它是Netty網絡通訊的主體,由它負責同對端進行網絡通訊、註冊和數據操做等功能。

1.1 工做原理

如上圖所示:promise

  • 一旦用戶端鏈接成功,將新建一個channel同該用戶端進行綁定
  • channel從EventLoopGroup得到一個EventLoop,並註冊到該EventLoop,channel生命週期內都和該EventLoop在一塊兒(註冊時得到selectionKey)
  • channel同用戶端進行網絡鏈接、關閉和讀寫,生成相對應的event(改變selectinKey信息),觸發eventloop調度線程進行執行
  • 若是是讀事件,執行線程調度pipeline來處理用戶業務邏輯

1.2 狀態轉換

如上圖所示,Channel包含註冊、活躍、非活躍和非註冊狀態,在通常狀況下是從註冊->活躍->非活躍->非註冊,但用戶能夠從eventloop取消和重註冊channel,所以在此狀況下活躍->非註冊->註冊安全

1.3 線程

多個channel能夠註冊到一個eventloop上,全部的操做都是順序執行的,eventloop會依據channel的事件調用channel的方法進行相關操做,每一個channel的操做和處理在eventloop中都是順序的,以下圖:

2. ChannelPipeline和ChannelHandler

ChannelPipeline和ChannelHandler用於channel事件的攔截和處理,Netty使用相似責任鏈的模式來設計ChannelPipeline和ChannelHandler

ChannelPipeline至關於ChannelHandler的容器,channel事件消息在ChannelPipeline中流動和傳播,相應的事件可以被ChannelHandler攔截處理、傳遞、忽略或者終止,以下圖所示:

2.1 INBOUD和OUTBOUND事件

inbound:當發生某個I/O操做時由IO線程流向用戶業務處理線程的事件,如鏈路創建、鏈路關閉或者讀完成等
outbound:由用戶線程或者代碼發起的IO操做事件

2.2 ChannelHandlerContext

每一個ChannelHandler 被添加到ChannelPipeline 後,都會建立一個ChannelHandlerContext 並與之建立的ChannelHandler 關聯綁定。以下圖:

ChannelHandler經過ChannelHandlerContext來操做channel和channelpipeline

2.3 ChannelHandler

ChannelHandler負責I/O事件或者I/O操做進行攔截和處理,用戶能夠經過ChannelHandlerAdapter來選擇性的實現本身感興趣的事件攔截和處理。

因爲Channel只負責實際的I/O操做,所以數據的編解碼和實際處理都須要經過ChannelHandler進行處理。網絡

2.4 注意

ChannelPipeline是線程安全的,多個業務線程能夠併發的操做ChannelPipeline;ChannelHandler不是線程安全的,用戶須要本身保重ChannelHandler的線程安全併發

3. ChannelFuture與ChannelPromise

在Netty中,全部的I/O操做都是異步的,所以調用一個I/O操做後,將繼續當前線程的執行,但I/O操做的結果怎麼得到?——ChannelFuture。

如上圖,當前線程A異步發起I/O操做後,不阻塞繼續執行相關操做,當IO線程B完成後,經過回調執行A設置的回調方法。異步

回調方法經過監聽的形式實現:ChannelFutureListener。

ChannelPromise是ChannelFuture的擴展,容許設置I/O操做的結果,使ChannelFutureListener能夠執行相關操做oop

相關文章
相關標籤/搜索