定义
Netty 是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
Netty 是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和简化了网络编程
特征
设计
- 适用于各种传输类型的统一 API - 阻塞和非阻塞套接字
- 基于灵活且可扩展的事件模型,可以清晰地分离关注点
- 高度可定制的线程模型——单线程、一个或多个线程池如SEDA
- 真正的无连接数据报套接字支持(自 3.1 起)
使用方便
- 详细记录的 Javadoc、用户指南和示例
- 无需额外依赖,JDK 5 (Netty 3.x) 或 6 (Netty 4.x) 就足够了
- 注意:某些组件(例如 HTTP/2)可能有更多要求。请参阅 要求页面 了解更多信息。
表现
- 更高的吞吐量、更低的延迟
- 资源消耗少
- 最小化不必要的内存复制
安全
- 完整的 SSL/TLS 和 StartTLS 支持
核心
Java NIO(New I/O,即新的 I/O)提供了对非阻塞 I/O 操作的支持,它的核心是三大组件:Channel(通道)、Buffer(缓冲区)和Selector(选择器)。
-
Channel(通道):
- Channel 是数据传输的载体,类似于流,但它可以同时支持读和写操作,并且可以异步地进行数据传输。
- Java NIO 中的通道可以分为两类:文件通道和网络通道。常用的通道类型包括 FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel 等。
-
Buffer(缓冲区):
- 缓冲区是用来存储数据的区域,它实际上是一个数组,通过缓冲区可以高效地读写数据。
- Java NIO 提供了多种类型的缓冲区,如 ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 和 DoubleBuffer 等,每种缓冲区都对应着不同的数据类型。
-
Selector(选择器):
- 选择器是 Java NIO 实现非阻塞 I/O 的关键组件之一,它可以监听多个通道的事件,从而实现单线程处理多个通道的 I/O 操作。
- 通过 Selector,可以实现一个线程同时监听多个通道的读写事件,并在有事件发生时及时地进行处理,提高了系统的并发性能。
- 通常情况下,Selector 与 Channel 搭配使用,通过注册 Channel 到 Selector 上,监听感兴趣的事件,如读就绪、写就绪等。
非阻塞 I/O
(Non-blocking I/O)是一种 I/O 模型,其特点是在进行数据读写操作时不会阻塞线程,线程会立即返回而不需要等待操作完成。在 Java 中,非阻塞 I/O 主要通过 Java NIO(New I/O)实现。
非阻塞 I/O 的主要优势包括:
-
提高并发性能:非阻塞 I/O 允许一个线程同时处理多个连接,因此可以更高效地利用系统资源,提高系统的并发性能。
-
避免线程阻塞:由于非阻塞 I/O 不会让线程阻塞在 I/O 操作上,因此可以减少线程间切换的开销,提高系统的响应速度和吞吐量。
-
适用于大量连接:非阻塞 I/O 适用于需要处理大量连接的场景,如网络服务器,可以通过少量的线程同时处理大量的连接,而不会因为线程阻塞而导致资源耗尽。
在 Java 中,非阻塞 I/O 主要依靠 Java NIO 实现。通过使用 Channel、Buffer 和 Selector,可以实现非阻塞的读写操作。Selector 是非阻塞 I/O 的关键组件,它可以同时监听多个通道的事件,并在有事件发生时通知程序进行处理。
总的来说,非阻塞 I/O 是一种高效的 I/O 模型,适用于需要处理大量连接并且要求高并发性能的场景。