Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
主要应用场景
io.netty.common
: 提供通用的工具类、常量和基本抽象,例如 AttributeMap
, ReferenceCounted
, ResourceLeakDetector
以及 NetUtil
等。这个包被几乎所有其他 Netty模块所依赖。
NetUtil.java
所示,它提供了网络相关的实用方法。io.netty.buffer
: 这是 Netty 的核心组件之一,提供了高性能的字节缓冲区 (ByteBuf
) 实现。它包括池化和非池化的缓冲区,直接内存和堆内存缓冲区等,旨在优化内存使用和减少GC压力。
transport
, codec
, handler
)都会依赖 io.netty.buffer
。transport-classes-epoll/src/main/java/module-info.yml
中可以看到 requires: - module: io.netty.buffer
。针对不同操作系统提供最优的I/O性能
io.netty.transport
: 定义了 Netty 网络通信的核心抽象,如 Channel
(代表一个连接,如 Socket), EventLoop
(处理所有I/O事件的单线程执行器), EventLoopGroup
(管理多个 EventLoop
), ChannelPipeline
(处理事件的责任链)。
Bootstrap
和 ServerBootstrap
类来配置和启动客户端和服务端。transport/src/main/java/io/netty/channel/package-info.java
描述了 Channel API。io.netty.transport.socket.nio
: 提供了基于 Java NIO 的 SocketChannel
实现。
transport/src/main/java/io/netty/channel/socket/nio/package-info.java
提及了 NIO 套接字实现。io.netty.transport.unix.common
: 为基于 Unix 的本地传输(如 Epoll, KQueue, IO_uring)提供通用的本地方法和结构。io.netty.transport.classes.epoll
, io.netty.transport.classes.kqueue
, io.netty.transport.classes.io_uring
: 这些是针对特定操作系统的高性能本地传输实现。它们依赖 io.netty.transport
的抽象和 io.netty.transport.unix.common
。
transport-classes-epoll/src/main/java/module-info.yml
依赖 io.netty.transport
和 io.netty.transport.unix.common
。transport-native-unix-common/src/main/c/netty_unix.c
是本地代码的一部分。io.netty.codec
: 提供了编解码器的基础框架和一些通用编解码器。编解码器负责将字节流 (ByteBuf
) 转换为 Java 对象(解码),以及将 Java 对象转换为字节流(编码)。io.netty.codec.http
: 提供了 HTTP/1.x 协议的编解码器和相关处理器,如 HttpRequestDecoder
, HttpResponseEncoder
, HttpObjectAggregator
。
codec-http/src/main/java/module-info.yml
所示。io.netty.codec.http2
: 提供了 HTTP/2 协议的编解码器和帧处理逻辑。它通常依赖 io.netty.codec.http
(用于升级等) 和 io.netty.handler
。
codec-http2/src/main/java/module-info.yml
所示,它依赖 io.netty.codec.http
。io.netty.codec.http3
: 提供了 HTTP/3 协议的支持,通常基于 QUIC。
codec-http3/src/main/java/module-info.yml
所示。testsuite-jpms/README.md
中提到了 io.netty.codec.quic.${os.name}.${os.arch}
模块。io.netty.codec.dns
: DNS 协议的编解码器。io.netty.codec.socks
: SOCKS 代理协议的编解码器。io.netty.codec.mqtt
: MQTT 协议的编解码器。io.netty.codec.smtp
: SMTP 协议的编解码器。io.netty.codec.memcache
: Memcache 协议的编解码器。io.netty.codec.compression
: 提供数据压缩和解压缩的处理器,如 Gzip, Zlib。
codec-compression/src/main/java/module-info.yml
所示。io.netty.codec.marshalling
: 使用 JBoss Marshalling 进行对象序列化的编解码器。io.netty.codec.xml
: XML 数据的编解码器。ChannelHandler
被添加到 ChannelPipeline
中,以处理特定协议的数据转换。io.netty.handler
: 包含了一系列通用的 ChannelHandler
实现,用于处理各种网络事件和数据,例如 SSL/TLS 支持 (SslHandler
)、超时处理 (IdleStateHandler
, ReadTimeoutHandler
)、流量整形 (ChannelTrafficShapingHandler
) 等。io.netty.handler.proxy
: 提供了客户端代理连接的支持,如 HTTP CONNECT 和 SOCKS 代理。它会使用 io.netty.codec.http
和 io.netty.codec.socks
。
handler-proxy/src/main/java/module-info.yml
所示。io.netty.handler.ssl.ocsp
: 提供了对 OCSP (Online Certificate Status Protocol) 的支持,用于检查 SSL/TLS 证书的吊销状态。它依赖 io.netty.codec.http
(用于 OCSP 请求) 和 io.netty.resolver.dns
。
handler-ssl-ocsp/src/main/java/module-info.yml
所示。io.netty.resolver
: 定义了地址解析的通用 API。io.netty.resolver.dns
: 提供了基于 DNS 的地址解析实现。它会使用 io.netty.codec.dns
来构造和解析 DNS 查询/响应,并使用 io.netty.transport
来发送和接收 DNS 报文。
resolver-dns/src/main/java/module-info.yml
所示。io.netty.resolver.dns.classes.macos
: 针对 macOS 的特定 DNS 解析增强。Netty 的架构可以看作是分层和模块化的。
数据流动与处理:
transport
模块(如 NioSocketChannel
)负责从底层网络读取数据到 ByteBuf
(buffer
模块)。ChannelPipeline
(transport
模块的核心组件,由 handler
模块提供基础接口)。ChannelPipeline
中,数据会经过一系列 ChannelHandler
(handler
模块)。codec
模块的解码器,将 ByteBuf
转换为特定协议的消息对象(如 HTTP 请求对象)。handler
(如 SSL/TLS 处理、压缩、日志、业务逻辑处理器)对消息进行进一步处理。codec
模块的编码器转换为 ByteBuf
,再由 transport
模块写出到网络。依赖关系:
common
和 buffer
是最基础的模块,被广泛依赖。transport
模块依赖 buffer
和 common
,并为上层提供了网络通信的核心抽象。codec
和 handler
模块依赖 transport
(获取 ChannelPipeline
, ChannelHandlerContext
等)、buffer
(处理字节数据) 和 common
。codec-http
) 依赖通用的 codec
模块。handler-proxy
, resolver-dns
, handler-ssl-ocsp
) 会根据其功能需要,组合依赖多个其他模块(如 codec-http
, codec-dns
, transport
等)。事件驱动:
EventLoop
(transport
模块) 负责监听网络事件(连接建立、数据可读、连接关闭等)。EventLoop
会在 ChannelPipeline
中触发相应的事件传播,由各个 ChannelHandler
响应和处理。例如,一个 HTTP 服务器的典型协作流程:
ServerBootstrap
(transport
) 配置 EventLoopGroup
, Channel
类型 (如 NioServerSocketChannel
)。ChannelInitializer
(handler
) 用于在新连接建立时,向 ChannelPipeline
添加一系列 ChannelHandler
:
SslHandler
(handler
) (如果启用 HTTPS)。HttpRequestDecoder
和 HttpResponseEncoder
(codec-http
)。HttpObjectAggregator
(codec-http
) (将 HTTP 消息片段聚合成完整的请求/响应)。ChannelHandler
(handler
)。transport
模块接受连接,创建一个新的 Channel
。ChannelInitializer
被调用,上述处理器被添加到 ChannelPipeline
。transport
读入 ByteBuf
。ByteBuf
在 ChannelPipeline
中流动,SslHandler
解密 (如果适用),HttpRequestDecoder
将字节解码为 HttpRequest
对象,HttpObjectAggregator
将其聚合成 FullHttpRequest
。FullHttpRequest
传递给业务逻辑处理器,业务处理器生成 FullHttpResponse
。FullHttpResponse
反向流经 ChannelPipeline
,被 HttpResponseEncoder
编码为 ByteBuf
,SslHandler
加密 (如果适用),最终由 transport
写回客户端。这种模块化的设计使得 Netty 非常灵活和可扩展,用户可以根据需要组合不同的模块和处理器来构建各种高性能网络应用。
高性能I/O模型
ByteBuf
实现高效内存管理异步事件驱动
协议支持广泛
# 代码仓中的协议支持
codec-http/ # HTTP/HTTPS协议
codec-http2/ # HTTP/2协议
codec-websocket/ # WebSocket协议
codec-mqtt/ # MQTT物联网协议
codec-redis/ # Redis协议
codec-protobuf/ # Protocol Buffers
codec-ssl/ # SSL/TLS加密
跨平台优化
Netty 通过分层架构设计和多种传输实现,为Java生态提供了一个统一、高性能、易扩展的网络编程解决方案。它不仅抽象了复杂的网络编程细节,还通过针对性优化在不同平台上都能发挥出色的性能表现。
无论是构建高并发的Web服务器,还是实现复杂的分布式通信协议,Netty都提供了强大而灵活的基础设施支持。