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