![](https://csdnimg.cn/release/download_crawler_static/86382627/bg1.jpg)
Netty 是什么?为什么要用 Netty?
为什么要用 Netty
1、虽然 JAVA NIO 框架提供了 多路复用 IO 的支持,但是并没有提供上层“信息格式”的良
好封装。例如前两者并没有提供针对 Protocol Buffer、JSON 这些信息格式的封装,但是 Netty
框架提供了这些数据格式封装(基于责任链模式的编码和解码功能);
2、直接使用 NIO 需要需要额外的技能,例如 Java 多线程,网络编程;
3、要编写一个可靠的、易维护的、高性能的 NIO 服务器应用。除了框架本身要兼容实现各
类操作系统的实现外。更重要的是它应该还要处理很多上层特有服务,例如:客户端的权限、
还有上面提到的信息格式封装、简单的数据读取,断连重连,半包读写,心跳等等,这些 Netty
框架都提供了响应的支持。
4、JAVA NIO 框架存在一个 poll/epoll bug:Selector doesn’t block on Selector.select(timeout),
不能 block 意味着 CPU 的使用率会变成 100%(这是底层 JNI 的问题,上层要处理这个异常
实际上也好办)。当然这个 bug 只有在 Linux 内核上才能重现。
这个问题在 JDK 1.7 版本中还没有被完全解决,但是 Netty 已经将这个 bug 进行了处理。
这个 Bug 与操作系统机制有关系的,JDK 虽然仅仅是一个兼容各个操作系统平台的软件,但
在 JDK5 和 JDK6 最初的版本中(严格意义上来将,JDK 部分版本都是),这个问题并没有解
决,而将这个帽子抛给了操作系统方,这也就是这个 bug 最终一直到 2013 年才最终修复的
原因(JDK7 和 JDK8 之间)。
为什么不用 Netty5
1. netty5 中使用了 ForkJoinPool,增加了代码的复杂度,但是对性能的改善却不明显
2. 多个分支的代码同步工作量很大
3. 作者觉得当下还不到发布一个新版本的时候
4. 在发布版本之前,还有更多问题需要调查一下,比如是否应该废弃 exceptionCaught,
是否暴露 EventExecutorChooser 等等。
为什么 Netty 使用 NIO 而不是 AIO?
Netty 不看重 Windows 上的使用,在 Linux 系统上,AIO 的底层实现仍使用 EPOLL,没有很好
实现 AIO,因此在性能上没有明显的优势,而且被 JDK 封装了一层不容易深度优化。
AIO 还有个缺点是接收数据需要预先分配缓存, 而不是 NIO 那种需要接收时才需要分配缓存,
所以对连接数量非常大但流量小的情况, 内存浪费很多。
据说 Linux 上 AIO 不够成熟,处理回调结果速度跟不上处理需求,有点像外卖员太少,顾客
太多,供不应求,造成处理速度有瓶颈。
作者原话:
Not faster than NIO (epoll) on unix systems (which is true)