日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java開發(fā)技術(shù)之Netty幾個(gè)核心類介紹

 IT小白在線 2021-09-24

ByteBuf

JDK原生ByteBuffer的核心功能

  1. 字節(jié)緩沖區(qū),主要對(duì)字節(jié)進(jìn)行操作的一個(gè)類

  2. 能夠?qū)⒕彌_區(qū)建立在堆內(nèi)和堆外。普通的new byte[] ,都只是建立在堆內(nèi)

Netty之所以要自己封一套ByteBuf的主要原因是:

  1. 原生ByteBuffer 容量固定,一旦分配不能動(dòng)態(tài)擴(kuò)容和收縮。

  2. 原生ByteBuffer 的API使用不夠優(yōu)雅。稍有不慎,使用將會(huì)出錯(cuò)。它有3個(gè)核心指針,分別為position、 limit、capacity 。position : 位置,表示緩沖區(qū)中正在操作數(shù)據(jù)的位置。limit : 界限,表示緩沖區(qū)中可以操作數(shù)據(jù)的大小,(limit 后數(shù)據(jù)不能進(jìn)行讀寫) capacity : 容量。讀寫需要調(diào)用flip()、rewind()、clear()等方法來(lái)移動(dòng)相關(guān)指針 。

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ò)容。

Channel

Channel 是網(wǎng)絡(luò)操作抽象類,聚合了一組功能,提供了比原生Java SocketChannel、ServerSocketChannel大而全的功能接口,供業(yè)務(wù)開發(fā)者使用,包括但不限于網(wǎng)絡(luò)的讀、寫、發(fā)起連接、關(guān)閉連接、獲取通信雙方的地址。

UnSafe

Channel 的輔助操作類,操作底層網(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)系。

  1. 每個(gè)Channel會(huì)綁定一個(gè)ChannelPipeline,ChannelPipeline中也會(huì)持有Channel的引用

  2. ChannelPipeline持有ChannelHandlerContext鏈路,保留ChannelHandlerContext的頭尾節(jié)點(diǎn)指針

  3. 每個(gè)ChannelHandlerContext會(huì)對(duì)應(yīng)一個(gè)ChannelHandler,也就相當(dāng)于ChannelPipeline持有ChannelHandler鏈路

  4. ChannelHandlerContext同時(shí)也會(huì)持有ChannelPipeline引用,也就相當(dāng)于持有Channel引用

NioEventLoopGroup

Netty遵循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)容與您分享!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多