Netty 是一个 NIO 客户端服务器框架,它可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和精简了 TCP 和 UDP 套接字服务器等网络编程。
设计
各种传输类型的统一 API - 阻塞和非阻塞套接字
基于灵活且可扩展的事件模型,允许清晰的关注点分离
高度可定制的线程模型——单线程、一个或多个线程池,如 SEDA
真正的无连接数据报套接字支持(自 3.1 起)
表现
更高的吞吐量,更低的延迟
更少的资源消耗
最小化不必要的内存复制
(以上摘自官网内容)
核心方法
EventLoopGroup bossGroup =new NioEventLoopGroup(1);
EventLoopGroup workerGroup =new NioEventLoopGroup(8);
建立线程池包装对象
bossGroup一个负责处理所有客户端的连接请求
workerGroup负责处理所有客户端发送的数据请求
我们在使用Netty时,主要负责编写Handler方法来实现业务逻辑
通过继承SimpleChannelInboundHandler等Handler方法来实现逻辑
如客户端的上线下线,客户端的发送的数据 这里面涉及到数据传输编解码序列化问题,Netty内置有JDK层面的序列化功能,但是效率不是很高
粘包拆包
零拷贝机制
Netty的数据处理API通过两个组件暴露——abstract class ByteBuf和interface ByteBufHolder。
Bytebuf 内存缓冲区,直接使用的直接内存进行数据传输 性能高
Bytebuf扩容:4M以内,为翻倍扩容 大于4M后,容量依然不够,不会进行翻倍扩容,每次加4M 扩容
有缩容机制
NIO空轮询BUG
elector , 一般称为选择器。它是 Java NIO 核心组件中的一个,用于轮询一个或多个 NIO Channel 的状态是否处于可读、可写。如此,一个线程就可以管理多个 Channel ,也就说可以管理多个网络连接。也因此,Selector 也被称为多路复用器。
首先,需要将 Channel 注册到 Selector 中,这样 Selector 才知道哪些 Channel 是它需要管理的。
之后,Selector 会不断地轮询注册在其上的 Channel 。如果某个 Channel 上面发生了读或者写事件,这个 Channel 就处于就绪状态,会被 Selector 轮询出来,然后通过 SelectionKey 可以获取就绪 Channel 的集合,进行后续的 I/O 操作。
以上摘自简书作者 何何与呵呵呵
epoll BUG导致没有事件进来也能跳出循环执行逻辑,并且不断的空轮询,导致CPU飙高,在netty中解决了空轮询BUG,一旦空轮询次数达到512次 重新new一个selector 取代旧的selector ,将以前注册到selector上的Channel转移到新selector