netty是一個NIO通信框架,但是要用好netty,需要深入理解JAVA IO, NIO以及netty NIO框架的實現方式,本文簡單描述netty的核心模塊。如下圖(來自netty.io首頁)所示,netty包含三個模塊:傳輸服務,支持的協議和核心模塊,我們結合4.1.14.final源代碼介紹三個模塊。
傳輸模塊。傳輸模塊對應的是io.netty.channels包下面實現的的類tcp協議的channel類,channel類提供組合java 對應的channel和從java channel讀寫數據的功能,注冊IO線程,引用channePipeline三類主要功能。channel是連接的抽象,其是將java channel, 線程,pipeline三則相結合的關鍵所在。
核心模塊。核心模塊在源代碼中對應channelPipeline所管理的東西。byteBuffer提供了數據緩存和傳輸的機制,同意交互api定義了channel,pipeline,handler,context的統一接口,事件機制是handler之間,handler與channel之間交互的機制。
協議支持。本質上都是handler, 在netty中,協議就是一堆handler的有序組合。tls, 壓縮解壓,解碼編碼等等,本質上都是對底層channel數據流的粘包/拆包操作。
該圖只是邏輯上的核心模塊劃分, 從閱讀源代碼的角度來講,我個人認為有如下核心模塊。
netty引擎模塊,包含bootstrap, NioEventLoop, NioEventLoopGroup等相關類。bootstrap負責啟動程序,創建channel, 初始化配置channel; eventLoop相關類負責利用selector監控所注冊的channel, 發起channel的讀和寫,是真正的netty引擎,同事eventLoop還負責netty task/scheduedTask的執行。
channel模塊。包含各種協議的channel, channelPipeline相關類,channel中包含對應的unsafe,該類中實現了真正對channel的操作;channelpipeline組織和管理channel上的所有handler,是責任鏈模式的經典實現。
handler模塊.這個模塊是對應應用層協議的實現,包含tls, http等協議的解析,該模塊的代碼可以看一些通用的協議和基礎handler.
netty系列的文章將逐步介紹:
- netty的入口--bootstrap
- netty的發動機--NioEventLoop/NioEventLoopGroup
- TCP的channel--NioSocketChannel/NioServerSocketChannel
- 責任鏈模式--channelPipeline
- netty的數據緩存--byteBuffer
- netty的future/listener回調模式
- netty的連接池
- netty安全--TLS
- http協議解析