Netty和Tomcat最大的區(qū)別就在于通信協(xié)議,Tomcat是基于Http協(xié)議的,他的實(shí)質(zhì)是一個基于http協(xié)議的web容器,但是Netty不一樣,他能通過編程自定義各種協(xié)議,因?yàn)閚etty能夠通過codec自己來編碼/解碼字節(jié)流,完成類似redis訪問的功能,這就是netty和tomcat最大的不同。
有人說netty的性能就一定比tomcat性能高,其實(shí)不然,tomcat從6.x開始就支持了nio模式,并且后續(xù)還有arp模式——一種通過jni調(diào)用apache網(wǎng)絡(luò)庫的模式,相比于舊的bio模式,并發(fā)性能得到了很大提高,特別是arp模式,而netty是否比tomcat性能更高,則要取決于netty程序作者的技術(shù)實(shí)力了。
為什么Netty受歡迎?
netty是一款收到大公司青睞的框架,在我看來,netty能夠受到青睞的原因有三:
并發(fā)高
傳輸快
封裝好
Netty為什么并發(fā)高
Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)開發(fā)的網(wǎng)絡(luò)通信框架,對比于BIO(Blocking I/O,阻塞IO),他的并發(fā)性能得到了很大提高。
NIO 2.0里終于有AIO了,Linux上用AIO,Windows上用IOCP,都支持了概念上的最后一種IOasynchronous I/O
但是nio直接使用比較難用,所以有了mina,netty這些針對網(wǎng)絡(luò)io部分(tcp/udp-傳輸層)的封裝(nio也有非網(wǎng)絡(luò)io部分),為了使nio更易用。
http是應(yīng)用層的協(xié)議。
servlet3.0則是另外一種東西,不是對協(xié)議的封裝,javaee6眾多規(guī)范中的一個,但凡javaee6的實(shí)現(xiàn)(或者像tomcat這種web容器部分的實(shí)現(xiàn)),都會支持servlet3.0,servlet理論上可以支持多種應(yīng)用層協(xié)議(不單單只是http),而servlet3.0以后提供的異步特性與javase提供的nio或aio無直接關(guān)系,就是使用bio一樣可以實(shí)現(xiàn)servlet3.0中提供的異步特性。
異步只是一種概念,異步與否要看,上層使用的異步,而支持的下層完全可能是阻塞的。
現(xiàn)在高并發(fā)分布式網(wǎng)站架構(gòu)一般采用nginx(前端負(fù)載均衡)+ Netty/Tomcat(HTTP)
Netty是基于Java NIO開發(fā)的,而Tomcat是Apache下的針對HTTP的服務(wù)器項(xiàng)目,前者更像一個中間件框架,后者更像一個工具