Netty3服務(wù)端流程簡介

在學(xué)習(xí)Dubbo的時(shí)候需要學(xué)習(xí)Netty的流程等寓涨,在此做一個(gè)簡單的入門學(xué)習(xí)。Dubbo中使用的是Netty3颊亮,所以這里說的都是Netty3阀捅。

Netty3可以看成是對Reactor的實(shí)現(xiàn),所以先簡單看下Reactor模式婚瓜。

Reactor模式

Reactor模式是基于事件驅(qū)動的宝鼓,有以下幾種角色存在:

  • Handle,句柄巴刻,用來表示打開的文件愚铡,打開的連接等,Java NIO中使用Channel來表示。
  • Synchronous Event Demultiplexer沥寥,阻塞的等待發(fā)生在句柄上的一個(gè)或多個(gè)事件碍舍,就是監(jiān)聽事件的到來。Java NIO中使用Selector來表示邑雅。
  • EventHandler接口片橡,來處理不同的請求事件。
  • Concrete Event Handler淮野,EventHandler實(shí)現(xiàn)捧书。
  • Initiation Dispatcher(Reactor),用來管理EventHandler骤星;有事件到來時(shí)分發(fā)事件到EventHandler上去處理经瓷。

Netty中的Reactor模式

Netty中使用了兩層Reactor,Main Reactor用于處理連接請求洞难,Sub Reactor用于處理請求連接之后的讀寫請求舆吮。

Netty中各類釋義

Channel

Reactor模式中使用Handle來表示打開的連接,也就是事件源队贱,在java nio中使用Channel來抽象事件源色冀,Netty中的Channel是自己的抽象。

ChannelEvent

在Netty中使用ChannelEvent來抽象在事件源中可以產(chǎn)生的各種事件柱嫌。

ChannelHandler

作用就是Reactor模式中的EventHandler锋恬,用來處理事件請求。有兩個(gè)子接口:

  • ChannelDownstreamHandler编丘,處理從Netty內(nèi)部流向Socket的事件伶氢。
  • ChannelUpstreamHandler,處理從Socket進(jìn)入Netty內(nèi)部的事件瘪吏。

ChannelPipeline

每個(gè)Channel都會有一個(gè)ChannelPipeline癣防,用來管理ChannelHandler。ChannelPipeline內(nèi)部有一個(gè)ChannelHandler的雙向鏈表掌眠,以Upstream為正方向蕾盯,Downstream為負(fù)方向。

NioSelector

對應(yīng)的是Reactor模式中的Synchronous Event Demultiplexer蓝丙,Java NIO使用Selector级遭,每個(gè)Channel都會把自己注冊到Selector上,Selector就可以監(jiān)聽Channel中發(fā)生的事件渺尘。當(dāng)有事件發(fā)生的時(shí)候挫鸽,會生成ChannelEvent實(shí)例,該事件會被發(fā)送到Channel對應(yīng)的ChannelPipeline中鸥跟,然后交給ChannelHandler處理丢郊。

NioSelector有兩個(gè)實(shí)現(xiàn):

  • Boss盔沫,是Main Reactor,用來處理新連接加入的事件枫匾。
  • Worker架诞,是Sub Reactor,用來處理各個(gè)連接的讀寫事件干茉。

ChannelSink

ChannelSink可以看成Handler最后的一個(gè)處于末尾的萬能handler谴忧,只有DownStream包含ChannelSink。

服務(wù)端例子

public class NettyServerTest {

    private final int port;

    public NettyServerTest(int port){
        this.port = port;
    }

    public void startServer(){
        ChannelFactory channelFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());
        ServerBootstrap serverBootstrap = new ServerBootstrap(channelFactory);

        serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            @Override
            public ChannelPipeline getPipeline() throws Exception {
                return Channels.pipeline(new ServerHandlerTest());
            }
        });

        serverBootstrap.bind(new InetSocketAddress(port));
    }

    public static void main(String[] args) {
        new NettyServerTest(8888).startServer();
    }
}
public class ServerHandlerTest extends SimpleChannelUpstreamHandler {
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        ChannelBuffer channelBuffer = (ChannelBuffer)e.getMessage();
        String msg = channelBuffer.toString(Charset.defaultCharset());
        if(msg != null && !"".equals(msg)){
            System.out.println("服務(wù)端接收到消息:" + msg);
            ChannelBuffer sendMsg = ChannelBuffers.dynamicBuffer();
            sendMsg.writeBytes("我是服務(wù)器角虫,已經(jīng)接到消息".getBytes());
            e.getChannel().write(sendMsg);
        }else {
            e.getChannel().write("我是服務(wù)器沾谓,收到了空消息");
        }
        e.getChannel().close();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        e.getCause();
        e.getChannel().close();
    }
}

ChannelFactory主要是用來產(chǎn)生Channel實(shí)例和ChannelSink實(shí)例。

ChannelPipelineFactory主要是用于具體傳輸數(shù)據(jù)的處理戳鹅,是我們自己實(shí)現(xiàn)具體內(nèi)容搏屑,一般我們是往里面添加Handler實(shí)現(xiàn)。

大概的流程是:

  • 首先使用Boss和Worker兩個(gè)線程池來初始化一個(gè)ChannelFactory粉楚。
  • 使用ChannelFactory來初始化一個(gè)ServerBootstrap實(shí)例。
  • 為ServerBootstrap設(shè)置pipelineFactory亮垫,這里用來添加各種處理用的Handler模软。
  • 使用Bind方法綁定并監(jiān)聽。

Handler處理順序

Handler跟Servlet中的Filter類似饮潦,在Netty中燃异,Handler存在于Pipeline中,是一個(gè)鏈狀的继蜡。

在Netty中存在兩種ChannelHandler回俐,一種是ChannelDownstreamHandler,另外一種是ChannelUpstreamHandler稀并,從Socket流向Netty內(nèi)部的數(shù)據(jù)經(jīng)過ChannelUpstreamHandler處理仅颇,而從Netty內(nèi)部流向Socket的數(shù)據(jù)由ChannelDownstreamHandler處理。

有關(guān)具體的分析和源碼分析碘举,等到dubbo分析完成之后忘瓦,再做。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末引颈,一起剝皮案震驚了整個(gè)濱河市耕皮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝙场,老刑警劉巖凌停,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異售滤,居然都是意外死亡罚拟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舟舒,“玉大人拉庶,你說我怎么就攤上這事⊥豪” “怎么了氏仗?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺鲜。 經(jīng)常有香客問我皆尔,道長,這世上最難降的妖魔是什么币励? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任慷蠕,我火速辦了婚禮,結(jié)果婚禮上食呻,老公的妹妹穿的比我還像新娘流炕。我一直安慰自己,他們只是感情好仅胞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布每辟。 她就那樣靜靜地躺著,像睡著了一般干旧。 火紅的嫁衣襯著肌膚如雪渠欺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天椎眯,我揣著相機(jī)與錄音挠将,去河邊找鬼。 笑死编整,一個(gè)胖子當(dāng)著我的面吹牛舔稀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掌测,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼镶蹋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赏半?” 一聲冷哼從身側(cè)響起贺归,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎断箫,沒想到半個(gè)月后拂酣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仲义,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年婶熬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剑勾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赵颅,死狀恐怖虽另,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饺谬,我是刑警寧澤捂刺,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站募寨,受9級特大地震影響族展,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拔鹰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一仪缸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧列肢,春花似錦恰画、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至决采,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坟奥,已是汗流浹背树瞭。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爱谁,地道東北人晒喷。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像访敌,于是被迫代替她去往敵國和親凉敲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文是Netty文集中“Netty 源碼解析”系列的文章寺旺。主要對Netty的重要流程以及類進(jìn)行源碼解析爷抓,以使得我們...
    tomas家的小撥浪鼓閱讀 2,559評論 2 8
  • 原文出處http://cmsblogs.com/ 『chenssy』轉(zhuǎn)載請注明原創(chuàng)出處,謝謝阻塑! 上篇博客(【死磕N...
    chenssy閱讀 2,352評論 0 6
  • 前奏 https://tech.meituan.com/2016/11/04/nio.html 綜述 netty通...
    jiangmo閱讀 5,858評論 0 13
  • 一心走路 生存的真理是經(jīng)由深刻地覺知顯現(xiàn)出來的蓝撇,而深刻的覺知則來自一心正念的生活,來自無論做任何事情都要時(shí)刻保持的...
    安吉雅子閱讀 143評論 0 0
  • 生活總是充滿戲劇性陈莽。不管你愿意還是不愿意渤昌,生活總在不斷的發(fā)生變化虽抄,確切的說是人在發(fā)生變化,人要不斷的適應(yīng)這一切独柑,就...
    修羅的修行閱讀 202評論 0 0