Netty 是一個(gè) NIO 客戶端服務(wù)器框架,它可以快速輕松地開發(fā)網(wǎng)絡(luò)應(yīng)用程序,例如協(xié)議服務(wù)器和客戶端。它極大地簡(jiǎn)化和精簡(jiǎn)了 TCP 和 UDP 套接字服務(wù)器等網(wǎng)絡(luò)編程。
設(shè)計(jì)
各種傳輸類型的統(tǒng)一 API - 阻塞和非阻塞套接字
基于靈活且可擴(kuò)展的事件模型,允許清晰的關(guān)注點(diǎn)分離
高度可定制的線程模型——單線程、一個(gè)或多個(gè)線程池,如 SEDA
真正的無連接數(shù)據(jù)報(bào)套接字支持(自 3.1 起)
表現(xiàn)
更高的吞吐量,更低的延遲
更少的資源消耗
最小化不必要的內(nèi)存復(fù)制?
(以上摘自官網(wǎng)內(nèi)容)
核心方法
EventLoopGroup bossGroup =new NioEventLoopGroup(1);
EventLoopGroup workerGroup =new NioEventLoopGroup(8);
建立線程池包裝對(duì)象
bossGroup一個(gè)負(fù)責(zé)處理所有客戶端的連接請(qǐng)求
workerGroup負(fù)責(zé)處理所有客戶端發(fā)送的數(shù)據(jù)請(qǐng)求
我們?cè)谑褂肗etty時(shí),主要負(fù)責(zé)編寫Handler方法來實(shí)現(xiàn)業(yè)務(wù)邏輯
通過繼承SimpleChannelInboundHandler等Handler方法來實(shí)現(xiàn)邏輯
如客戶端的上線下線,客戶端的發(fā)送的數(shù)據(jù) 這里面涉及到數(shù)據(jù)傳輸編解碼序列化問題,Netty內(nèi)置有JDK層面的序列化功能,但是效率不是很高
粘包拆包
零拷貝機(jī)制
Netty的數(shù)據(jù)處理API通過兩個(gè)組件暴露——abstract class ByteBuf和interface ByteBufHolder。
Bytebuf 內(nèi)存緩沖區(qū),直接使用的直接內(nèi)存進(jìn)行數(shù)據(jù)傳輸? 性能高?
Bytebuf擴(kuò)容:4M以內(nèi),為翻倍擴(kuò)容 大于4M后,容量依然不夠,不會(huì)進(jìn)行翻倍擴(kuò)容,每次加4M 擴(kuò)容?
有縮容機(jī)制
NIO空輪詢BUG?
elector , 一般稱為選擇器。它是 Java NIO 核心組件中的一個(gè),用于輪詢一個(gè)或多個(gè) NIO Channel 的狀態(tài)是否處于可讀、可寫。如此,一個(gè)線程就可以管理多個(gè) Channel ,也就說可以管理多個(gè)網(wǎng)絡(luò)連接。也因此,Selector 也被稱為多路復(fù)用器。
首先,需要將 Channel 注冊(cè)到 Selector 中,這樣 Selector 才知道哪些 Channel 是它需要管理的。
之后,Selector 會(huì)不斷地輪詢注冊(cè)在其上的 Channel 。如果某個(gè) Channel 上面發(fā)生了讀或者寫事件,這個(gè) Channel 就處于就緒狀態(tài),會(huì)被 Selector 輪詢出來,然后通過 SelectionKey 可以獲取就緒 Channel 的集合,進(jìn)行后續(xù)的 I/O 操作。
以上摘自簡(jiǎn)書作者??何何與呵呵呵
epoll BUG導(dǎo)致沒有事件進(jìn)來也能跳出循環(huán)執(zhí)行邏輯,并且不斷的空輪詢,導(dǎo)致CPU飆高,在netty中解決了空輪詢BUG,一旦空輪詢次數(shù)達(dá)到512次 重新new一個(gè)selector 取代舊的selector ,將以前注冊(cè)到selector上的Channel轉(zhuǎn)移到新selector?