【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )
文章目錄
- 一、 Pipeline / ChannelPipeline 管道組件
- 二、 Pipeline / ChannelPipeline 管道組件元素解析
一、 Pipeline / ChannelPipeline 管道組件
1 . ChannelPipeline 本質及作用 :
① ChannelPipeline 本質 : ChannelPipeline 是負責業務邏輯的處理器 ChannelHandler 的集合 ;
② ChannelPipeline 作用 : 攔截 入站 ( Inbound ) 和 出站 ( Outbound ) 的 IO 事件 , 并進行相應的業務邏輯處理 ;
ChannelPipeline 是 Handler 集合 , 處理 入站 / 出站 操作 ;
2 . ChannelPipeline 過濾器模式 : ChannelPipeline 設計中使用了過濾器模式 , 基于該過濾器模式的機制 , 用戶可以攔截 IO 事件 , 并進行自己的業務邏輯操作 , 攔截 IO 事件 , 使用該 ChannelPipeline 對象的 Channel 通道中的 ChannelHandler 中處理業務邏輯 ;
3 . ChannelPipeline 相關組件的對應關系 :
① 管道與通道 : 每個 ChannelPipeline 管道對應一個 Channel 通道 , ChannelPipeline 與 Channel 兩者是 1:11:11:1 的關系 ;
② 管道與處理器 : 每個 ChannelPipeline 管道中維護了處理器 ChannelHandler 集合 , 管道 ChannelPipeline 與 處理器 Handler 兩者是 1:n1:n1:n 的關系 ;
③ 處理器與處理器上下文 : 每個 ChannelHandler 處理器都有一個與之對應的 ChannelHandlerContext , 二者是 1:11:11:1 的關系 ;
④ 處理器上下文鏈表 : 管道中的 ChannelHandler 處理器是放在一個集合中的 , 每個與 ChannelHandler 對應的 ChannelHandlerContext 是放在一個雙向鏈表中 ;
⑤ 圖示 : 下圖可以描述 Channel 管道 , ChannelPipeline 管道 , ChannelHandlerContext 通道處理器上下文 , ChannelHandler 處理器的對應關系及結構 ;
二、 Pipeline / ChannelPipeline 管道組件元素解析
1 . Debug 調試查看管道內部元素 : 任意找一個 Netty 服務器程序 , 綁定端口后 , 獲取一下 ChannelPipeline , 然后 Debug 調試查看 ChannelPipeline 中的元素結構 ;
2 . 代碼及斷點 : 運行 【Netty】使用 Netty 開發 HTTP 服務器 | 三、 HTTP 服務器代碼實現 中的 HTTP 服務器代碼 , 在 ServerBootstrap 配置中的 childHandler 設置 ChannelInitializer 最后一行代碼打斷點 ;
這里只列舉部分代碼 , 在獲取 ChannelPipeline 代碼處打上斷點 , 查看其內部元素
// 1. 之前創建 bossGroup workerGroup 兩個線程池 // 省略一萬行代碼 ...// 2. 服務器啟動對象, 需要為該對象配置各種參數 ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) // 設置 主從 線程組 , 分別對應 主 Reactor 和 從 Reactor.channel(NioServerSocketChannel.class) // 設置 NIO 網絡套接字通道類型.option(ChannelOption.SO_BACKLOG, 128) // 設置線程隊列維護的連接個數.childOption(ChannelOption.SO_KEEPALIVE, true) // 設置連接狀態行為, 保持連接狀態// 核心分析代碼 ------------------------------------------------------------------------.childHandler( // 為 WorkerGroup 線程池對應的 NioEventLoop 設置對應的事件 處理器 Handlernew ChannelInitializer<SocketChannel>() {// 創建通道初始化對象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 該方法在服務器與客戶端連接建立成功后會回調// 獲取管道ChannelPipeline pipeline = ch.pipeline();// 為管道加入 HTTP 協議的編解碼器 HttpServerCodec,// codec 中的 co 是 coder 編碼器的意思, dec 是 decoder 解碼器的意思// 第一個字符串是編解碼器的名稱pipeline.addLast("HttpServerCodec" , new HttpServerCodec());// 為管道 Pipeline 設置處理器 Hanedlerpipeline.addLast("HTTPServerHandler", new HTTPServerHandler());// 管道初始化完成// 在此行代碼上打斷點 ----------------------------------------------System.out.println("管道初始化完成!");}});// 核心分析代碼 ------------------------------------------------------------------------3 . 運行程序進入斷點 :
① 運行服務器端程序 : 使用 debug 模式運行服務器程序
② 瀏覽器訪問服務器 : 瀏覽器訪問 http://127.0.0.1:8888 地址 , 此時代碼執行進入斷點位置 ;
4 . ChannelPipeline 管道內元素分析 :
① 管道類 : ChannelPipeline 本身的類型是 DefaultChannelPipeline ;
② 管道與通道 : 管道 ChannelPipeline 中可以獲取到 Channel 通道 , 通道 Channel 中也可以獲取到 管道 ChannelPipeline ;
③ ChannelHandlerContext 雙向鏈表 :
-
鏈表頭 : head 是 管道處理器上下文 ChannelHandlerContext 的雙向鏈表的鏈表頭 ;
-
鏈表尾 : tail 是 管道處理器上下文 ChannelHandlerContext 的雙向鏈表的鏈表尾 ;
5 . ChannelHandlerContext 類型 : head 和 tail 都是 ChannelHandlerContext 類型的 ;
① 接口 : ChannelHandlerContext 類型是接口 , 實際使用的是該接口的實現類 ;
public interface ChannelHandlerContext extends AttributeMap, ChannelInboundInvoker, ChannelOutboundInvoker② 接口實現類 : ChannelHandlerContext 接口有 666 個實現類 , 常用的是 DefaultChannelHandlerContext 實現類 ;
總結
以上是生活随笔為你收集整理的【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Netty】Netty 核心组件 (
- 下一篇: 【Netty】Netty 核心组件 (