目录
Netty原理
Netty是一个高性能的,异步事件驱动的NIO框架,基于JAVA NIO提供的API实现。它提供了堆TCP,UDP和文件传输的支持,作为一个异步NIO的框架,Netty的所有IO操作都是异步非阻塞的,通过Future-listener机制,用户可以方便的主动获取或者通过通知机制或得IO操作的结果。
Netty高性能
在IO编程过程中,当需要同时处理多个客户端接入请求的时候,可以利用多线程或者IO多路复用技术进行处理,IO多路复用技术通过吧多个IO阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求,与传统的多线程/多进程模型相比,I/O多路复用的最大优势就是系统开销较小,系统不需要创建新的额外的进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护代码量,节省了系统的资源。
与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。
NIO服务端通信序列图
- 打开ServerSocketChannel
- 绑定鉴定地址InetSocketAddress
- 创建Selector,启动线程
- 将ServerSocketChannel注册到Selector,监听SelectionKey.OP_ACCEPT
- Selector轮询就绪的key
- accpet新连接,HandleAccept()处理新的客户端接入
- 设置新建客户端连接的Socket
- 向Selector注册监听读操作,SelectionKey.OP_READ
- handlerRead()异步读请求到ByteBuffer
- decode请求
- 异步写byteBuffer到SocketChannel
NIO客户端通信序列图
- 打开socketChannel
- 设置Socketchannel为非阻塞模式,同时设置TCP参数
- 异步连接服务器
- 判断连接结果,如果连接成功则调到步骤10
- 向Reactor线程的多路复用器注册OP_CONNECT事件
- 创建Selector启动线程
- Selector轮询就绪的Key
- handleConnect
- 判断连接完成,完成执行步骤10
- 向Selector注册OP_READ
- handleRead异步请求读取消息到ByteBuffer
- decode请求
- 异步写ByteBuffer到SocketChannel
Netty的IO线程是NIOEventLoop由于聚合了多路复用器Selector,可以同时并发的处理成百上千客户端channel,由于读写操作都是非阻塞的,这就重复提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起
零拷贝
- Netty的接受和发送ByteBuffer采用DIRECT BUFFER,使用堆外的内存进行Socket读写,不需要进行字节缓冲区的二次拷贝,如果使用传统的堆内存HEAP BUFFERS进行读写