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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章