Netty
是一个高性能、异步事件驱动的NIO
框架,它提供了对TCP
、UDP
和文件传输的支持。作为当前最流行的NIO
框架,Netty
在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也是基于Netty
的NIO
框架构建。
Netty
利用 Java
高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API
构建一个客户端/服务端,其具有高并发、传输快、封装好等特点。
高并发Netty
是一款基于NIO
(Nonblocking I/O
,非阻塞IO
)开发的网络通信框架,对比于BIO
(Blocking I/O
,阻塞IO
),它的并发性能得到了很大提高 。
传输快Netty
的传输快其实也是依赖了NIO
的一个特性——零拷贝。
封装好Netty封装了NIO操作的很多细节,提供易于使用的API,还有心跳、重连机制、拆包粘包方案等特性,使开发者能能够快速高效的构建一个稳健的高并发应用。
为什么要用 Netty ?
JDK
原生 NIO
程序的问题
JDK
原生也有一套网络应用程序 API
,但是存在一系列问题,主要如下:
NIO
的类库和API
繁杂,使用麻烦。你需要熟练掌握Selector
、ServerSocketChannel
、SocketChannel
、ByteBuffer
等。
- 需要具备其他的额外技能做铺垫。例如熟悉
Java
多线程编程,因为NIO
编程涉及到Reactor
模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO
程序。
- 可靠性能力补齐,开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等。
NIO
编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大。
JDK NIO
的Bug
。例如臭名昭著的Epoll Bug
,它会导致Selector
空轮询,最终导致CPU 100%
。 官方声称在JDK 1.6
版本的update 18
修复了该问题,但是直到JDK 1.7
版本该问题仍旧存在,只不过该Bug
发生概率降低了一些而已,它并没有被根本解决。
Netty
的特点
Netty
对 JDK
自带的 NIO
的 API
进行封装,解决上述问题,主要特点有:
- 设计优雅,适用于各种传输类型的统一
API
阻塞和非阻塞Socket
;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池;真正的无连接数据报套接字支持(自3.1
起)。
- 使用方便,详细记录的
Javadoc
,用户指南和示例;没有其他依赖项,JDK 5
(Netty 3.x
)或6
(Netty 4.x
)就足够了。
- 高性能,吞吐量更高,延迟更低;减少资源消耗;最小化不必要的内存复制。
安全,完整的SSL/TLS
和StartTLS
支持。
- 社区活跃,不断更新,社区活跃,版本迭代周期短,发现的
Bug
可以被及时修复,同时,更多的新功能会被加入。
Netty 内部执行流程
服务端: