Netty框架之ChannelPipeline

本文主要記錄下本人看Netty源碼中關(guān)于ChannelPipeline的細(xì)節(jié)問題,為原創(chuàng)內(nèi)容,如有文中有書寫或其他問題,請(qǐng)留言指導(dǎo)修正,互相交流,共同進(jìn)步,本人QQ:417213902。

認(rèn)識(shí)ChannelPipeline

image.png

ChannelPipeline內(nèi)部是實(shí)現(xiàn)類似責(zé)任鏈的調(diào)用,每一個(gè)handler記錄下一個(gè)handler,感覺有點(diǎn)像servlet中的Filter鏈。

源碼解讀

image.png

首先,看下ChannelPipeline接口主要繼承ChannelInboundInvoker 和ChannelOutboundInvoker這兩個(gè)接口

  • ChannelInboundInvoker :AbstractChannelHandlerContext中實(shí)現(xiàn)了該接口,并調(diào)用ChannelInboundHandler的接口,從而實(shí)現(xiàn)真正的調(diào)用
  • ChannelOutboundInvoker :AbstractChannelHandlerContext中實(shí)現(xiàn)了該接口,并調(diào)用ChannelOutboundHandler的接口,從而實(shí)現(xiàn)真正的調(diào)用
  • ChannelInboundHandler:對(duì)從客戶端發(fā)往服務(wù)端的報(bào)文進(jìn)行處理,一般用來執(zhí)行解碼、讀取客戶端數(shù)據(jù)、進(jìn)行業(yè)務(wù)處理等,按照注冊(cè)的先后順序執(zhí)行,若要自行實(shí)現(xiàn)ChannelInboundHandler接口,直接繼承ChannelInboundHandlerAdapter,因?yàn)榇祟愐呀?jīng)有默認(rèn)接口實(shí)現(xiàn)。
  • ChannelOutboundHandler:對(duì)從服務(wù)端發(fā)往客戶端的報(bào)文進(jìn)行處理,一般用來進(jìn)行編碼、發(fā)送報(bào)文到客戶端,按照注冊(cè)的先后順序逆序執(zhí)行 ,同上。

其次,來講下ChannelPipeline的初始化,以下代碼是Netty-4.1官方提供的Example 中服務(wù)端代碼(io.netty.example.echo.EchoServer),這里做了不少的事情,這里除了ChannelPipeline初始化,其他內(nèi)容會(huì)在其他的文章中做闡述,這里我們主要看 .channel(NioServerSocketChannel.class)

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
 try {
             ServerBootstrap b = new ServerBootstrap();
             b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .option(ChannelOption.SO_BACKLOG, 100)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ChannelPipeline p = ch.pipeline();
                     if (sslCtx != null) {
                         p.addLast(sslCtx.newHandler(ch.alloc()));
                     }
                     //p.addLast(new LoggingHandler(LogLevel.INFO));
                      p.addLast(new EchoServerHandler());
                 }
             });
            ChannelFuture f = b.bind(PORT).sync();
            f.channel().closeFuture().sync();
        } finally {        
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
image.png

這是NioServerSocketChannel的類結(jié)構(gòu)層次圖,這里我們主要看AbstractChannel這個(gè)抽象類,查看其構(gòu)造方法,這里同時(shí)也實(shí)例化了一個(gè)DefaultChannelPipeline。


image.png

它其實(shí)是Netty中ChannelPipeline接口的具體實(shí)現(xiàn)類,是ChannelPipeline的核心類,責(zé)任鏈的一系列實(shí)現(xiàn)基本都是通過這個(gè)類來操作。

image.png

我們?cè)賮砜聪翫efaultChannelPipeline的構(gòu)造方法中實(shí)例化了兩個(gè)類,分別是TailContext和HeadContext,都繼承或?qū)崿F(xiàn)了這兩個(gè)接口ChannelHandlerContext 和 ChannelHandler ,它們互相指向, 構(gòu)成一個(gè)類似于雙向鏈表的容器

  • TailContext :我的理解是它是整個(gè)鏈的最后,雖然它實(shí)現(xiàn)了ChannelInboundHandler,但是實(shí)現(xiàn)的方法都是空實(shí)現(xiàn),我認(rèn)為它針對(duì)Inbound沒有實(shí)際上的作用(有點(diǎn)怪異),查資料網(wǎng)上有說法,因?yàn)樵谧詈?,沒有具體實(shí)現(xiàn),說明是一種優(yōu)雅的退出。


    image.png
  • HeadContext :我的理解是它是整個(gè)鏈的第一個(gè),它對(duì)ChannelInboundHandler和ChannelOutboundHandler所有方法都有了實(shí)現(xiàn)


    image.png
  • ChannelHandlerContext :是ChannelPipeline 鏈中每一個(gè)handler 的上下文信息,負(fù)責(zé)調(diào)用對(duì)應(yīng)的ChannelHandler,并指定下一個(gè)ChannelHandlerContext(我的理解)

  • ChannelHandler : 負(fù)責(zé)執(zhí)行對(duì)應(yīng)的handler,并回調(diào)context進(jìn)行下一次調(diào)用

image.png

最后ChannelPipeline真正在哪加載的?
我們會(huì)看到上面摘取的部分Example源碼中,有初始化ChannelPipeline,本以為此處就是加載處,但是后面看到ServerBootstrap.bind方法后,發(fā)現(xiàn)里面有個(gè)init方法,這里又再次重新加載了,我猜想是因?yàn)閯傞_始的Channel通道沒有被綁定或注冊(cè)到真正的Channel上,還需要進(jìn)一步探討。


image.png

2017-12-17 01:24

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • “我的天啊,喬治”金發(fā)男孩哭喪著臉,一邊揉著肩膀,一邊跟旁邊做著推舉的同伴抱怨道,“我們有半年沒見了吧?好不容...
    winng伍寅閱讀 473評(píng)論 0 0
  • 睡眠日夜顛倒已有一段時(shí)間,嘗試了不少方法來改變,依舊如常。 每到假期,心中的惡魔仿佛釋放了一般,肆意的放縱自己,抱...
    鮮活了顏色閱讀 338評(píng)論 4 3
  • 1.重要的三部分 a.情緒. c.情緒的分類. c.情操. 2.原因. a.知道了負(fù)面情緒,原來也不是像我們認(rèn)識(shí)的...
    初見_86a6閱讀 211評(píng)論 0 0
  • chenyaoyao123閱讀 111評(píng)論 0 0
  • 《秋》:致好友 秋 似酒 味醇厚 歲月悠悠 轉(zhuǎn)身又回首 再撫喜樂哀愁 往事如煙花依舊 唯友誼綿長如水流 只緣一路有...
    本顆奮斗心閱讀 753評(píng)論 0 1

友情鏈接更多精彩內(nèi)容