netty是一個NIO通信框架谨垃,但是要用好netty癣诱,需要深入理解JAVA IO, NIO以及netty NIO框架的實現(xiàn)方式匿沛,本文簡單描述netty的核心模塊敦捧。如下圖(來自netty.io首頁)所示须板,netty包含三個模塊:傳輸服務,支持的協(xié)議和核心模塊兢卵,我們結(jié)合4.1.14.final源代碼介紹三個模塊习瑰。
傳輸模塊。傳輸模塊對應的是io.netty.channels包下面實現(xiàn)的的類tcp協(xié)議的channel類秽荤,channel類提供組合java 對應的channel和從java channel讀寫數(shù)據(jù)的功能甜奄,注冊IO線程,引用channePipeline三類主要功能窃款。channel是連接的抽象贺嫂,其是將java channel, 線程,pipeline三則相結(jié)合的關鍵所在雁乡。
核心模塊第喳。核心模塊在源代碼中對應channelPipeline所管理的東西。byteBuffer提供了數(shù)據(jù)緩存和傳輸?shù)臋C制踱稍,同意交互api定義了channel,pipeline,handler,context的統(tǒng)一接口曲饱,事件機制是handler之間,handler與channel之間交互的機制珠月。
協(xié)議支持扩淀。本質(zhì)上都是handler, 在netty中,協(xié)議就是一堆handler的有序組合啤挎。tls, 壓縮解壓驻谆,解碼編碼等等,本質(zhì)上都是對底層channel數(shù)據(jù)流的粘包/拆包操作庆聘。
該圖只是邏輯上的核心模塊劃分, 從閱讀源代碼的角度來講胜臊,我個人認為有如下核心模塊。
netty引擎模塊伙判,包含bootstrap, NioEventLoop, NioEventLoopGroup等相關類象对。bootstrap負責啟動程序,創(chuàng)建channel, 初始化配置channel; eventLoop相關類負責利用selector監(jiān)控所注冊的channel, 發(fā)起channel的讀和寫宴抚,是真正的netty引擎勒魔,同事eventLoop還負責netty task/scheduedTask的執(zhí)行甫煞。
channel模塊。包含各種協(xié)議的channel, channelPipeline相關類冠绢,channel中包含對應的unsafe,該類中實現(xiàn)了真正對channel的操作抚吠;channelpipeline組織和管理channel上的所有handler,是責任鏈模式的經(jīng)典實現(xiàn)。
handler模塊.這個模塊是對應應用層協(xié)議的實現(xiàn)弟胀,包含tls, http等協(xié)議的解析楷力,該模塊的代碼可以看一些通用的協(xié)議和基礎handler.
netty系列的文章將逐步介紹:
- netty的入口--bootstrap
- netty的發(fā)動機--NioEventLoop/NioEventLoopGroup
- TCP的channel--NioSocketChannel/NioServerSocketChannel
- 責任鏈模式--channelPipeline
- netty的數(shù)據(jù)緩存--byteBuffer
- netty的future/listener回調(diào)模式
- netty的連接池
- netty安全--TLS
- http協(xié)議解析