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 的核心处理链,用以实现网络事件的动态编排和有序传播。

服务编排层的核心组件包括 ChannelPipelineChannelHandler、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 中传播,最后到达客户端。