0. 相关性介绍
BIO: [Blocking I/O] 同步阻塞I/O模式;同步且阻塞的通信模式。模式简单、使用方便。并发处理能低。 NIIO: [New I/O] 同步非阻塞模式;SE1.4版以后,针对网络传输效能优化的新功能。一种非阻塞同步的通信模式。 AIO: [Asynchronous I/O] 异步非阻塞模式; 在NIO基础上,引入新的异步文件通道和异步套接字通道实现。
1. 介绍和特性
介绍: Netty是一个广泛使用java网络编程框架;提供异步的、基于事件驱动的网络应用程序框架,以快速开发高性能、高可靠性的网络IO程序。目前最流行的NIO框架。知名的Elasticsearch跟Dubbo框架都采用了Netty。
JDK自带NIO的问题
- NIO 的类库和 API 繁杂。
- 需要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,必须对多线程和网络编程非常熟悉, 才能编写出高质量的 NIO 程序。
- 开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常 流的处理等等处理起来难度会比较大。
- JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。
Netty优点: Netty 对 JDK 自带的 NIO 的 API 进行了封装,解决了上述问题。
- 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池。
- 使用方便:详细记录的 Javadoc,用户指南和示例;没有其他依赖项,JDK 5(Netty 3.x)或 6(Netty 4.x)就足够了。
- 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
- 安全:完整的 SSL/TLS 和 StartTLS 支持。
- 社区活跃、不断更新:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时更多的新功能会被加入。
IO类型 | 客户端个数 | API使用难度 | 调试难度 | 可靠性 | 吞吐量 | |
---|---|---|---|---|---|---|
BIO模型 | 阻塞同步的IO | 1: 1 | 简单 | 较简单 | 非常差 | 非常低 |
伪异步IO模型 | 阻塞同步的IO | M: N | 简单 | 简单 | 很差 | 有一定吞吐量 |
NIO模型 | 非阻塞同步的IO | M: 1 | 复杂 | 相对复杂 | 高一些 | 高 |
AIO模型 | 非阻塞异步的IO | M: 0 | 复杂 | 相对复杂 | 比较高 | 比较高 |
2.NIO的三大组件
- channel & Buffer — NIO基本结构,代表用于连接到实体(如硬件设备、文件、网络套接字、程序组件),能够执行一个或多个不同的I/O操作(读/写)的开放连接。
- Callback(回调) — 提供给另一个方法的引用,这样可以在某个适合的时间调用前者。事件可以由接口ChannelHandler的实现来处理。
- Future — 提供另外一种通知应用操作已完成方式,这个对象作为一个异步操作结果的占位符,将来某个时候完成并提供结果。 ChannelFuture提供多个附件方法来允许一个或者多个ChannelFutureListener实例。此时的回调方法operationComplete()会在操作完成时调用。事件监听者能够确认这个操作是否成功或错误。
整合Future、Callback和Handler: Netty异步编程模型建立在Future和Callback概念上,拦截操作和转换入站或出站只需提供回调或利用future操作返回的。使得链操作简单、高效;促进编写可重用的、通用代码。一个Netty设计主要目标促进“关注点分离”:业务逻辑从网络基础设施应用中分离。
2.1 channel 和 Buffer
常用channel | 常用buffer |
---|---|
FileChannel | ByteBuffer (MappedByteBuffer、DirectByteBuffer、HeapByteBuffer) |
DatagramChannel | ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer |
SocketChannel | |
ServerSocketChannel |
2. selector
selector:需要结合服务器的设计演化来理解用途;