Netty整体架构是怎样的?
Netty整体架构是怎样的?
月伴飞鱼逻辑架构
Netty的逻辑处理架构共分为网络通信层、事件调度层、服务编排层,每一层各司其职。
网络通信层:
网络通信层的职责是执行网络 I/O 的操作。
- 它支持多种网络协议和 I/O 模型的连接操作。
当网络数据读取到内核缓冲区后,会触发各种网络事件,这些网络事件会分发给事件调度层进行处理。
网络通信层的包含BootStrap、ServerBootStrap、Channel三个组件。
BootStrap & ServerBootStrap
- Bootstrap:
- 主要负责整个 Netty 程序的启动、初始化、服务器连接等过程。
Netty中的引导器共分为两种类型:
- 用于客户端引导的 Bootstrap。
- 用于服务端引导的 ServerBootStrap,它们都继承自抽象类 AbstractBootstrap。
事件调度层:
通过 Reactor 线程模型对各类事件进行聚合处理
通过 Selector 主循环线程集成多种事件( I/O 事件、信号事件、定时事件等)
- 实际的业务处理逻辑是交由服务编排层中相关的
Handler
完成。事件调度层的核心组件包括 EventLoopGroup、EventLoop。
- EventLoopGroup & EventLoop
EventLoopGroup 本质是一个线程池,主要负责接收 I/O 请求,并分配线程执行处理请求。
EventLoopGroup、EventLoop、Channel 的关系:
- 一个 EventLoopGroup 往往包含一个或者多个 EventLoop。
- EventLoop 用于处理 Channel 生命周期内的所有 I/O 事件
- 如 accept、connect、read、write 等 I/O 事件。
- EventLoop 同一时间会与一个线程绑定,每个 EventLoop 负责处理多个 Channel。
- 每新建一个 Channel,EventLoopGroup 会选择一个 EventLoop 与其绑定。
- 该 Channel 在生命周期内都可以对 EventLoop 进行多次绑定和解绑。
EventLoopGroup 的实现类是 NioEventLoopGroup。
可以把 NioEventLoopGroup 理解为一个线程池
- 每个线程负责处理多个 Channel,而同一个 Channel 只会对应一个线程。
Netty 通过创建不同的 EventLoopGroup 参数配置,可以支持 Reactor 的三种线程模型:
- 单线程模型:
- EventLoopGroup 只包含一个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup。
- 多线程模型:
- EventLoopGroup 包含多个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup。
- 主从多线程模型:
- EventLoopGroup 包含多个 EventLoop,Boss 是主 Reactor,Worker 是从 Reactor
- 它们分别使用不同的 EventLoopGroup
- 主 Reactor 负责新的网络连接 Channel 创建,然后把 Channel 注册到从 Reactor。
服务编排层:
服务编排层的职责是负责组装各类服务,它是 Netty 的核心处理链,用以实现网络事件的动态编排和有序传播。
服务编排层的核心组件包括 ChannelPipeline、ChannelHandler、ChannelHandlerContext。
ChannelPipeline
负责组装各种 ChannelHandler,实际数据的编解码以及加工处理操作都是由 ChannelHandler 完成的。
ChannelPipeline 可以理解为ChannelHandler 的实例列表:
- 内部通过双向链表将不同的 ChannelHandler 链接在一起。
当 I/O 读写事件触发时,ChannelPipeline 会依次调用 ChannelHandler 列表对 Channel 的数据进行拦截和处理。
ChannelPipeline 是线程安全的,因为每一个新的 Channel 都会对应绑定一个新的 ChannelPipeline。
一个 ChannelPipeline 关联一个 EventLoop,一个 EventLoop 仅会绑定一个线程。
ChannelHandler & ChannelHandlerContext
- ChannelHandlerContext 用于保存 ChannelHandler 上下文。
组件关系
服务端启动初始化时有 Boss EventLoopGroup 和 Worker EventLoopGroup 两个组件,其中 Boss 负责监听网络连接事件。
- 当有新的网络连接事件到达时,则将 Channel 注册到 Worker EventLoopGroup。
Worker EventLoopGroup 会被分配一个 EventLoop 负责处理该 Channel 的读写事件。
- 每个 EventLoop 都是单线程的,通过 Selector 进行事件循环。
当客户端发起 I/O 读写事件时,服务端 EventLoop 会进行数据的读取
- 然后通过 Pipeline 触发各种监听器进行数据的加工处理。
客户端数据会被传递到 ChannelPipeline 的第一个 ChannelInboundHandler 中
- 数据处理完成后,将加工完成的数据传递给下一个 ChannelInboundHandler。
当数据写回客户端时,会将处理结果在 ChannelPipeline 的 ChannelOutboundHandler 中传播,最后到达客户端。