一、netty概念
Netty 是由 JBOSS 提供的一個異步非阻塞、基於事件驅動的NIO框架,提供了對UDP、TCP以及文件傳輸的支持,用以快速開發高性能、高可靠、高可定制性的網絡應用程序和工具,可用於開發服務端和客戶端。
作為一個當前最流行的異步NIO框架,Netty的全部IO操作都是異步非阻塞的。通過Future-Listener機制,用戶能夠方便的通過通知機制獲得IO操作結果或者是主動獲取。Netty 在互聯網領域、大數據分布式計算領域、游戲行業、通信行業等獲得了廣泛的應用,知名的 Elasticsearch 、Dubbo 框架內部都采用了 Netty。
二、netty應用場景
1、通信行業
Netty有着高成熟度、異步高性能、高可靠性的優點,憑借這些,Netty在通信行業也是得到了廣泛的應用。
2、大數據領域
通常,大數據計算都會采用多個計算節點和一個/N個匯總節點進行分布式部署,各節點之間存在海量的數據交換。
在這樣的基礎上,因為Netty是目前各個成熟NIO框架當中,綜合性能最高的,所以,Netty經常會被選中,用作大數據各節點間的通信。
3、互聯網行業
隨着網站規模的發展,系統並發訪問量也是愈來愈高,傳統的垂直架構不能夠滿足需求,所以,從組網的情況來看,高性能的RPC框架是必不可少的東西,而Netty作為異步高性能的通信框架,就經常被當做基礎通信組件被RPC框架使用。
4、企業軟件
企業以及IT集成需要ESB,Netty對多協議支持、私有協議定制的簡潔性和高性能是 ESB RPC框架的首選通信組件。
5、游戲行業
不管是什么大型網游,又或者是手游,Java語言都得到了廣泛的應用,Netty作為高性能的基礎通信組件,本身就提供了TCP/UDP和HTTP協議棧,對於定制和開發私有協議棧非常的方便,一些賬號登陸服務器、地圖服務器之間能夠通過Netty進行高性能的通信。
三、了解NIO和BIO
JAVA原先是采用的是傳統的BIO,為什么后來又研發出了NIO呢?
首先看看傳統的基於同步阻塞IO(BIO)的線程模型圖
BIO主要存在以下缺點:
1.從線程模型圖中可以看到,一連接一線程,因線程數是有限的,所以這樣的模型非常消耗資源,最終也導致它不能承受高並發連接的需求
2.性能低,因為頻繁的進行上下文切換,導致CUP利用率低
3.可靠性差,由於所有的IO操作都是同步的,即使是業務線程也如此,所以業務線程的IO操作也有可能被阻塞,這將導致系統過分依賴網絡的實時情況和外部組件的處理能力,可靠性大大降低
上面的原因就是導致早期的高性能服務器為什么不選用JAVA開發,而是選用C/C++的重要原因。
為了解決上面的問題,NIO橫空出世,下面是NIO的線程模型圖
1.NIO采用了Reactor線程模型,一個Reactor聚合了一個多路復用器Selector,它可以同時注冊、監聽和輪詢成百上千個Channel,這樣一個IO線程可以同時處理很多個客戶端連接,線程模型優化為1:N(N<最大句柄、數),或M:N(M通常為CUP核數+1)
2.避免了IO線程頻繁的上下文切換,提升了CUP的效率
3.所有的IO操作都是異步的,所以業務線程的IO操作就不用擔心阻塞,系統降低了對網絡的實時情況和外部組件的處理能力的依賴
四、為什么不用JDK原生的NIO?
先看看JDK的NIO中服務端和客戶端的時序圖
服務端:
客戶端:
從圖中我們可以看到,使用JDK原生NIO的不足之處
1.NIO的類庫和API相當復雜,使用它來開發,需要非常熟練地掌握Selector、ByteBuffer、ServerSocketChannel、SocketChannel等
2.需要很多額外的編程技能來輔助使用NIO,例如,因為NIO涉及了Reactor線程模型,所以必須必須對多線程和網絡編程非常熟悉才能寫出高質量的NIO程序
3.想要有高可靠性,工作量和難度都非常的大,因為服務端需要面臨客戶端頻繁的接入和斷開、網絡閃斷、半包讀寫、失敗緩存、網絡阻塞的問題,這些將嚴重影響我們的可靠性,而使用原生NIO解決它們的難度相當大。
4.JDK NIO中著名的BUG--epoll空輪詢,當select返回0時,會導致Selector空輪詢而導致CUP100%,官方表示JDK1.6之后修復了這個問題,其實只是發生的概率降低了,沒有根本上解決。
五、為什么選用Netty框架?
1.API使用簡單,更容易上手,開發門檻低
2.功能強大,預置了多種編解碼功能,支持多種主流協議
3.定制能力高,可以通過ChannelHandler對通信框架進行靈活地拓展
4.高性能,與目前多種NIO主流框架相比,Netty綜合性能最高
5.高穩定性,解決了JDK NIO的BUG
6.經歷了大規模的商業應用考驗,質量和可靠性都有很好的驗證。
六、Netty能提供什么服務?
1.開發異步非阻塞的TCP網絡應用程序
2.開發異步非阻塞的UDP網絡應用程序
3.開發異步文件傳輸程序
4.開發異步HTTP程序的服務端和客戶端
5.提供多種編解碼的集成框架,包括谷歌Protobuf、JBossMarshalling、Java序列化、壓縮編解碼、XML解碼、字符串編解碼等都可以由用戶直接使用
6.提供形式多樣的編解碼基礎類庫,可以方便地進行私有協議棧編解碼框架的二次開發
7.基於職責鏈的Pipeline-Handler機制,可以方便地對網絡事件進行攔截和定制
8.所有的IO操作都是異步的,用戶可以通過Future-Listeren機制主動get結果或者等IO線程完成操作之后主動Notify來通知,用戶業務線程不需要同步等待
9.基於鏈路空閑事件監測的心跳機制
10.流量控制和整形等等..............
以上只是對netty的一個基本了解,下一章我們深入探索一下netty在實際應用中發揮的作用!