Netty的实现原理、特点与优势、以及适用场景
高并發(fā)編程系列
高并發(fā)編程系列:NIO、BIO、AIO的區(qū)別,及NIO的應用和框架選型
高并發(fā)編程系列:ConcurrentHashMap的實現原理(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是一個高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸的支持。作為當前最流行的NIO框架,Netty在互聯網領域、大數據分布式計算領域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應用,一些業(yè)界著名的開源組件也基于Netty的NIO框架構建(文章尾有詳細介紹)。
2.Netty的特點
- 高并發(fā)
Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)開發(fā)的網絡通信框架,對比于BIO(Blocking I/O,阻塞IO),他的并發(fā)性能得到了很大提高 。
- 傳輸快
Netty的傳輸快其實也是依賴了NIO的一個特性——零拷貝。
- 封裝好
Netty封裝了NIO操作的很多細節(jié),提供易于使用的API。
什么選擇Netty
JDK 原生也有一套網絡應用程序 API,但是存在一系列問題,主要如下:
1)NIO 的類庫和 API 繁雜,使用麻煩:你需要熟練掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。
2)需要具備其他的額外技能做鋪墊:例如熟悉 Java 多線程編程,因為 NIO 編程涉及到 Reactor 模式,你必須對多線程和網路編程非常熟悉,才能編寫出高質量的 NIO 程序。
3)可靠性能力補齊,開發(fā)工作量和難度都非常大:例如客戶端面臨斷連重連、網絡閃斷、半包讀寫、失敗緩存、網絡擁塞和異常碼流的處理等等。NIO 編程的特點是功能開發(fā)相對容易,但是可靠性能力補齊工作量和難度都非常大。
4)JDK
NIO 的 Bug:例如臭名昭著的 Epoll Bug,它會導致 Selector 空輪詢,最終導致 CPU 100%。官方聲稱在 JDK
1.6 版本的 update 18 修復了該問題,但是直到 JDK 1.7 版本該問題仍舊存在,只不過該 Bug
發(fā)生概率降低了一些而已,它并沒有被根本解決。
Netty框架的優(yōu)勢
- API使用簡單,開發(fā)門檻低;
- 功能強大,預置了多種編解碼功能,支持多種主流協議;
- 定制能力強,可以通過ChannelHandler對通信框架進行靈活地擴展;
- 性能高,通過與其他業(yè)界主流的NIO框架對比,Netty的綜合性能最優(yōu);
- 成熟、穩(wěn)定,Netty修復了已經發(fā)現的所有JDK NIO BUG,業(yè)務開發(fā)人員不需要再為NIO的BUG而煩惱;
- 社區(qū)活躍,版本迭代周期短,發(fā)現的BUG可以被及時修復,同時,更多的新功能會加入;
- 經歷了大規(guī)模的商業(yè)應用考驗,質量得到驗證。在互聯網、大數據、網絡游戲、企業(yè)應用、電信軟件等眾多行業(yè)得到成功商用,證明了它已經完全能夠滿足不同行業(yè)的商業(yè)應用了。
Netty的架構設計
總體結構
Netty 采用了比較典型的三層網絡架構進行設計,邏輯架構圖如下所示:
1)傳輸服務:支持 BIO 和 NIO;
2)容器集成:支持 OSGI、JBossMC、Spring、Guice 容器;
3)協議支持:HTTP、Protobuf、二進制、文本、WebSocket 等一系列常見協議都支持。還支持通過實行編碼解碼邏輯來實現自定義協議;
4)Core 核心:可擴展事件模型、通用通信 API、支持零拷貝的 ByteBuf 緩沖對象。
Netty的高性能設計
1.高性能的三大要素
1) 傳輸:用什么樣的通道將數據發(fā)送給對方,BIO、NIO或者AIO,IO模型在很大程度上決定了框架的性能。
2) 協議:采用什么樣的通信協議,HTTP或者內部私有協議。協議的選擇不同,性能模型也不同。相比于公有協議,內部私有協議的性能通常可以被設計的更優(yōu)。
3) 線程:數據報如何讀取?讀取之后的編解碼在哪個線程進行,編解碼后的消息如何派發(fā),Reactor線程模型的不同,對性能的影響也非常大。
2.IO模型
Netty的I/O模型基于非阻塞I/O實現,底層依賴的是JDK NIO框架的Selector。
3.Reactor線程模型
關于Java NIO 構造Reator模式,Doug lea在《Scalable IO in Java》中給了很好的闡述,這里截取PPT對Reator模式的實現進行說明。
1)Reactor單線程模型:Reactor單線程模型,指的是所有的I/O操作都在同一個NIO線程上面完成。對于一些小容量應用場景,可以使用單線程模型。
2)Reactor多線程模型:Rector多線程模型與單線程模型最大的區(qū)別就是有一組NIO線程處理I/O操作。主要用于高并發(fā)、大業(yè)務量場景。
3)主從Reactor多線程模型:主從Reactor線程模型的特點是服務端用于接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。利用主從NIO線程模型,可以解決1個服務端監(jiān)聽線程無法有效處理所有客戶端連接的性能不足問題。
4.Netty的線程模型
說完了Reactor的三種模型,那么Netty是哪一種呢?其實Netty的線程模型是Reactor模型的變種,那就是去掉線程池的第三種形式的變種,這也是Netty NIO的默認模式。
Netty的核心組件
Netty應用中必不可少的組件:
- Bootstrap or ServerBootstrap
- EventLoop
- EventLoopGroup
- ChannelPipeline
- Channel
- Future or ChannelFuture
- ChannelInitializer
- ChannelHandler
1.Bootstrap
一個Netty應用通常由一個Bootstrap開始,它主要作用是配置整個Netty程序,串聯起各個組件。
Handler,為了支持各種協議和處理數據的方式,便誕生了Handler組件。Handler主要用來處理各種事件,這里的事件很廣泛,比如可以是連接、數據接收、異常、數據轉換等。
2.ChannelInboundHandler
一個最常用的Handler。這個Handler的作用就是處理接收到數據時的事件,也就是說,我們的業(yè)務邏輯一般就是寫在這個Handler里面的,ChannelInboundHandler就是用來處理我們的核心業(yè)務邏輯。
3.ChannelInitializer
當一個鏈接建立時,我們需要知道怎么來接收或者發(fā)送數據,當然,我們有各種各樣的Handler實現來處理它,那么ChannelInitializer便是用來配置這些Handler,它會提供一個ChannelPipeline,并把Handler加入到ChannelPipeline。
4.ChannelPipeline
一個Netty應用基于ChannelPipeline機制,這種機制需要依賴于EventLoop和EventLoopGroup,因為它們三個都和事件或者事件處理相關。
EventLoops的目的是為Channel處理IO操作,一個EventLoop可以為多個Channel服務。
EventLoopGroup會包含多個EventLoop。
5.Channel
代表了一個Socket鏈接,或者其它和IO操作相關的組件,它和EventLoop一起用來參與IO處理。
6.Future
在Netty中所有的IO操作都是異步的,因此,你不能立刻得知消息是否被正確處理,但是我們可以過一會等它執(zhí)行完成或者直接注冊一個監(jiān)聽,具體的實現就是通過Future和ChannelFutures,他們可以注冊一個監(jiān)聽,當操作執(zhí)行成功或失敗時監(jiān)聽會自動觸發(fā)。
總之,所有的操作都會返回一個ChannelFuture。
Netty的應用場景
1.互聯網行業(yè)
在分布式系統中,各個節(jié)點之間需要遠程服務調用,高性能的RPC框架必不可少,Netty作為異步高新能的通信框架,往往作為基礎通信組件被這些RPC框架使用。
典型的應用有:阿里分布式服務框架Dubbo的RPC框架使用Dubbo協議進行節(jié)點間通信,Dubbo協議默認使用Netty作為基礎通信組件,用于實現各進程節(jié)點之間的內部通信。
除了 Dubbo 之外,淘寶的消息中間件 RocketMQ 的消息生產者和消息消費者之間,也采用 Netty 進行高性能、異步通信。
2.游戲行業(yè)
無論是手游服務端還是大型的網絡游戲,Java語言得到了越來越廣泛的應用。Netty作為高性能的基礎通信組件,它本身提供了TCP/UDP和HTTP協議棧。
非常方便定制和開發(fā)私有協議棧,賬號登錄服務器,地圖服務器之間可以方便的通過Netty進行高性能的通信
3.大數據領域
經典的Hadoop的高性能通信和序列化組件Avro的RPC框架,默認采用Netty進行跨界點通信,它的Netty Service基于Netty框架二次封裝實現。
總結
以上是生活随笔為你收集整理的Netty的实现原理、特点与优势、以及适用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BAT架构师进阶:大型网站架构书籍推荐
- 下一篇: APPKIT打造稳定、灵活、高效的运营配