Netty的实现原理、特点与优势、以及适用场景
高并發(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BAT架构师进阶:大型网站架构书籍推荐
- 下一篇: APPKIT打造稳定、灵活、高效的运营配