一、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
- 就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)。
- 然后呢 不同的操作系統對上述模型支持不同: unix支持io多路復用,不同系統叫法不同 :freebsd里面叫 kqueue;linux 是epoll。而windows: 2000的時候就誕生了IOCP支持最后一種異步I/O
- 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的服務器項目,前者更像一個中間件框架,后者更像一個工具