Tomcat是基於Http協議的,實質是一個基於http協議的web容器; Netty能經過編程自定義各類協議,由於netty可以經過codec本身來編碼/解碼字節流。
netty的性能不必定比tomcat性能高,tomcat從6.x開始就支持了nio模式,而且後續還有APR模式(一種經過JNI調用apache網絡庫的模式),相比於舊的bio模式,併發性能獲得了很大提升,特別是APR模式。html
基於多路複用的NIO(Nonblocking I/O,非阻塞IO)開發的網絡通訊框架,對比於BIO併發性能獲得了很大提升。java
等待客戶端發數據這個過程是阻塞的,這樣就形成了一個線程只能處理一個請求的狀況,而機器能支持的最大線程數是有限的(linux 的unlimit)。linux
當一個Socket創建好以後,Thread並不會阻塞去接受這個Socket,而是將這個請求交給Selector,Selector會不斷的去遍歷全部的Socket,一旦有一個Socket創建完成,他會通知Thread,而後Thread處理完數據再返回給客戶端。這樣就能讓一個Thread處理更多的請求了。web
Netty的傳輸快其實也是依賴了NIO的一個特性——零拷貝。apache
Java的內存有堆內存、棧內存和字符串常量池等等,其中堆內存是佔用內存空間最大的一塊,也是Java對象存放的地方,通常數據若是須要從IO讀取到堆內存,中間須要通過Socket緩衝區,也就是說一個數據會被拷貝兩次才能到達他的的終點,若是數據量大,就會形成沒必要要的資源浪費。(數據從網卡到內核空間 -> 內核空間再copy到用戶空間)編程
Netty當須要接收數據的時候,他會在堆內存以外開闢一塊內存,數據就直接從IO讀到了那塊內存(堆外內存)中去,在netty裏面經過ByteBuf能夠直接對這些數據進行直接操做,從而加快了傳輸速度。緩存
相對於JDK提供的BIO和NIO實現方式,Netty的封裝更勝一籌。tomcat
幾個重要的概念。網絡
Codec
能完成字節與pojo、pojo與pojo的相互轉換,從而達到自定義協議的目的!!
在Netty裏面最有名的就是HttpRequestDecoder和HttpResponseEncoder了。數據結構