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对象。