ByteBufJDK原生ByteBuffer的核心功能
Netty之所以要自己封一套ByteBuf的主要原因是:
ByteBuf 呢?它使用了核心的兩個(gè)位置指針來(lái)協(xié)助讀寫操作,分別為readerIndex和writerIndex,數(shù)據(jù)讀取readerIndex會(huì)增加,數(shù)據(jù)寫入writerIndex會(huì)增加,不需要增加額外的操作來(lái)移動(dòng)相關(guān)指針。此外 readerIndex 是不可能超過(guò) writerIndex。讀取過(guò) 的 0 ~ readerIndex 這部分空間是被視為棄用的,同時(shí)它可以進(jìn)行自動(dòng)擴(kuò)容。 ChannelChannel 是網(wǎng)絡(luò)操作抽象類,聚合了一組功能,提供了比原生Java SocketChannel、ServerSocketChannel大而全的功能接口,供業(yè)務(wù)開發(fā)者使用,包括但不限于網(wǎng)絡(luò)的讀、寫、發(fā)起連接、關(guān)閉連接、獲取通信雙方的地址。 UnSafeChannel 的輔助操作類,操作底層網(wǎng)絡(luò)I/O,都是由它負(fù)責(zé)實(shí)現(xiàn)。 ChannelPipeLine是Channel數(shù)據(jù)管道的一個(gè)抽象,消息在ChannelPipeLine中流動(dòng)和傳遞。它根據(jù)I/O事件的類型,將消息傳遞給ChannelHandler進(jìn)行處理。同時(shí)對(duì)ChannelHandler鏈表進(jìn)行管理和調(diào)度。在讀取數(shù)據(jù)時(shí),ChannelHandler鏈表的調(diào)度順序是ch1,ch2,ch3,寫數(shù)據(jù)時(shí)調(diào)度順序?yàn)閏h3,ch2,ch1??梢哉f(shuō)它是ChannelHandler的一個(gè)管理容器。 ChannelHandler處理相應(yīng)I/O事件的通道消息處理器,比如,讀事件、寫事件、讀完成事件、寫完成事件等,Netty中眾多的編解碼器等都是實(shí)現(xiàn)自 ChannelHandler。 ChannelHandlerContext通道處理器上下文,通過(guò)它來(lái)完成Channel 、ChannelPipeline、ChannelHandler這幾個(gè)組件之間的交互,采用知識(shí)最小化原則讓每個(gè)組件只關(guān)心ChannelHandlerContext相關(guān)API,。 ok,我們來(lái)大致梳理一下關(guān)于通道的幾個(gè)核心類關(guān)系。
NioEventLoopGroupNetty遵循Reactor基礎(chǔ)線程模型的一個(gè)具體實(shí)現(xiàn)。以下是Reactor幾種基礎(chǔ)線程模型介紹。 Reactor 單線程模型,所有的I/O操作都在同一個(gè)線程上完成。 Reactor多線程模型,有一個(gè)用于專門接收客戶端TCP連接的NIO線程,網(wǎng)絡(luò)I/O 讀、寫操作有專門一個(gè)NIO線程池處理。 主從Reactor多線程模型,專門接收客戶端TCP連接的不在是一個(gè)線程,而是一個(gè)獨(dú)立的線程池(主),網(wǎng)絡(luò)I/O 讀、寫操作仍然是專門一個(gè)NIO線程池處理(從) 相關(guān)java培訓(xùn)開發(fā)技術(shù)知識(shí),關(guān)注我,有更多精彩內(nèi)容與您分享! |
|