1. Netty 是什么?
Netty
是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器 和客户端。
2. 为什么要使用Netty?
这个问题也有其他的问法,比如原生NIO有什么问题呢。
-
NIO
的类库和API
繁杂,使用麻烦:需要熟练掌握Selector
、ServerSocketChannel
、SocketChannel
、ByteBuffer
等。 -
需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到
Reactor
模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的NIO
程序。 -
开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
-
JDK NIO
的Bug
:例如臭名昭著的Epoll Bug
,它会导致Selector
空轮询,最终导致CPU 100%
。直到JDK 1.7
版本该问题仍旧存在,没有被根本解决。
3. Netty有什么优点
设计:
1、统一的 API,支持多种传输类型,阻塞的和非阻塞的
2、简单而强大的线程模型
3、真正的无连接数据报套接字支持
4、链接逻辑组件以支持复用
易用性:
详实的 Javadoc
和大量的示例集
性能:
1、拥有比 Java
的核心 API
更高的吞吐量以及更低的延迟
2、得益于池化和复用,拥有更低的资源消耗
3、最少的内存复制
健壮性:
1、不会因为慢速、快速或者超载的连接而导致 OutOfMemoryError
2、消除在高速网络中 NIO
应用程序常见的不公平读/写比率
安全性:
1、完整的 SSL/TLS
以及 StartTLS
支持
2、可用于受限环境下,如 Applet
和 OSGI
4. netty高性能主要依赖了哪些特性
1、IO 线程模型:同步非阻塞,用最少的资源做更多的事。
2、内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。
3、内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况。
4、