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的问题

  1. NIO 的类库和 API 繁杂。
  2. 需要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,必须对多线程和网络编程非常熟悉, 才能编写出高质量的 NIO 程序。
  3. 开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常 流的处理等等处理起来难度会比较大。
  4. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。

Netty优点: Netty 对 JDK 自带的 NIO 的 API 进行了封装,解决了上述问题。

  1. 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池。
  2. 使用方便:详细记录的 Javadoc,用户指南和示例;没有其他依赖项,JDK 5(Netty 3.x)或 6(Netty 4.x)就足够了。
  3. 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
  4. 安全:完整的 SSL/TLS 和 StartTLS 支持。
  5. 社区活跃、不断更新:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时更多的新功能会被加入。



IO类型 客户端个数 API使用难度 调试难度 可靠性 吞吐量
BIO模型 阻塞同步的IO 1: 1 简单 较简单 非常差 非常低
伪异步IO模型 阻塞同步的IO M: N 简单 简单 很差 有一定吞吐量
NIO模型 非阻塞同步的IO M: 1 复杂 相对复杂 高一些
AIO模型 非阻塞异步的IO M: 0 复杂 相对复杂 比较高 比较高

2.NIO的三大组件

  1. channel & Buffer — NIO基本结构,代表用于连接到实体(如硬件设备、文件、网络套接字、程序组件),能够执行一个或多个不同的I/O操作(读/写)的开放连接。
  2. Callback(回调) — 提供给另一个方法的引用,这样可以在某个适合的时间调用前者。事件可以由接口ChannelHandler的实现来处理。
  3. 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:需要结合服务器的设计演化来理解用途;