Netty源碼閱讀(整體介紹)

一. Netty做了什么梳玫?

1.Netty實現(xiàn)了對Java NIO的封裝导梆,提供了更方便使用的接口贩绕;

2.Netty利用責(zé)任鏈模式實現(xiàn)了ChannelPipeline這一概念艳汽,基于ChannelPipeline嗤无,我們可以 優(yōu)雅的實現(xiàn)網(wǎng)絡(luò)消息的處理(可插拔震束,解耦);

3.Netty的Reactor線程模型当犯,利用無鎖化提高了系統(tǒng)的性能垢村;

4.Netty實現(xiàn)了ByteBuf用于對字節(jié)進(jìn)行緩存和操作,相比JDK的ByteBuffer嚎卫,它更易用嘉栓,同時還提供了Buffer池的功能,對于UnpooledDirectByteBuf和PooledByteBuf,Netty還對其內(nèi)存使用進(jìn)行了跟蹤侵佃,發(fā)現(xiàn)內(nèi)存泄漏時會給出報警麻昼;

二.Netty對JDK NIO的封裝

JDK NIO有ServerSocketChannel、SocketChannel趣钱、Selector涌献、SelectionKey幾個核心概念。

Netty提供了一個Channel接口統(tǒng)一了對網(wǎng)絡(luò)的IO操作首有,其底層的IO通信是交給Unsafe接口實現(xiàn)燕垃,而Channel主要負(fù)責(zé)更高層次的read、write井联、flush卜壕、和ChannelPipeline、Eventloop等組件的交互烙常,以及一些狀態(tài)的展示轴捎;做到了職責(zé)的清晰劃分,對使用者是很友好的蚕脏,規(guī)避了JDK NIO中一些比較繁瑣復(fù)雜的概念和流程侦副。

Channel、Unsafe繼承UML圖

Channel和Unsafe是分多級別實現(xiàn)的驼鞭,不同級別的Channel和Unsafe對應(yīng)了不同級別的實現(xiàn)秦驯,也是“職責(zé)單一原則”的體現(xiàn)。

三.ChannelPipeline責(zé)任鏈模型

借用網(wǎng)上的一張圖表示Channel挣棕、ChannelPipeline译隘、ChannelHandlerContext和ChannelHandler之間的關(guān)系。

每個Channel都持有一個ChannelPipeline洛心,通過Channel的讀寫等IO操作實際上是交由ChannelPipeline處理的固耘,而ChannelPipeline會持有一個ChannelHandlerContext鏈表,每個Context內(nèi)部又包含一個ChannelHandler词身,使用者在Pipeline上添加handler負(fù)責(zé)邏輯處理厅目,ChannelHandlerContext負(fù)責(zé)事件的傳遞流轉(zhuǎn)。每個ChannelPipeline都會持有2個特殊的ChannelHandlerContext——head和tail法严,他們分別是Context鏈表的頭和尾璧瞬。

ChannelPipeline上的事件,分為Inbound事件和Outbound事件2種渐夸,Inbound事件從headContext讀入,在Context鏈上的InboundHandler上正向依次流動渔欢;Outbound事件從Channel(即ChannelPipeline)上觸發(fā)墓塌,則從tailContext上出發(fā),在Context鏈上的OutboundHandler上反向依次流動,若從某一個Context上觸發(fā)苫幢,則從這個Context之后的下一個OutboundContext開始執(zhí)行访诱。headContext利用Unsafe完成實際的IO操作。

我們在使用Netty的時候韩肝,業(yè)務(wù)邏輯其實基本都存在于ChannelHandler触菜;Netty也為我們提供了很多通用的Handler,如一些常用的編解碼Handler哀峻,常見應(yīng)用層協(xié)議的Handler涡相,整流、心跳剩蟀、日志等常用功能的Handler催蝗,合理使用這些Handler能迅速提高我們開發(fā)的效率。

四.Reactor線程模型

Reactor模型是一種常見的并發(fā)編程模型育特,關(guān)于React模型可以參考這篇文章Reactor模型丙号,React模型改變了Thread Per Connection的模式,它將一個網(wǎng)絡(luò)IO操作分為2部分:連接的建立缰冤,網(wǎng)絡(luò)通信及消息處理犬缨;這兩部分分別用單獨(dú)的線程池去處理(一般情況下,連接的建立用單獨(dú)的一個線程就足夠了)棉浸,這樣做的好處如下:功能解耦怀薛、利于維護(hù)、利于組件化復(fù)用涮拗、方便細(xì)粒度的并發(fā)控制乾戏,另外可以通過減少線程數(shù),避免大量的線程切換三热。其模型圖如下:

簡單的說鼓择,一個Reactor線程(池)負(fù)責(zé)接收所有的連接請求,然后將連接產(chǎn)生的Channel賦給Work線程池中的線程就漾,接下來的通信操作都交給Work線程執(zhí)行呐能。

Netty結(jié)合NIO的特點合理的使用了Reactor模型,具體地說抑堡,Netty的Reactor線程接收到一個連接請求后摆出,會創(chuàng)建一個Channel,并為這個Channel分配一個EventLoop首妖,每個EventLoop對應(yīng)一個線程偎漫,Channel上的IO操作將在EventLoop上執(zhí)行,一個Channel僅綁定在一個EventLoop上有缆,一個EventLoop可以對應(yīng)多個Channel象踊,這樣就避免了同步温亲,也提高了線程的使用效率。

實際上杯矩,EventLoop中的線程除了執(zhí)行IO操作栈虚,還會執(zhí)行ChannelPipeline上的handler的責(zé)任鏈方法,這樣做是為了避免頻換切換線程帶來的損耗史隆,所以handler中一般不可以放置耗時的任務(wù)魂务,如果有耗時的任務(wù),可以將任務(wù)放入自定義的線程池中執(zhí)行泌射。

五.ByteBuf

Java的NIO給我們提供了緩沖區(qū)的實現(xiàn)ByteBuffer粘姜,但是它的易用性較差(讀寫模式需要切換等問題),所以魄幕,Netty自己重新實現(xiàn)了緩沖區(qū)ByteBuf相艇,ByteBuf的API更易用、并且提供了內(nèi)存池的功能纯陨,對于池化的ByteBuf和直接內(nèi)存的ByteBuf坛芽,Netty還提供了對內(nèi)存泄漏的監(jiān)控(并且設(shè)置了各種性能級別),另外ByteBuf還提供了對ByteBuffer的兼容翼抠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咙轩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阴颖,更是在濱河造成了極大的恐慌活喊,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量愧,死亡現(xiàn)場離奇詭異钾菊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)偎肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門煞烫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人累颂,你說我怎么就攤上這事滞详。” “怎么了紊馏?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵料饥,是天一觀的道長。 經(jīng)常有香客問我朱监,道長岸啡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任赫编,我火速辦了婚禮凰狞,結(jié)果婚禮上篇裁,老公的妹妹穿的比我還像新娘。我一直安慰自己赡若,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布团甲。 她就那樣靜靜地躺著逾冬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躺苦。 梳的紋絲不亂的頭發(fā)上身腻,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音匹厘,去河邊找鬼嘀趟。 笑死,一個胖子當(dāng)著我的面吹牛愈诚,可吹牛的內(nèi)容都是我干的她按。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼炕柔,長吁一口氣:“原來是場噩夢啊……” “哼酌泰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匕累,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤陵刹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欢嘿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰琐,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年炼蹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡宙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡框弛,死狀恐怖辛辨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑟枫,我是刑警寧澤斗搞,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站慷妙,受9級特大地震影響僻焚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膝擂,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一虑啤、第九天 我趴在偏房一處隱蔽的房頂上張望隙弛。 院中可真熱鬧,春花似錦狞山、人聲如沸全闷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽总珠。三九已至,卻和暖如春勘纯,著一層夾襖步出監(jiān)牢的瞬間局服,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工驳遵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留淫奔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓堤结,卻偏偏與公主長得像唆迁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霍殴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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