netty的NIO和相關概念

1.netty中的NIO

NIO1.0是JDK1.4的時候提出來的,簡單的說就是selector或是epoll。

NIO2.0是JDK1.7的時候提出來的,簡單的說就是AIO,由JDK底層和操作系統完成所有的io操作,包括從從系統內核讀取到用戶進程

netty4.x使用的是NIO1.0,是通過多路複用實現非阻塞的。

2.netty作爲服務器與傳統的tomcat+servlet的區別

tomcat是http協議族的web容器,netty可以自定義協議,可以說是高度定製,適用於更多的協議,例如webSocket等,其實tomcat也支持webSocket,netty是JDK原生的api進行封裝,可以說是一個框架,tomcat也支持nio。

3.netty中重要的相關概念

netty中的相關概念也可以說是jdk中NIO1.0中的相關概念。

1)ByteBuff

JDK中的ByteBuffer不是很靈活,netty中對應的爲ByteBuf,替代了傳統BIO中流的概念,將傳統bio流的概念取代了,以緩存來代替,具體的理解待續

2)Channel和Unsafe

關於channel在JDK中是java.nio.ScocketChannel和java.nio.ServerSocketChannel,

先從channel說起,netty同樣實現了自己的channel接口,而且使用了Unsafe內部類加強,

對於服務器來說,channel有父和子分別,NIOServerSocketChannel爲父channel,負責監聽新的連接,連接接入成功後,初始化一個NIOScocketChannel,每一個連接對應唯一一個實例化的NIOScocketChannel。

3)channelPipeline和channelHandler以及channelHandlerContext

channel會有一個唯一的channelPipeline與之對應,channelHandler相當於servlet中的filter的作用,可以對該channel的事件進行處理,一個channelHandler對應一個唯一的channelHandlerContext,主要是輔助傳遞事件的,而我們需要實現的業務邏輯主要是通過自定義channelHandler來實現的。關於解碼編碼都是通過channelHandler實現的

4)eventLoop和eventLoopGroup

netty使用到了reactor線程模型,主線程組負責接入新的連接,從線程組負責處理channel中發生的事件,一個eventLoop線程可以處理多個channel的事件,而且netty保證了每次都是同一個線程處理之前的channel的事件,即channel基本上是沒有跨線程的。

總結,有了以上的基本概念的理解,可以看懂netty的demo,這種方式與傳統的tomcat+servlet有很大區別的,web容器tomcat會把http請求的過程封裝成request和response對象。

      

發佈了37 篇原創文章 · 獲贊 6 · 訪問量 9268
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章