爲什麼要用Netty開發?

Netty是什麼?
由JBOSS提供的基於Java NIO的開源框架,Netty提供異步非阻塞、事件驅動、高性能、高可靠、高可定製性的網絡應用程序和工具,
可用於開發服務端和客戶端。

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而選用Netty框架?
先看看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.流量控制和整形
......




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章