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