參加的阿里中間件性能挑戰(zhàn)賽用到了Netty赶熟,就決定利用這個機會茫负,讀一讀Netty的源碼破停。首先翅楼,我認為閱讀源碼大致有2個主要目的,1.了解Netty的內(nèi)部機制真慢,更好的使用Netty毅臊;2.學習Netty的實現(xiàn),比如池化的ByteBuf黑界、以及EventLoop的責任鏈模式管嬉,我認為都有很多值得借鑒皂林,可以用在工作中的技巧和思想;3.可以看一看比較復(fù)雜的框架代碼的組織結(jié)構(gòu)蚯撩、代碼風格础倍,并做一些思考??。
閱讀源碼之前胎挎,首先要有一個大局觀沟启,就是Netty解決了什么問題,有什么優(yōu)點犹菇,主要有哪些模塊組成德迹?
另外,我認為帶著問題去閱讀揭芍,才能夠帶來更多的收獲浦辨。所以,我想在這次閱讀源碼的過程中沼沈,能夠回答以下這些問題:
1. Netty有哪些主要組成部分流酬?
? ? Channel、ChannelPipeline列另、ChannelHandler芽腾、Eventloop、ChannelFuture页衙、Bootstrap等摊滔。
2. Netty如何對Java NIO進行的封裝?
? ? Netty的Channel借助門面模式店乐,(1)封裝了和網(wǎng)絡(luò)相關(guān)的操作艰躺,提供了統(tǒng)一的視圖(對于ServerSocketChannel和SocketChannel),其底層IO操作是由UnSafe接口實現(xiàn)的眨八,而Channel的骨骼類AbstractChannel只是調(diào)用了ChannelPipeline的相應(yīng)方法讓事件在責任鏈上傳遞依次處理腺兴,ChannelPipeline上的HeadContext調(diào)用UnSafe的方法執(zhí)行實際的IO操作;(2)封裝了對Channel接口的配置參數(shù)操作(3)維護了Channel的狀態(tài)(readable廉侧,writable页响,open,active等)(4)Channel接口還聚合了ChannelPipeline接口段誊,而ChannelPipeline用于處理所有的IO事件闰蚕。
3.?Netty如何利用無鎖化做到的高性能?
4. netty如何監(jiān)控內(nèi)存泄漏连舍?
5. netty如何實現(xiàn)的buffer池没陡?
6. netty在代碼設(shè)計方面值得學習的地方?
最后,給出一些我初次閱讀較大項目源碼的一些思考:
1. 先了解整體框架盼玄,再去找感興趣的部分去讀贴彼;
2.帶著問題去讀;
3.閱讀Netty源碼是一個學習并發(fā)編程强岸,網(wǎng)絡(luò)編程極好的方式锻弓。
Netty中的設(shè)計模式:
????觀察者模式:Future,Listener
? ? 責任鏈模式:ChannelPipeline
? ? 門面模式:Channel統(tǒng)一封裝了網(wǎng)絡(luò)操作蝌箍。
? ? 適配器模式:ChannelInboundHandlerAdapter
????裝飾器模式:SimpleLeakAwareByteBuf
io.netty.util.concurrent.SingleThreadEventExecutor#wakeup ?什么作用青灼?
Netty中的死鎖問題?