對(duì)Netty組件的基本介紹
Netty的介紹
netty是一個(gè)異步的基于事件的框架,主要針對(duì)在tcp協(xié)議下,開發(fā)面向clients端的高并發(fā)應(yīng)用。
netty本質(zhì)是一個(gè)nio框架。
IO模型
Java共支持3中io模型 : BIO,AIO,NIO
BIO
同步阻塞,一個(gè)連接一個(gè)線程,有連接請(qǐng)求時(shí)服務(wù)端就需要啟動(dòng)一個(gè)線程處理。如果這個(gè)線程不做任何事就會(huì)造成不必要的開銷。當(dāng)并發(fā)數(shù)較大時(shí),需要?jiǎng)?chuàng)建大量線程來處理連接。
NIO
同步非阻塞,可以做到一個(gè)線程處理多個(gè)操作。
NIO 有三大核心部分,Channel,Buffer ,selector
selector、 channel 和buffer的關(guān)系
- 每個(gè)channel 對(duì)應(yīng)一個(gè)buffer
- selector 對(duì)應(yīng)一個(gè)線程,一個(gè)線程對(duì)應(yīng)多個(gè)channel
- 程序切換哪個(gè)channel 是由事件決定的。event
- selector 會(huì)根據(jù)不同的事件,在各個(gè)通道上切換
- Buffer 就是一個(gè)內(nèi)存塊,底層是有一個(gè)數(shù)組
- 數(shù)據(jù)的讀取寫入是通過buffer,既可以讀也可以寫, 兩者切換的方法是flip
- channel 是雙向的
Buffer緩沖區(qū)
一個(gè)可以讀寫數(shù)據(jù)的內(nèi)存塊,可以理解成一個(gè)容器對(duì)象。它負(fù)責(zé)從channel中讀取數(shù)據(jù),封裝成Buffer對(duì)象。Buffer為每一個(gè)基本數(shù)據(jù)類型都提供了實(shí)現(xiàn)類。它主要有三個(gè)屬性:
- capacity
內(nèi)存塊的固定大小值
- position
下一個(gè)要進(jìn)行讀寫位置的索引
- limit
在寫模式下,limit = position ,在讀模式下,它表示你最多讀到之前寫入的最大值
重要的方法
allocate(int count) 初始化buffer容量
get () 從 position 位置讀
flip() 由寫模式切換為讀模式
Channel 通道
作用類似于流,但是可以同時(shí)進(jìn)行讀寫,可以異步讀寫。
Channel在NIo中是一個(gè)接口,它的實(shí)現(xiàn)類有:
- FileChannel 用于文件讀寫
- ServerSocketChannel TCP數(shù)據(jù)讀寫
- DatagramChannel 用于UDP數(shù)據(jù)讀寫
主要方法:
- read 從通道讀取數(shù)據(jù)并放到緩沖區(qū)中
- write 把緩沖區(qū)的數(shù)據(jù)寫到通道中
- transferfrom
- transferto
Selector 選擇器
能夠監(jiān)測(cè)多個(gè)注冊(cè)的通道上是否有事件發(fā)生,如果有事件發(fā)生獲取事件交給通道處理。
主要方法:
- open 獲取一個(gè)選擇器對(duì)象
- SelectionKey register(seelctor,常量) 注冊(cè)通道 ,常量一共有4種,read讀,write寫,connect 連接已建立 ,accept(有新的網(wǎng)絡(luò)連接可以接入)
- select() 監(jiān)測(cè)所有注冊(cè)的通道,阻塞
原生NIo存在的問題
類庫(kù)與API復(fù)雜,開發(fā)難度大,有bug
Netty模型
- netty抽象出2組線程池,bossGroup 負(fù)責(zé)接受客戶端的連接,workGroup 負(fù)責(zé)讀寫
- bossGroup 與workerGroup 都是NioEventLoopGroup
- 每一個(gè)NioEventLoopGroup相當(dāng)于一個(gè)事件循環(huán)組,每個(gè)循環(huán)都是NIoEventLoop
- NIoEventLoop表示一個(gè)不斷循環(huán)處理執(zhí)行任務(wù)的線程
Netty核心模塊組件
Bootstrap,ServerBootstrap
Channel
ChannelFuture
netty中所有操作都是異步的,所以我們需要一個(gè)能夠確定其結(jié)果的方法。通過addListener() 方法獲取通知。
ChannelHandler
處理入站和出棧邏輯的容器。
生命周期方法
handlerAdded 當(dāng)ChannelHandler 添加到ChanelPipeLine中調(diào)用
handlerRemoved 移除時(shí)調(diào)用
它主要有2個(gè)子接口, ChannelInboundHandler 和 ChannelOutBoundHandler
ChannelPipeLine
它是ChannelHandler 的容器,內(nèi)部定義了一組ChannelHandler,是一組過濾器鏈
ChannelHandlerContext
用于ChannelPipe 和 ChannelHandler的關(guān)聯(lián),同一個(gè)ChannelPipeline 里的ChannelHandler的交互。
ByteBuf
netty的數(shù)據(jù)容器,是netty實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)。
內(nèi)部維護(hù)了兩個(gè)不同的索引,readIndex ,writeIndex。通過這兩個(gè)索引將數(shù)據(jù)劃分為3個(gè)區(qū)域。已經(jīng)讀過的字節(jié),可讀字節(jié),可寫字節(jié)。相比于jdk原生的bytebuf ,它有兩個(gè)指針,在讀寫轉(zhuǎn)換時(shí)不需要進(jìn)行flip()
到此這篇關(guān)于對(duì)Netty組件的基本介紹的文章就介紹到這了,更多相關(guān)Netty組件介紹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解
從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下2022-06-06spring boot實(shí)現(xiàn)在request里解密參數(shù)返回
這篇文章主要介紹了Spring Boot實(shí)現(xiàn)在request里解密參數(shù)返回操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Gson中@JsonAdater注解的幾種方式總結(jié)
這篇文章主要介紹了Gson中@JsonAdater注解的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸
這篇文章主要介紹了SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06java客戶端Etcd官方倉(cāng)庫(kù)jetcd中KeepAlive接口實(shí)現(xiàn)
這篇文章主要為大家介紹了java客戶端Etcd官方倉(cāng)庫(kù)jetcd中KeepAlive接口實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,多多加薪2022-02-02Springboot內(nèi)置的工具類之CollectionUtils示例講解
這篇文章主要介紹了Springboot內(nèi)置的工具類之CollectionUtils,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12