1、Netty和Tomcat有什麼區別? 前端
Netty和Tomcat最大的區別就在於通訊協議,Tomcat是基於Http協議的,他的實質是一個基於http協議的web容器,可是Netty不同,他能經過編程自定義各類協議,由於netty可以經過codec本身來編碼/解碼字節流,完成相似redis訪問的功能,這就是netty和tomcat最大的不一樣。java
有人說netty的性能就必定比tomcat性能高,其實否則,tomcat從6.x開始就支持了nio模式,而且後續還有arp模式——一種經過jni調用apache網絡庫的模式,相比於舊的bio模式,併發性能獲得了很大提升,特別是arp模式,而netty是否比tomcat性能更高,則要取決於netty程序做者的技術實力了。
爲何Netty受歡迎?linux
netty是一款收到大公司青睞的框架,在我看來,netty可以受到青睞的緣由有三:
併發高
傳輸快
封裝好
Netty爲何併發高 nginx
Netty是一款基於NIO(Nonblocking I/O,非阻塞IO)開發的網絡通訊框架,對比於BIO(Blocking I/O,阻塞IO),他的併發性能獲得了很大提升。web
NIO 2.0裏終於有AIO了,Linux上用AIO,Windows上用IOCP,都支持了概念上的最後一種IOasynchronous I/Oredis
- 就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中提供的異步特性。
異步只是一種概念,異步與否要看,上層使用的異步,而支持的下層徹底多是阻塞的。apache
- 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的服務器項目,前者更像一箇中間件框架,後者更像一個工具windows