Netty和Tomcat的區別、性能對比


一、Netty和Tomcat有什么區別? 

Netty和Tomcat最大的區別就在於通信協議,Tomcat是基於Http協議的,他的實質是一個基於http協議的web容器,但是Netty不一樣,他能通過編程自定義各種協議,因為netty能夠通過codec自己來編碼/解碼字節流,完成類似redis訪問的功能,這就是netty和tomcat最大的不同。

有人說netty的性能就一定比tomcat性能高,其實不然,tomcat從6.x開始就支持了nio模式,並且后續還有arp模式——一種通過jni調用apache網絡庫的模式,相比於舊的bio模式,並發性能得到了很大提高,特別是arp模式,而netty是否比tomcat性能更高,則要取決於netty程序作者的技術實力了。 
為什么Netty受歡迎?

netty是一款收到大公司青睞的框架,在我看來,netty能夠受到青睞的原因有三: 
並發高 
傳輸快 
封裝好 
Netty為什么並發高 

Netty是一款基於NIO(Nonblocking I/O,非阻塞IO)開發的網絡通信框架,對比於BIO(Blocking I/O,阻塞IO),他的並發性能得到了很大提高。

 

NIO 2.0里終於有AIO了,Linux上用AIO,Windows上用IOCP,都支持了概念上的最后一種IOasynchronous I/O

  1. 就IO而言:概念上有5中模型:blocking I/O,nonblocking I/O,I/O multiplexing (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX aio_functions)。 
  2. 然后呢 不同的操作系統對上述模型支持不同: unix支持io多路復用,不同系統叫法不同 :freebsd里面叫 kqueue;linux 是epoll。而windows: 2000的時候就誕生了IOCP支持最后一種異步I/O 
  3. java是一種跨平台語言,為了支持異步IO,誕生了nio,Java1.4引入的NIO 1.0是基於I/O復用的。在各個平台上會選擇不同的復用方式。Linux用的epoll,BSD上用kqueue,Windows上應該是重疊I/O(肯定不是IOCP)

但是nio直接使用比較難用,所以有了mina,netty這些針對網絡io部分(tcp/udp-傳輸層)的封裝(nio也有非網絡io部分),為了使nio更易用。 
http是應用層的協議。 
servlet3.0則是另外一種東西,不是對協議的封裝,javaee6眾多規范中的一個,但凡javaee6的實現(或者像tomcat這種web容器部分的實現),都會支持servlet3.0,servlet理論上可以支持多種應用層協議(不單單只是http),而servlet3.0以后提供的異步特性與javase提供的nio或aio無直接關系,就是使用bio一樣可以實現servlet3.0中提供的異步特性。 
異步只是一種概念,異步與否要看,上層使用的異步,而支持的下層完全可能是阻塞的。

  • tomcat就是針對http層的,所以我建議http還是選擇tomcat(或者其他成熟的http-server),並不是說netty不好,而是你的選擇問題。
  • netty是一個網絡組件,tcp,udp,http都可以弄,但是官方文檔都是些hello wolrd級別的。如果你非常了解http結構,完全可以基於netty搞出一個比tomcat牛的http server。如果做tcp開發,netty不二之選!

現在高並發分布式網站架構一般采用nginx(前端負載均衡)+ Netty/Tomcat(HTTP)

Netty是基於Java NIO開發的,而Tomcat是Apache下的針對HTTP的服務器項目,前者更像一個中間件框架,后者更像一個工具


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM