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