Netty 概述
1. Netty 简介
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
译:Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。
--摘自 Netty官网
Netty 是一个广受欢迎的异步事件驱动的 Java 开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty 就像是一个 Java 网络编程的“瑞士军刀”,它极大地简化和优化了网络编程,例如 TCP 和 UDP 套接字服务器的开发。
Netty 的设计融合了众多协议(例如 FTP、SMTP、HTTP 以及各种基于二进制和文本的传统协议)的实现经验,并经过精心打磨。因此,Netty 成功地在不牺牲任何性能的前提下,兼顾了开发便捷性、高性能、高稳定性和高灵活性。
核心定位:它并不是一个完整的应用服务器,而是一个底层通信框架,负责处理数据的接收、发送和编解码。像 Dubbo、RocketMQ、Elasticsearch 等众多知名开源项目,其底层的网络通信模块都是基于 Netty 构建的。
2. 为什么需要 Netty
2.1. 为什么要使用 NIO 进行编程呢
首先我们介绍一下传统的同步阻塞IO模型(BIO):同步的、阻塞式 IO。在这种模型中,服务器上一个线程处理一次连接,即客户端每发起一个请求,服务端都要开启一个线程专门处理该请求。
这种模型对线程量的耗费极大,且线程利用率低,难以承受请求的高并发。它的通信模型如下:

由上图我们可以看出,传统的同步阻塞 IO 通信存在如下几个问题:
-
线程模型存在致命缺陷:一连接一线程的模型导致服务端无法承受大量客户端的并发连接;
-
性能差:频繁的线程上下文切换导致 CPU 利用效率不高;
-
可靠性差:由于所有的 IO 操作都是同步的,所以业务线程只要进行 IO 操作,也会存在被同步阻塞的风险,这会导致系统的可靠性差,依赖外部组件的处理能力和网络的情况。
采用非阻塞 IO(NIO)之后,同步阻塞 IO 的三个缺陷都将迎刃而解:
-
NIO 采用 Reactor 模式:一个 Reactor 线程聚合一个多路复用器 Selector,它可以同时注册、监听和轮询成百上千个 Channel,一个 IO 线程可以同时并发处理N个客户端连接,线程模型优化为1:N(N < 进程可用的最大句柄数)或者 M : N (M通常为 CPU 核数 + 1, N < 进程可用的最大句柄数);
-
由于 IO 线程总数有限,不会存在频繁的 IO 线程之间上下文切换和竞争,CPU 利用率高;
-
所有的 IO 操作都是异步的,即使业务线程直接进行 IO 操作,也不会被同步阻塞,系统不再依赖外部的网络环境和外部应用程序的处理性能。
由于切换到 NIO 编程之后可以为系统带来巨大的可靠性、性能提升,所以,目前采用 NIO 进行通信已经逐渐成为主流。
2.2. 为什么不直接基于 JDK 的 NIO 类库编程呢
Java 在 JDK 1.4 引入了 NIO 机制。NIO 的核心特点是面向缓冲区、非阻塞 I/O,并提供了选择器。JAVA NIO的架构如下图所示:

它的通信模型如下:

JAVA NIO 的优缺点如下:
-
优点
-
高并发性能:这是 NIO 最大的优势。通过 Selector 单线程管理大量连接,避免了为每个连接创建线程的巨大开销,使得构建支持数十万甚至上百万并发连接的服务器成为可能(如 Netty、ZooKeeper 等都基于 NIO)。
-
非阻塞 I/O:线程不会被 I/O 操作无限期阻塞,可以充分利用 CPU 时间去做其他事情,提高了系统的吞吐量。
-
更精细的控制:Buffer 机制允许对数据进行更灵活的操作,比如分散(Scatter)和聚集(Gather),可以直接将数据读入多个 Buffer,或将多个 Buffer 的数据写入一个 Channel。
-
-
缺点和挑战
-
API 复杂,编程难度大:
-
NIO 的编程模型比 BIO 复杂得多,需要理解 Channel、Buffer、Selector 三者如何协同工作。
-
Buffer 的状态管理(flip, clear, compact)很容易出错。
-
Reactor 模式下的网络编程,对开发人员的要求较高。
需要自己管理线程模型,以处理高并发连接,这对开发者要求很高。
-
-
-
臭名昭著的 epoll bug:
在 Linux 平台上,JDK NIO 使用 epoll 作为 Selector 的实现。但在某些情况下(特别是高负载下),存在一个著名的 Bug:Selector 可能会空轮询,导致 CPU 使用率 100%。
这个问题在 JDK 的多个版本中都有出现,虽然后续版本有修复尝试,但给开发者带来了很多困扰。
Netty 等框架在自己的 NIO 线程模型中加入了检测和规避机制来解决此问题。
-
API 设计不够友好:
原生 NIO 的 API 比较底层,很多高级功能需要自己实现,例如断线重连、半包粘包处理、心跳机制等,这使得直接使用 JDK NIO 开发一个健壮的网络应用非常困难。
-
对文件 I/O 的支持有限:
虽然 FileChannel 功能强大(支持文件锁、内存映射文件等),但在某些场景下,其性能表现可能不如预期,或者 API 使用起来不如传统的 BIO 直观。
-
性能调优困难:
要达到高性能,需要对 NIO 和操作系统有很深的理解,并进行大量优化。
由于其复杂性和一些固有的缺陷,在绝大多数生产环境中,我们并不直接使用 JDK NIO 进行开发,而是使用基于它构建的、更成熟的高级框架,其中最著名的就是 Netty。
Netty 对 JDK NIO 进行了极佳的封装,提供了更简洁、更易用的 API。
-
它解决了 JDK NIO 的很多痛点,如 epoll bug、粘包拆包问题。
-
它提供了丰富的协议支持(如 HTTP、WebSocket、Protobuf 等)和强大的生命周期管理。
-
拥有庞大的社区和丰富的实践案例,是构建高性能网络服务器的首选。
Netty 的出现,完美地解决了这些问题。它提供了一个高度抽象的、易于使用的 API,并内置了大量开箱即用的功能,让开发者可以专注于业务逻辑,而不必纠缠于底层网络实现的细节。
3. Netty 的核心特性与优势
3.1. 高性能
-
异步非阻塞 I/O:基于 NIO,用少量线程即可处理大量连接。
-
零拷贝:通过 ByteBuf 和 FileRegion 等技术,减少内存拷贝次数,提升数据传输效率。
-
内存池:通过重用 ByteBuf 来减少 GC 压力,提升内存使用效率。
-
精心优化的线程模型:主从 Reactor 模型充分发挥多核性能。
3.2. 高可扩展性
- 基于 ChannelHandler 的链式管道(Pipeline)设计,可以轻松地添加、移除业务逻辑模块,实现功能的可插拔。
3.3. 易于使用
- 封装了 NIO 的复杂细节,提供了简单易用的 API。文档丰富,社区活跃。
3.4. 健壮性与安全性
-
解决了诸如粘包/拆包、链路闪断、流量整形等网络常见问题。
-
提供了 SSL/TLS 支持,保证通信安全。
3.5.社区活跃,生态成熟
- 被业界大量知名项目使用,久经考验,有大量的实践案例和解决方案。
4. Netty 常见使用场景
Netty 主要适用于通信框架和协议服务器的开发:
-
RPC 框架:如 Apache Dubbo, gRPC (Java 版),其底层网络通信就是基于 Netty。
-
消息中间件:如 RocketMQ,使用 Netty 进行 Broker 与 Producer/Consumer 之间的通信。
-
游戏服务器:需要高性能、长连接的场景,Netty 是首选。
-
即时通讯/推送系统:如微信、钉钉的后台通信架构。
-
分布式计算:如 Hadoop、Spark 等组件间的数据交换。
-
HTTP/2 服务器:构建下一代 Web 服务器。
5. Netty 框架介绍
理解 Netty 的关键在于理解其线程模型和核心组件。
5.1. 线程模型:Reactor 模式的卓越实现
Netty 主要采用了 主从 Reactor 多线程模型,这也是它能支撑高并发的基石。
-
BossGroup (主Reactor):负责接收客户端的连接请求,并将接受的连接注册到 WorkerGroup。
-
WorkerGroup (从Reactor):负责处理已建立连接的 I/O 读写操作(即实际的业务请求)。
这种分工明确的模型,使得连接请求和业务处理互不干扰,可以充分利用多核 CPU 的优势。
5.2. 核心组件
Netty的架构图如下:

Netty的核心组件主要包含以下几个部分:
-
Core核心模块:包括零拷贝、API库、可扩展的事件模型。
-
协议支持组件:Socket通信、Http隧道、webSocket、SSL/TLS、Protobuf、zlib/gzip、Large File Transfer等协议;
-
传输服务:包括Socket、Datagram、Http Tunnel等
6. 总结
Netty 是一个强大、高效、易用的 Java 网络应用框架。它通过精心的架构设计,将复杂的异步网络编程封装成简单易懂的组件,让开发者能够轻松构建出高性能、高可靠性的网络服务器和客户端。在现代分布式系统和微服务架构中,Netty 几乎已经成为底层通信的事实标准。如果你从事后端开发,尤其是中间件、网关、RPC 等领域,深入理解 Netty 是非常有必要的。
参考:

浙公网安备 33010602011771号