Netty工作原理架構(gòu)

初始化并啟動Netty服務端過程如下:

public static void main(String[] args) {
       // 創(chuàng)建mainReactor
       NioEventLoopGroup boosGroup = new NioEventLoopGroup();
       // 創(chuàng)建工作線程組
       NioEventLoopGroup workerGroup = new NioEventLoopGroup();

       final ServerBootstrap serverBootstrap = new ServerBootstrap();
       serverBootstrap 
                // 組裝NioEventLoopGroup 
               .group(boosGroup, workerGroup)
                // 設(shè)置channel類型為NIO類型
               .channel(NioServerSocketChannel.class)
               // 設(shè)置連接配置參數(shù)
               .option(ChannelOption.SO_BACKLOG, 1024)
               .childOption(ChannelOption.SO_KEEPALIVE, true)
               .childOption(ChannelOption.TCP_NODELAY, true)
               // 配置入站、出站事件handler
               .childHandler(new ChannelInitializer<NioSocketChannel>() {
                   @Override
                   protected void initChannel(NioSocketChannel ch) {
                       // 配置入站、出站事件channel
                       ch.pipeline().addLast(...);
                       ch.pipeline().addLast(...);
                   }
   });

       // 綁定端口
       int port = 8080;
       serverBootstrap.bind(port).addListener(future -> {
           if (future.isSuccess()) {
               System.out.println(new Date() + ": 端口[" + port + "]綁定成功!");
           } else {
               System.err.println("端口[" + port + "]綁定失敗!");
           }
       });
}

基本過程如下:

  1. 初始化創(chuàng)建2個NioEventLoopGroup拧烦,其中boosGroup用于Accetpt連接建立事件并分發(fā)請求,
    workerGroup用于處理I/O讀寫事件和業(yè)務邏輯
  2. 基于ServerBootstrap(服務端啟動引導類)谁帕,配置EventLoopGroup上渴、Channel類型,連接參數(shù)元暴、配置入站篷扩、出站事件handler
  3. 綁定端口,開始工作

結(jié)合上面的介紹的Netty Reactor模型茉盏,介紹服務端Netty的工作架構(gòu)圖:

image

server端包含1個Boss NioEventLoopGroup和1個Worker NioEventLoopGroup鉴未,NioEventLoopGroup相當于1個事件循環(huán)組,這個組里包含多個事件循環(huán)NioEventLoop鸠姨,每個NioEventLoop包含1個selector和1個事件循環(huán)線程铜秆。

每個Boss NioEventLoop循環(huán)執(zhí)行的任務包含3步:

  1. 輪詢accept事件
  2. 處理accept I/O事件,與Client建立連接讶迁,生成NioSocketChannel羽峰,并將NioSocketChannel注冊到某個Worker NioEventLoop的Selector上
  3. 處理任務隊列中的任務,runAllTasks添瓷。任務隊列中的任務包括用戶調(diào)用eventloop.execute或schedule執(zhí)行的任務梅屉,或者其它線程提交到該eventloop的任務。

每個Worker NioEventLoop循環(huán)執(zhí)行的任務包含3步:

  1. 輪詢read鳞贷、write事件坯汤;
  2. 處I/O事件,即read搀愧、write事件惰聂,在NioSocketChannel可讀、可寫事件發(fā)生時進行處理
  3. 處理任務隊列中的任務咱筛,runAllTasks搓幌。

其中任務隊列中的task有3種典型使用場景
1. 用戶程序自定義的普通任務

ctx.channel().eventLoop().execute(new Runnable() {
   @Override
   public void run() {
       //...
   }
});

2. 非當前reactor線程調(diào)用channel的各種方法

例如在推送系統(tǒng)的業(yè)務線程里面,根據(jù)用戶的標識迅箩,找到對應的channel引用溉愁,然后調(diào)用write類方法向該用戶推送消息,就會進入到這種場景饲趋。最終的write會提交到任務隊列中后被異步消費拐揭。

3. 用戶自定義定時任務

ctx.channel().eventLoop().schedule(new Runnable() {
   @Override
   public void run() {
   }
}, 60, TimeUnit.SECONDS);

技術(shù)討論 & 疑問建議 & 個人博客

版權(quán)聲明: 本博客所有文章除特別聲明外撤蟆,均采用 CC BY-NC-SA 3.0 許可協(xié)議,轉(zhuǎn)載請注明出處堂污!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末家肯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盟猖,更是在濱河造成了極大的恐慌讨衣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件式镐,死亡現(xiàn)場離奇詭異值依,居然都是意外死亡,警方通過查閱死者的電腦和手機碟案,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颇蜡,“玉大人价说,你說我怎么就攤上這事》绯樱” “怎么了鳖目?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缤弦。 經(jīng)常有香客問我领迈,道長,這世上最難降的妖魔是什么碍沐? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任狸捅,我火速辦了婚禮,結(jié)果婚禮上累提,老公的妹妹穿的比我還像新娘尘喝。我一直安慰自己,他們只是感情好斋陪,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布朽褪。 她就那樣靜靜地躺著,像睡著了一般无虚。 火紅的嫁衣襯著肌膚如雪缔赠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天友题,我揣著相機與錄音嗤堰,去河邊找鬼。 笑死度宦,一個胖子當著我的面吹牛梁棠,可吹牛的內(nèi)容都是我干的置森。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼符糊,長吁一口氣:“原來是場噩夢啊……” “哼凫海!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起男娄,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤行贪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后模闲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建瘫,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年尸折,在試婚紗的時候發(fā)現(xiàn)自己被綠了啰脚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡实夹,死狀恐怖橄浓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亮航,我是刑警寧澤荸实,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站缴淋,受9級特大地震影響准给,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜重抖,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一露氮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钟沛,春花似錦沦辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至延欠,卻和暖如春陌兑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背由捎。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工兔综, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓软驰,卻偏偏與公主長得像涧窒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锭亏,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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