Netty架构图

Netty 架构图概览


核心组件详解

1. 应用层(Application Layer)
  • ChannelHandler

    • 职责:处理入站(Inbound)和出站(Outbound)事件(如数据解码、业务逻辑)。

    • 链式调用:通过 ChannelPipeline 将多个 Handler 串联,形成处理链。

    • 示例StringDecoder(解码)、LoggingHandler(日志记录)。

  • ChannelPipeline

    • 结构:双向链表,包含多个 ChannelHandlerContext,每个节点对应一个 Handler。

    • 事件传播:通过 fireChannelRead() 或 write() 方法触发事件在链中的传递。

2. 事件循环层(EventLoop Layer)
  • EventLoop

    • 线程模型:每个 EventLoop 绑定一个线程,处理多个 Channel 的 I/O 事件和异步任务。

    • 核心任务

      • 通过 Selector 监听 Channel 的就绪事件(如 OP_READOP_WRITE)。

      • 执行提交到任务队列的异步操作(如 channel.write())。

    • 优化:避免线程切换,保证同一 Channel 的事件由同一线程处理(无锁化设计)。

  • EventLoopGroup

    • 角色:管理一组 EventLoop,通常分为 BossGroup(处理连接)和 WorkerGroup(处理 I/O)。

    • 线程分配:默认线程数为 CPU 核心数 × 2,可通过构造函数指定。

3. 传输层(Transport Layer)
  • Channel

    • 抽象:表示一个网络连接(如 NioSocketChannelEpollSocketChannel)。

    • 功能:封装底层 Socket 操作(如 bind()connect()read()write())。

    • 实现差异

      • NIO:基于 JDK 的 Selector,跨平台但性能略低。

      • Epoll:仅限 Linux,使用 epoll 系统调用,性能更高。

  • ChannelFactory

    • 作用:根据配置创建不同类型的 Channel(如 NioServerSocketChannel.class)。

    • 扩展性:支持自定义传输实现(如 UDP、Unix Domain Socket)。


Netty 数据流处理流程

  1. 客户端连接建立

    • BossGroup 的 EventLoop 处理 OP_ACCEPT 事件,创建 SocketChannel

    • 将 SocketChannel 注册到 WorkerGroup 的某个 EventLoop

  2. 数据读取(Read)

    • EventLoop 监听到 OP_READ 事件,触发 ChannelPipeline 的 InboundHandler 链:

      • 解码(如 ByteToMessageDecoder)→ 业务处理 → 结果响应。

  3. 数据写出(Write)

    • 调用 channel.write() 提交数据到 OutboundHandler 链:

      • 编码(如 MessageToByteEncoder)→ 通过 Channel 写入 Socket 缓冲区。

  4. 异步任务处理

    • 通过 eventLoop.execute() 提交任务到 EventLoop 的任务队列,由绑定线程执行。


Netty 线程模型示意图

关键设计思想

  1. Reactor 模式:主从多线程模型,分离连接建立与 I/O 处理。

  2. 无锁化串行设计:同一 Channel 的所有事件由同一线程处理,避免并发问题。

  3. 零拷贝优化:通过 FileRegion 和 CompositeByteBuf 减少内存复制。

  4. 内存池化:使用 PooledByteBufAllocator 重用 ByteBuf,降低 GC 压力。


总结

Netty 的架构通过分层设计和高效线程模型,实现了高吞吐、低延迟的网络通信。理解其 EventLoop 调度机制Pipeline 处理链 和 内存管理优化 是掌握 Netty 的核心。实际开发中需根据业务场景选择合适的传输方式和线程配置。

Netty5.0 架构剖析和源码解读 作者:李林锋 版权所有 email neu_lilinfeng@ © Netty5.0 架构剖析和源码解读1 1. 概述2 1.1. JAVA 的IO演进2 1.1.1. 传统BIO通信的弊端2 1.1.2. Linux 的网络IO模型简介4 1.1.3. IO复用技术介绍7 1.1.4. JAVA的异步IO8 1.1.5. 业界主流的NIO框架介绍10 2.NIO入门10 2.1. NIO服务端10 2.2. NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动辅助类ServerBootstrap16 3.1.2. NioServerSocketChannel 的注册21 3.1.3. 新的客户端接入25 3.2. 客户端创建28 3.2.1. 客户端连接辅助类Bootstrap28 3.2.2. 服务端返回ACK应答,客户端连接成功32 3.3. 读操作33 3.3.1. 异步读取消息33 3.4. 写操作39 3.4.1. 异步消息发送39 3.4.2. Flush操作42 4.Netty架构50 4.1. 逻辑架构50 5. 附录51 5.1. 作者简介51 5.2. 使用声明51 1. 概述 1.1.JAVA 的IO演进 1.1.1. 传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性和性能方面存在巨大的弊端。所以,在很长一段时间,大型的应 C C++ 用服务器都采用 或者 开发。当并发访问量增大、响应时间延迟变大后, 采用JAVABIO作为服务端的软件只有通过硬件不断的扩容来满足访问量的激 增,它大大增加了企业的成本,随着集群的膨胀,系统的可维护性也面临巨大 的挑战,解决这个问题已经刻不容缓。 首先,我们通过下面这幅图来看下采用BIO 的服务端通信模型:采用BIO 通信模型的 1connect NewThread1 WebBrowse 2connect 2handle(Req) WebBrowse 3connect Acceptor NewThread2 WebBrowse WebBrowse 4connect NewThread3 3sendResponsetopeer NewThread4 图1.1.1-1 BIO通信模型图 服务端,通常由一个独立的Accepto 线程负责监听客户端的连接,接收到客户 端连接之后为客户端连接创建一个新的线程处理请求消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值