Netty源碼解析實戰(6)-pipeline

1 pipeline是什麼?

ChannelPipeline是Netty中很是核心的概念。每一個Netty SocketChannel包含一個ChannelPipeline。markdown

ChannelPipeline包含ChannelHandler實例的list。當數據移入和移出SocketChannel時,將調用這些ChannelHandler實例。數據結構

ChannelHandler接口具備兩個子接口:ide

  • ChannelInboundHandler
  • ChannelOutboundHandler

能夠將ChannelInboundHandler和ChannelOutboundHandler實例都添加到Netty ChannelPipeline。編碼

  • 添加了ChannelInboundHandler、ChannelOutboundHandler實例的ChannelPipeline

從SocketChannel接收到數據後,該數據將傳遞到ChannelPipeline中的第一個ChannelInboundHandler。此ChannelInboundHandler處理數據,而後將數據傳遞到ChannelPipeline中的下一個ChannelInboundHandler。3d

實際上,ChannelInboundHandler能夠在將接收到的數據傳遞到管道中的下一個處理器以前對其進行轉換。例如,原始的字節能夠轉換爲HTTP對象或其餘一些對象。而後,管道中的下一個處理器將看到HTTP對象,而非原始數據。netty

當將數據寫回到SocketChannel時,它以相同方式發生。數據從ChannelOutboundHandler傳遞到ChannelPipeline中的ChannelOutboundHandler,直到到達SocketChannel。 ChannelOutboundHandler實例還能夠轉換流程中的數據。對象

儘管該圖將ChannelInboundHandler和ChannelOutboundHandler實例顯示爲單獨的列表,但它們實際上位於同一list(管道)中。blog

  • 所以,若ChannelInboundHandler決定將某些內容寫回SocketChannel,則數據將經過比ChannelInboundHandler寫入數據更早的ChannelPipeline中位於全部ChannelOutboundHandler實例。

    Netty具備編解碼器(編碼器+解碼器)的概念。 Netty編解碼器將字節轉換爲消息對象(Java對象),或將消息對象轉換爲字節。例如,編解碼器可能會將傳入的HTTP請求的原始字節轉換爲HTTP對象,或者將HTTP響應對象轉換回原始字節。

Netty編解碼器對象實際上只是一個(或兩個)ChannelHandler實現。編解碼器一般由將請求字節轉換爲對象的ChannelInboundHandler實現和將響應對象轉換爲字節的ChannelOutboundHandler組成。接口

Netty隨附了幾種不一樣協議的編解碼器,例如HTTP,WebSocket,SSL / TLS等。爲了將這些協議與Netty一塊兒使用,您必須將相應的協議編解碼器ChannelInboundHandler和ChannelOutboundHandler添加到要使用的SocketChannel的ChannelPipeline中協議。事件

  • netty是如何判斷ChannelHandler類型的?
  • 對於ChannelHandler的添加應該遵循什麼順序?
  • 用戶手動觸發事件傳播,不一樣的觸發方式有什麼區別?
2 pipeline初始化

pipeline在建立Channel的時候被建立


雙向鏈表結構

Pipeline節點數據結構: ChannelHandlerContext


看看其一個實現類

基本數據結構組件

Pipeline中的兩大哨兵: head和tail




3 添加ChannelHandler

先看看用戶代碼

判斷是否重複添加


















用戶方自定義實現便可

6 outBound事件的傳播



















同理之後的過程

7 異常的傳播









對應 tail 爲當前節點的情形

最佳實踐
在最後定義異常處理器,不然默認是 tail 節點的警告打印信息
全部異常最終處理位置

8 pipeline總結



調用 pipeline 添加節點時,netty 會使用 instanceof 關鍵字判斷當前節點是 inboound 仍是 outbound 類型,分別用不一樣的 boolean 類型變量標識

inbound 事件類型順序正相關
outbound 逆相關
異常處理器要麼從 head 或者 tail 節點開始傳播 inbound事件則從當前節點開始傳遞到最後節點 outbound事件則從當前節點開始傳遞 到第一個 outbound節點

相關文章
相關標籤/搜索