日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Netty的实现原理、特点与优势、以及适用场景

發(fā)布時間:2024/7/5 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Netty的实现原理、特点与优势、以及适用场景 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

高并發(fā)編程系列

高并發(fā)編程系列:NIO、BIO、AIO的區(qū)別,及NIO的應(yīng)用和框架選型

高并發(fā)編程系列:ConcurrentHashMap的實現(xiàn)原理(JDK1.7和JDK1.8)

高并發(fā)編程系列:CountDownLatch、Semaphore等4大并發(fā)工具類詳解

高并發(fā)編程系列:并發(fā)容器的原理,7大并發(fā)容器詳解、及使用場景

高并發(fā)發(fā)編程系列:Java線程池的使用方式,核心運行原理、以及注意事項

高并發(fā)編程系列:4種常用Java線程鎖的特點,性能比較、使用場景


Netty

1.介紹

Netty是由JBOSS提供的一個java開源框架。

Netty是一個高性能、異步事件驅(qū)動的NIO框架,它提供了對TCP、UDP和文件傳輸?shù)闹С帧W鳛楫?dāng)前最流行的NIO框架,Netty在互聯(lián)網(wǎng)領(lǐng)域、大數(shù)據(jù)分布式計算領(lǐng)域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應(yīng)用,一些業(yè)界著名的開源組件也基于Netty的NIO框架構(gòu)建(文章尾有詳細介紹)。

2.Netty的特點

  • 高并發(fā)

Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)開發(fā)的網(wǎng)絡(luò)通信框架,對比于BIO(Blocking I/O,阻塞IO),他的并發(fā)性能得到了很大提高 。

  • 傳輸快

Netty的傳輸快其實也是依賴了NIO的一個特性——零拷貝。

  • 封裝好

Netty封裝了NIO操作的很多細節(jié),提供易于使用的API。

什么選擇Netty

JDK 原生也有一套網(wǎng)絡(luò)應(yīng)用程序 API,但是存在一系列問題,主要如下:

1)NIO 的類庫和 API 繁雜,使用麻煩:你需要熟練掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。

2)需要具備其他的額外技能做鋪墊:例如熟悉 Java 多線程編程,因為 NIO 編程涉及到 Reactor 模式,你必須對多線程和網(wǎng)路編程非常熟悉,才能編寫出高質(zhì)量的 NIO 程序。

3)可靠性能力補齊,開發(fā)工作量和難度都非常大:例如客戶端面臨斷連重連、網(wǎng)絡(luò)閃斷、半包讀寫、失敗緩存、網(wǎng)絡(luò)擁塞和異常碼流的處理等等。NIO 編程的特點是功能開發(fā)相對容易,但是可靠性能力補齊工作量和難度都非常大。

4)JDK
NIO 的 Bug:例如臭名昭著的 Epoll Bug,它會導(dǎo)致 Selector 空輪詢,最終導(dǎo)致 CPU 100%。官方聲稱在 JDK
1.6 版本的 update 18 修復(fù)了該問題,但是直到 JDK 1.7 版本該問題仍舊存在,只不過該 Bug
發(fā)生概率降低了一些而已,它并沒有被根本解決。

Netty框架的優(yōu)勢

  • API使用簡單,開發(fā)門檻低;
  • 功能強大,預(yù)置了多種編解碼功能,支持多種主流協(xié)議;
  • 定制能力強,可以通過ChannelHandler對通信框架進行靈活地擴展;
  • 性能高,通過與其他業(yè)界主流的NIO框架對比,Netty的綜合性能最優(yōu);
  • 成熟、穩(wěn)定,Netty修復(fù)了已經(jīng)發(fā)現(xiàn)的所有JDK NIO BUG,業(yè)務(wù)開發(fā)人員不需要再為NIO的BUG而煩惱;
  • 社區(qū)活躍,版本迭代周期短,發(fā)現(xiàn)的BUG可以被及時修復(fù),同時,更多的新功能會加入;
  • 經(jīng)歷了大規(guī)模的商業(yè)應(yīng)用考驗,質(zhì)量得到驗證。在互聯(lián)網(wǎng)、大數(shù)據(jù)、網(wǎng)絡(luò)游戲、企業(yè)應(yīng)用、電信軟件等眾多行業(yè)得到成功商用,證明了它已經(jīng)完全能夠滿足不同行業(yè)的商業(yè)應(yīng)用了。

Netty的架構(gòu)設(shè)計

總體結(jié)構(gòu)

Netty 采用了比較典型的三層網(wǎng)絡(luò)架構(gòu)進行設(shè)計,邏輯架構(gòu)圖如下所示:

1)傳輸服務(wù):支持 BIO 和 NIO;

2)容器集成:支持 OSGI、JBossMC、Spring、Guice 容器;

3)協(xié)議支持:HTTP、Protobuf、二進制、文本、WebSocket 等一系列常見協(xié)議都支持。還支持通過實行編碼解碼邏輯來實現(xiàn)自定義協(xié)議;

4)Core 核心:可擴展事件模型、通用通信 API、支持零拷貝的 ByteBuf 緩沖對象。

Netty的高性能設(shè)計

1.高性能的三大要素

1) 傳輸:用什么樣的通道將數(shù)據(jù)發(fā)送給對方,BIO、NIO或者AIO,IO模型在很大程度上決定了框架的性能。

2) 協(xié)議:采用什么樣的通信協(xié)議,HTTP或者內(nèi)部私有協(xié)議。協(xié)議的選擇不同,性能模型也不同。相比于公有協(xié)議,內(nèi)部私有協(xié)議的性能通常可以被設(shè)計的更優(yōu)。

3) 線程:數(shù)據(jù)報如何讀取?讀取之后的編解碼在哪個線程進行,編解碼后的消息如何派發(fā),Reactor線程模型的不同,對性能的影響也非常大。

2.IO模型

Netty的I/O模型基于非阻塞I/O實現(xiàn),底層依賴的是JDK NIO框架的Selector。

3.Reactor線程模型

關(guān)于Java NIO 構(gòu)造Reator模式,Doug lea在《Scalable IO in Java》中給了很好的闡述,這里截取PPT對Reator模式的實現(xiàn)進行說明。

1)Reactor單線程模型:Reactor單線程模型,指的是所有的I/O操作都在同一個NIO線程上面完成。對于一些小容量應(yīng)用場景,可以使用單線程模型。

2)Reactor多線程模型:Rector多線程模型與單線程模型最大的區(qū)別就是有一組NIO線程處理I/O操作。主要用于高并發(fā)、大業(yè)務(wù)量場景。

3)主從Reactor多線程模型:主從Reactor線程模型的特點是服務(wù)端用于接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。利用主從NIO線程模型,可以解決1個服務(wù)端監(jiān)聽線程無法有效處理所有客戶端連接的性能不足問題。

4.Netty的線程模型

說完了Reactor的三種模型,那么Netty是哪一種呢?其實Netty的線程模型是Reactor模型的變種,那就是去掉線程池的第三種形式的變種,這也是Netty NIO的默認模式。

Netty的核心組件

Netty應(yīng)用中必不可少的組件:

  • Bootstrap or ServerBootstrap
  • EventLoop
  • EventLoopGroup
  • ChannelPipeline
  • Channel
  • Future or ChannelFuture
  • ChannelInitializer
  • ChannelHandler

1.Bootstrap

一個Netty應(yīng)用通常由一個Bootstrap開始,它主要作用是配置整個Netty程序,串聯(lián)起各個組件。

Handler,為了支持各種協(xié)議和處理數(shù)據(jù)的方式,便誕生了Handler組件。Handler主要用來處理各種事件,這里的事件很廣泛,比如可以是連接、數(shù)據(jù)接收、異常、數(shù)據(jù)轉(zhuǎn)換等。

2.ChannelInboundHandler

一個最常用的Handler。這個Handler的作用就是處理接收到數(shù)據(jù)時的事件,也就是說,我們的業(yè)務(wù)邏輯一般就是寫在這個Handler里面的,ChannelInboundHandler就是用來處理我們的核心業(yè)務(wù)邏輯。

3.ChannelInitializer

當(dāng)一個鏈接建立時,我們需要知道怎么來接收或者發(fā)送數(shù)據(jù),當(dāng)然,我們有各種各樣的Handler實現(xiàn)來處理它,那么ChannelInitializer便是用來配置這些Handler,它會提供一個ChannelPipeline,并把Handler加入到ChannelPipeline。

4.ChannelPipeline

一個Netty應(yīng)用基于ChannelPipeline機制,這種機制需要依賴于EventLoop和EventLoopGroup,因為它們?nèi)齻€都和事件或者事件處理相關(guān)。

EventLoops的目的是為Channel處理IO操作,一個EventLoop可以為多個Channel服務(wù)。

EventLoopGroup會包含多個EventLoop。

5.Channel

代表了一個Socket鏈接,或者其它和IO操作相關(guān)的組件,它和EventLoop一起用來參與IO處理。

6.Future

在Netty中所有的IO操作都是異步的,因此,你不能立刻得知消息是否被正確處理,但是我們可以過一會等它執(zhí)行完成或者直接注冊一個監(jiān)聽,具體的實現(xiàn)就是通過Future和ChannelFutures,他們可以注冊一個監(jiān)聽,當(dāng)操作執(zhí)行成功或失敗時監(jiān)聽會自動觸發(fā)。

總之,所有的操作都會返回一個ChannelFuture。

Netty的應(yīng)用場景

1.互聯(lián)網(wǎng)行業(yè)

在分布式系統(tǒng)中,各個節(jié)點之間需要遠程服務(wù)調(diào)用,高性能的RPC框架必不可少,Netty作為異步高新能的通信框架,往往作為基礎(chǔ)通信組件被這些RPC框架使用。

典型的應(yīng)用有:阿里分布式服務(wù)框架Dubbo的RPC框架使用Dubbo協(xié)議進行節(jié)點間通信,Dubbo協(xié)議默認使用Netty作為基礎(chǔ)通信組件,用于實現(xiàn)各進程節(jié)點之間的內(nèi)部通信。

除了 Dubbo 之外,淘寶的消息中間件 RocketMQ 的消息生產(chǎn)者和消息消費者之間,也采用 Netty 進行高性能、異步通信。

2.游戲行業(yè)

無論是手游服務(wù)端還是大型的網(wǎng)絡(luò)游戲,Java語言得到了越來越廣泛的應(yīng)用。Netty作為高性能的基礎(chǔ)通信組件,它本身提供了TCP/UDP和HTTP協(xié)議棧。

非常方便定制和開發(fā)私有協(xié)議棧,賬號登錄服務(wù)器,地圖服務(wù)器之間可以方便的通過Netty進行高性能的通信

3.大數(shù)據(jù)領(lǐng)域

經(jīng)典的Hadoop的高性能通信和序列化組件Avro的RPC框架,默認采用Netty進行跨界點通信,它的Netty Service基于Netty框架二次封裝實現(xiàn)。


總結(jié)

以上是生活随笔為你收集整理的Netty的实现原理、特点与优势、以及适用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。