Netty總結(1)-Reactor模型

開發(fā)速度快,文檔全播急,性能高

Reactor模型

  • 翻譯:反應器模式脓钾,分發(fā)者模式,通知者模式

原理:

1)通過一個或多個輸入同時請求服務處理器(基于事件驅(qū)動)桩警;
2)服務處理器接收到請求可训,同步分發(fā)到相應的處理線程;
3)使用IO復用監(jiān)聽事件,分發(fā)事件到線程(進程)握截,這點就是網(wǎng)絡高并發(fā)的關鍵飞崖。

組成

1)Reactor:一個單獨的線程
2)Handlers:事件處理器,可能是開啟單獨的線程谨胞,也可能開啟個進程處理事件

單Reactor單線程模型

1)簡單的nio群聊就是這種模式固歪。
2)缺點:不能支持高并發(fā)。不能發(fā)揮cpu性能胯努,有一個handler在讀寫時會阻塞整個系統(tǒng)牢裳。

單Reactor多線程模型

1)Handler加入了線程池,去處理耗時的業(yè)務邏輯叶沛。
2)需要注意的是:線程池處理完蒲讯,需要將結果返回給handler,再返回給客戶端灰署。
3)優(yōu)點:充分發(fā)揮多核cpu的優(yōu)勢判帮;
4)缺點:多線程數(shù)據(jù)共享和訪問比較復雜,Reactor處理所有事件的監(jiān)聽和響應溉箕,是單線程運行晦墙,高并發(fā)場景容易出現(xiàn)性能瓶頸


主從Reactor多線程模型

  1. 圖解
    1)reactor主線程MainReactor對象通過select監(jiān)聽事件,收到事件后轉發(fā)給acceptor
    2) acceptor處理連接事件后约巷,將連接分配給subReactor
    3) subReactor將連接加入到連接隊列進行監(jiān)聽并創(chuàng)建handler進行各種事件處理
    4)當有新事件發(fā)生數(shù)時偎痛,subReactor就會調(diào)用對應的handler處理
    5)handler通過read讀取數(shù)據(jù)旱捧,分發(fā)給后面的worker線程處理
    6)worker線程池分配獨立的線程進行業(yè)務處理独郎,并返回結果
    7)handler收到返回結果后,通過send將結果返回客戶端
    8)Reactor主線程可以對應多個Reactor子線程
  2. 優(yōu)點:父線程和子線程職責明確枚赡,父線程只負責接收連接氓癌,子線程負責業(yè)務處理。父子線程交互也簡單贫橙,父線程只需要把連接傳給子線程贪婉,子線程無需返回數(shù)據(jù)
  3. 缺點:編程復雜度高
  4. 實例:nginx主從Reactor多線程模型,memcached主從多線程卢肃,netty主從多線程模型


Netty模型

image.png
  1. Netty抽象出兩組線程池疲迂,BossGroup專門負責接收客戶端的連接,WorkerGroup專門負責網(wǎng)絡讀寫
  2. BossGroup和WorkerGroup類型都是NioEventLoopGroup
  3. NioEventLoopGroup相當于一個事件循環(huán)組莫湘,這個組中含有多個事件循環(huán)尤蒿,每一個事件循環(huán)是NioEventLoop
  4. NioEventLoop表示一個不斷循環(huán)的執(zhí)行處理任務的線程,每個NioEventLoop都有一個selector幅垮,用于監(jiān)聽綁定在其上的socket的網(wǎng)絡通訊
  5. NioEventLoopGroup可以有多個線程腰池,即可以含有多個NioEventLoop
  6. 每個Boss NioEventLoop 循環(huán)執(zhí)行的步驟有3步
    1)輪詢accept事件
    2)處理accept事件,與client建立連接,生成NioSocketChannel示弓,并將其注冊到某個worker NIOEventLoop上的selector
    3)處理任務隊列的任務讳侨,即runAllTasks
  7. 每個worker NIOEventLoop循環(huán)執(zhí)行的步驟
    1)輪詢read,write事件
    2)處理IO事件奏属,即read,write跨跨,在對應NioSocketchannel處理
    3)處理任務隊列中的任務,即runAllTasks
  8. 每個Worker NIOEventLoop處理業(yè)務時拍皮,會使用pipeline(管道)歹叮,pipeline中包含了channel,即通過pipeline可以獲取到對應通道铆帽,管道中維護了很多的處理器

實戰(zhàn)

https://github.com/lanqqiao/net-demo.git

  • 最簡單Netty服務
服務:NettyServer
服務handler:NettyServerHandler extends ChannelInboundHandlerAdapter
客戶端:NettyClient
客戶端handler:NettyClientHandler extends ChannelInboundHandlerAdapter
  • hander任務異步實現(xiàn)
ctx.channel().eventLoop().execute(new Runnable() {});
ctx.channel().eventLoop().schedule(new Runnable() {}, 5, TimeUnit.SECONDS);
  • ChannelFuture 監(jiān)聽機制
ChannelFuture cf = bootstrap.bind(6668).sync();
            cf.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture channelFuture) throws Exception {
                    if (cf.isSuccess()) {
                        System.out.println("監(jiān)聽端口6668成功");
                    }
                }
            });
  • http服務
    主要是使用netty已經(jīng)存在的handler咆耿,比如http編解碼器:HttpServerCodec
  1. ChannelInitializer初始化里面加內(nèi)置http處理器
pipeline.addLast(new HttpServerCodec());
  1. handler實現(xiàn)時繼承內(nèi)置channelInboundHandler
 extends SimpleChannelInboundHandler<HttpObject> 
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爹橱,隨后出現(xiàn)的幾起案子萨螺,更是在濱河造成了極大的恐慌,老刑警劉巖愧驱,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慰技,死亡現(xiàn)場離奇詭異,居然都是意外死亡组砚,警方通過查閱死者的電腦和手機吻商,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糟红,“玉大人艾帐,你說我怎么就攤上這事∨璩ィ” “怎么了柒爸?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長事扭。 經(jīng)常有香客問我捎稚,道長,這世上最難降的妖魔是什么求橄? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任今野,我火速辦了婚禮,結果婚禮上罐农,老公的妹妹穿的比我還像新娘条霜。我一直安慰自己,他們只是感情好啃匿,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布蛔外。 她就那樣靜靜地躺著蛆楞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夹厌。 梳的紋絲不亂的頭發(fā)上豹爹,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音矛纹,去河邊找鬼臂聋。 笑死,一個胖子當著我的面吹牛或南,可吹牛的內(nèi)容都是我干的孩等。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼采够,長吁一口氣:“原來是場噩夢啊……” “哼肄方!你這毒婦竟也來了?” 一聲冷哼從身側響起蹬癌,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤权她,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逝薪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隅要,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年董济,在試婚紗的時候發(fā)現(xiàn)自己被綠了步清。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡虏肾,死狀恐怖廓啊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情询微,我是刑警寧澤崖瞭,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布狂巢,位于F島的核電站撑毛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唧领。R本人自食惡果不足惜藻雌,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斩个。 院中可真熱鬧胯杭,春花似錦、人聲如沸受啥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至居暖,卻和暖如春顽频,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背太闺。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工糯景, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人省骂。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓蟀淮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钞澳。 傳聞我的和親對象是個殘疾皇子怠惶,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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