Java分佈式框架netty之NIO框架區別分析

Netty概述:java

一、netty是基於Java NIO的網絡應用框架,client-server框架web

二、Netty是一個高性能、異步事件驅動的NIO框架,它提供了對TCP、UDP和文件傳輸的支持,面試

做爲一個異步NIO框架,Netty的全部IO操做都是異步非阻塞的,spring

經過Future-Listener機制,用戶能夠方便的主動獲取或者經過通知機制得到IO操做結果。apache

三、做爲當前最流行的NIO框架,Netty在互聯網領域、大數據分佈式計算領域、遊戲行業、通訊行業等得到了普遍的應用,編程

一些業界著名的開源組件也基於Netty的NIO框架構建。緩存

一.通訊框架tomcat

流行基於Java NIO通訊框架有Mina、Netty、Grizzly等。接下來講下它們之間的對比。服務器

二.它們的出身網絡

一、Mina出身於開源界的大牛Apache組織;

二、Netty出身於商業開源大亨Jboss;

三、Grizzly則出身於土鱉Sun公司。

四、你的公司用的什麼呢?哈哈歡迎留言評論~~

三.它們的設計理念

一、Mina

Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它爲開發高性能和高可用性的網絡應用程序提供了很是便利的框架。當前發行的 Mina 版本2.04支持基於 Java NIO 技術的 TCP/UDP 應用程序開發、串口通信程序,Mina 所支持的功能也在進一步的擴展中。

目前,正在使用Mina的應用包括:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、 Openfire等等。

二、Netty

Netty是一款異步的事件驅動的網絡應用框架和工具,用於快速開發可維護的高性能、高擴展性協議服務器和客戶端。也就是說,Netty是一個NIO客戶端/服務器框架,支持快速、簡單地開發網絡應用,如協議服務器和客戶端。它極大簡化了網絡編程,如TCP和UDP套接字服務器。

三、Grizzly

Grizzly是一種應用程序框架,專門解決編寫成千上萬用戶訪問服務器時候產生的各類問題。使用JAVA NIO做爲基礎,並隱藏其編程的複雜性。容易使用的高性能的API。帶來非阻塞socketd到協議處理層。利用高性能的緩衝和緩衝管理使用高性能的線程池。

從設計的理念上來看,Mina的設計理念是最爲優雅的。固然,因爲Netty的主導做者與Mina的主導做者是同一人,出自同一人之手的Netty在設計理念上與Mina基本上是一致的。而Grizzly在設計理念上就較差了點,幾乎是JavaNIO的簡單封裝。

四.Netty爲何這麼火?

Netty是目前最流行的由JBOSS提供的一個Java開源框架NIO框架,Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。

相比JDK原生NIO,Netty提供了相對十分簡單易用的API,很是適合網絡編程。Netty是徹底基於NIO實現的,因此Netty是異步的。

做爲一個異步NIO框架,Netty的全部IO操做都是異步非阻塞的,經過Future-Listener機制,用戶能夠方便的主動獲取或者經過通知機制得到IO操做結果。

Netty無疑是NIO的老大,它的健壯性、功能、性能、可定製性和可擴展性在同類框架都是數一數二的。它已經獲得成百上千的商業/商用項目驗證,如Hadoop的RPC框架Avro、RocketMQ以及主流的分佈式通訊框架Dubbo等等。

爲何這麼火,是有緣由的。

NIO通信服務端步驟:

一、建立ServerSocketChannel,爲它配置非阻塞模式

二、綁定監聽,配置TCP參數,錄入backlog大小等

三、建立一個獨立的IO線程,用於輪詢多路複用器Selector

四、建立Selector,將以前的ServerSocketChannel註冊到Selector上,並設置監聽標識位SelectionKey.ACCEPT

五、啓動IO線程,在循環體中執行Selector.select()方法,輪詢就緒的通道

六、當輪詢處處於就緒的通道時,須要進行判斷操做位,若是是ACCEPT狀態,說明是新的客戶端介入,則調用accept方法接受新的客戶端。

七、設置新接入客戶端的一些參數,並將其通道繼續註冊到Selector之中。設置監聽標識等

八、若是輪詢的通道操做位是READ,則進行讀取,構造Buffer對象等

九、更細節的還有數據沒發送完成繼續發送的問題

Netty實現通信的步驟:

一、建立兩個NIO線程組,一個專門用來網絡事件處理(接受客戶端鏈接),另外一個則進行網絡通信讀寫

二、建立一個ServerBootstrap對象,配置Netty的一系列參數,例如接受傳入數據的緩存大小等。

三、建立一個實際處理數據的類ChannelInitializer,進行初始化的準備工做,好比設置傳入數據的字符集,格式,實現實際處理數據的接口。

四、綁定端口,執行同步阻塞方法等待服務器啓動便可。

當對於NIO模型,netty簡單、健壯、性能穩定,並且這幾步都是模板式開發,之後能夠直接用,開發只需專一實際處理數據類的實現。

Netty最佳實踐(數據通信、心跳檢測)

netty服務最好能夠單獨做爲一個項目,固然也能夠與web項目集成在一塊兒發佈到tomcat,

這樣好處是能夠用到web項目中的service方法,可是web項目8080關閉,netty監聽的端口號也關閉了

因此netty能夠打成jar包運行,固然若是要用到service層的代碼,也能夠將service層的代碼打成jar包

給netty業務類使用。

netty通信的方式:

①使用長鏈接通道不斷開的形式進行通訊,也就是服務器和客戶端的通道一直處於開啓狀態,若是服務器的

性能比較好,並且客戶端的數量也很少的狀況下,能夠考慮這種方式

②一次性批量提交數據,採用短鏈接的方式,也就是咱們把數據保存在本地臨時緩衝區或者臨時表中,

當達到臨界值時進行一次性批量提交,又或者根據定時任務輪詢提交,這種狀況下弊端是作不到

實時性傳輸,在實時性要求不高的程序中能夠採用

③採用一種特殊的長鏈接,在指定某一段時間以內,服務端和某臺客戶端沒有任何通信,則斷開鏈接,

下次若是客戶端要向服務端發送數據時,再次創建鏈接。

Netty的優勢能夠總結以下:

一、API使用簡單,開發門檻低;

二、功能強大,預置了多種編解碼功能,支持多種主流協議;

三、定製能力強,能夠經過ChannelHandler對通訊框架進行靈活地擴展;

四、性能高,經過與其餘業界主流的NIO框架對比,Netty的綜合性能最優;

五、成熟、穩定,Netty修復了已經發現的全部JDK NIO BUG,業務開發人員不須要再爲NIO的BUG而煩惱;

六、社區活躍,版本迭代週期短,發現的BUG能夠被及時修復,同時,更多的新功能會加入;

七、經歷了大規模的商業應用考驗,質量獲得驗證。在互聯網、大數據、網絡遊戲、企業應用、電信軟件等衆多行業獲得成功商用,證實了它已經徹底可以知足不一樣行業的商業應用了。

與Mina相比有什麼優點:

一、都是Trustin Lee的做品,Netty更晚;

二、Mina將內核和一些特性的聯繫過於緊密,使得用戶在不須要這些特性的時候沒法脫離,相比下性能會有所降低,Netty解決了這個設計問題;

三、Netty的文檔更清晰,不少Mina的特性在Netty裏都有;

四、Netty更新週期更短,新版本的發佈比較快;

五、它們的架構差異不大,Mina靠apache生存,而Netty靠jboss,和jboss的結合度很是高,Netty有對google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);

六、Netty比Mina使用起來更簡單,Netty裏你能夠自定義的處理upstream events或/和downstream events,可使用decoder和encoder來解碼和編碼發送內容;

七、Netty和Mina在處理UDP時有一些不一樣,Netty將UDP無鏈接的特性暴露出來;而Mina對UDP進行了高級層次的抽象,能夠把UDP當成"面向鏈接"的協議,而要Netty作到這一點比較困難。

八、從任務調度粒度上看,mina會將有IO任務的session寫入隊列中,當循環執行任務時,則會輪詢全部的session,並依次把session中的全部任務取出來運行。這樣粗粒度的調度是不公平調度,會致使某些請求的延遲很高。

加Java架構師羣獲取Java工程化、高性能及分佈式、高性能、深刻淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走不少的彎路的 羣..號是:855801563 對了 小白勿進 最好是有開發經驗

注:加羣要求

一、具備工做經驗的,面對目前流行的技術不知從何下手,須要突破技術瓶頸的能夠加。

二、在公司待久了,過得很安逸,但跳槽時面試碰壁。須要在短期內進修、跳槽拿高薪的能夠加。

三、若是沒有工做經驗,但基礎很是紮實,對java工做機制,經常使用設計思想,經常使用java開發框架掌握熟練的,能夠加。

四、以爲本身很牛B,通常需求都能搞定。可是所學的知識點沒有系統化,很難在技術領域繼續突破的能夠加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工做經驗的梳理和總結,帶着你們全面、科學地創建本身的技術體系和技術認知!

相關文章
相關標籤/搜索