netty.3.9.4.Final源碼的精簡版本:Simple Netty Source

jopen 10年前發布 | 39K 次閱讀 Netty 網絡工具包 Simple Netty Source

本項目是netty.3.9.4.Final源碼的精簡版本,刪除掉netty中不必要的功能,只保留了核心模塊,方便進行源碼學習。

//TODO

  • 進一步以方法為粒度對源碼做精簡(目前僅以模塊粒度進行源碼精簡)

模塊變更

以下的表格列出了保留的模塊

Modules Function
bootstrap 組織netty模塊工作并啟動相關模塊的工具類
buffer Buffer的具體相關實現
channel 對java nio中的channel的重新封裝的相關實現
channel-socket netty的網絡核心模塊,包括Boss、Worker、Selector、核心主循環等相關實現
logging(不重要) 相關的log工具類實現
util(不重要) 相關的工具類實現,包括Timer、StringUtil、ByteBufferUtil等

注:其中logging和util并不重要,閱讀源碼時可以略過,這里由于一些依賴關系所以保留

以下表格列出了刪除掉的模塊

Modules Function
channel-group Channel Group相關實現
channel-local local transport的相關支持
channel-socket-http http handler的相關實現
channel-socket-oio oio模式下的核心網絡模塊
container 一些無關緊要的適配
example Netty官方自帶的一些例子
handler Netty異常強大功能全面的handler實現
netty-test Netty的單元測試集

源碼閱讀指南

由于netty模塊內部的對象協作關系較為復雜,所以這里推薦從最為簡單的EchoServer作為入口閱讀相關源碼。(Example代碼已經附在了test中)

關鍵源碼閱讀路徑

  • new NioServerSocketChannelFactory() ====> new NioWorkerPool() ====> AbstractNioWorkerPool.init() ====> AbstractNioWorkerPool.newWorker(Executor) ====> NioWorkerPool.createWorker(Executor) ====> new AbstractNioSelector(Executor, ThreadNameDeterminer) ====> AbstractNioSelector.openSelector(ThreadNameDeterminer)
  • new NioServerSocketChannelFactory() ====> new NioServerBossPool() ====> NioServerBossPool.init() ====> AbstractNioBossPool.newBoss(Executor) ====> NioServerBossPool.newBoss(Executor) ====> new NioServerBoss(Executor, ThreadNameDeterminer) ====> AbstractNioSelector.openSelector(ThreadNameDeterminer)
  • AbstractNioSelector.run() ====> AbstractNioSelector.process()
  • AbstractNioSelector.run() ====> NioServerBoss.process()
  • AbstractNioSelector.run() ====> AbstractNioSelector.processTaskQueue()

注意事項

在閱讀過程中需要注意以下幾點:

  • NioWorker和NioServerBoss分別是Worker和Boss的線程runnable實現,Netty的核心nio網絡處理代碼就在這兩個類以及其相關父類中
  • 順著ServerBootstrap的創建,就可以摸清楚NioWorker和NioServerBoss是如何被創建,如何run起來的
  • NioWorker和NioServerBoss中的firexxx一系列方法即為觸發channelPipeline尋找已添加的handler分發對應的事件的入口方法
  • DefaultChannelPipeline實現了ChannelPipeline,其中以鏈表維護具體的handler列表。具體事件的分發分為兩個方向,即upStream和downStream,前者代表read事件的分發,后者代表write事件的分發
  • buffer包中為ChannelBuffer的相關實現,在NioWorker中的process方法的read調用里面可以清晰看到ChannelBuffer的創建和分發的upStream的具體過程。
  • ChannelBuffer的實現主要去看ChannelBuffer -> AbstractChannelBuffer -> HeapChannelBuffer -> BigEndianHeapChannelBuffer這條線即可
  • 善于在關鍵路徑運用斷點查看調用棧,一目了然

項目主頁:http://www.baiduhome.net/lib/view/home/1414743328731

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!