1. 程式人生 > 其它 >Netty學習篇一 (對netty的基本瞭解)

Netty學習篇一 (對netty的基本瞭解)

一、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在實際應用中發揮的作用!

我話講完!誰贊成?誰反對?