參加的阿里中間件性能挑戰(zhàn)賽用到了Netty,就決定利用這個機(jī)會,讀一讀Netty的源碼。首先,我認(rèn)為閱讀源碼大致有2個主要目的,1.了解Netty的內(nèi)部機(jī)制,更好的使用Netty;2.學(xué)習(xí)Netty的實現(xiàn),比如池化的ByteBuf、以及EventLoop的責(zé)任鏈模式,我認(rèn)為都有很多值得借鑒,可以用在工作中的技巧和思想;3.可以看一看比較復(fù)雜的框架代碼的組織結(jié)構(gòu)、代碼風(fēng)格,并做一些思考??。
閱讀源碼之前,首先要有一個大局觀,就是Netty解決了什么問題,有什么優(yōu)點(diǎn),主要有哪些模塊組成?
另外,我認(rèn)為帶著問題去閱讀,才能夠帶來更多的收獲。所以,我想在這次閱讀源碼的過程中,能夠回答以下這些問題:
1. Netty有哪些主要組成部分?
? ? Channel、ChannelPipeline、ChannelHandler、Eventloop、ChannelFuture、Bootstrap等。
2. Netty如何對Java NIO進(jìn)行的封裝?
? ? Netty的Channel借助門面模式,(1)封裝了和網(wǎng)絡(luò)相關(guān)的操作,提供了統(tǒng)一的視圖(對于ServerSocketChannel和SocketChannel),其底層IO操作是由UnSafe接口實現(xiàn)的,而Channel的骨骼類AbstractChannel只是調(diào)用了ChannelPipeline的相應(yīng)方法讓事件在責(zé)任鏈上傳遞依次處理,ChannelPipeline上的HeadContext調(diào)用UnSafe的方法執(zhí)行實際的IO操作;(2)封裝了對Channel接口的配置參數(shù)操作(3)維護(hù)了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è)計方面值得學(xué)習(xí)的地方?
最后,給出一些我初次閱讀較大項目源碼的一些思考:
1. 先了解整體框架,再去找感興趣的部分去讀;
2.帶著問題去讀;
3.閱讀Netty源碼是一個學(xué)習(xí)并發(fā)編程,網(wǎng)絡(luò)編程極好的方式。
Netty中的設(shè)計模式:
????觀察者模式:Future,Listener
? ? 責(zé)任鏈模式:ChannelPipeline
? ? 門面模式:Channel統(tǒng)一封裝了網(wǎng)絡(luò)操作。
? ? 適配器模式:ChannelInboundHandlerAdapter
????裝飾器模式:SimpleLeakAwareByteBuf
io.netty.util.concurrent.SingleThreadEventExecutor#wakeup ?什么作用?
Netty中的死鎖問題?