Netty 源码研读 · 总路线图(Master Plan)

目标:用「讲透式」博客(博客体 + 可运行 demo + SVG 图 + 关键处 Java NIO 对照)逐行走读 Netty 4.1 源码,从启动流程一路钻到内存池与事件传播。
读法:先骨架后血肉——先把"组件全景 + 启动流程"看明白,再逐层下钻到 EventLoop、Pipeline、ByteBuf,最后把读/写/连接三条主链路完整串一遍。
本文件是总路线图,各模块落到具体文章时再逐步展开。

〇、阅读约定(待确认)

  • 研读版本(已锁)Netty 4.1.x 稳定 tag(netty-4.1.110.Final 附近)。4.1 是长期主线;Netty 5 已废弃,不跟。
  • 每篇结构:开场钩子 → 「是什么 / 坑在哪 / 本质一句话」递进 → 贴出真实源码片段 + 行号 → 可运行最小 demo → SVG 时序/结构图 → 对比小结。
  • 图一律 SVG(不写 ASCII 图):架构图、双向链表、时序图都画成内联 <svg>
  • 文章内禁止预测下一篇(不写"下篇预告/下回分解"类字样)。
  • 日期与排期策略:见文末「待确认」。
  • abbrlink 前缀nety + 4 位序号,如 nety0101nety0102……
  • 分类 / 系列categories: [Java, Netty源码研读]series: [Java, Netty源码研读]

一、目录结构

1
2
3
4
5
source/_posts/Java/Netty源码研读/
├── 内容规划.md # 本文件:总路线图 + 模块拆分
├── nety0101-...md # 各篇(扁平排列,按序号推进)
├── nety0102-...md
└── ...

说明:Netty 是单一主题,不像 CS 基础课那样拆成多门"课",故采用扁平目录 + 顺序编号,而非子目录。若后续想按 Phase 分子目录,可再调整。

二、模块拆分(8 个 Phase / 约 28 篇)

Phase 0 · 准备与环境

  1. 拉取源码、IDE 导入、跑通 echo 例子;本系列读法与本机环境约定

Phase 1 · 宏观架构与启动流程(先看骨架)

  1. Netty 整体架构:Reactor 模型 + 核心组件全景(Bootstrap / EventLoopGroup / Channel / Pipeline / Handler)
  2. 服务端启动全流程:ServerBootstrap 配置 → bind()initAndRegister → 注册到 EventLoop
  3. 客户端启动与连接建立:Bootstrap.connect() 链路

Phase 2 · NIO 基石与 Channel 抽象

  1. Java NIO 回顾:Selector / Channel / Buffer,以及原生坑(epoll 空轮询、JDK NIO bug)
  2. Channel 接口体系与 ChannelPromise(异步结果为什么这样设计)
  3. Unsafe 内部类:真正的 I/O 操作为什么藏在 Unsafe
  4. NioServerSocketChannel / NioSocketChannel 的创建与注册

Phase 3 · 事件循环与线程模型(心脏)

  1. EventLoopEventLoopGroupSingleThreadEventExecutor 源码
  2. 任务队列与定时任务:taskQueue / schedule / wakeup
  3. Reactor 线程 run() 主循环:selectprocessSelectedKeysrunAllTasks
  4. 多线程模型:Boss/Worker 分组、Channel 如何绑定到固定 EventLoop(线程亲和)

Phase 4 · ChannelPipeline 与事件传播(神经系统)

  1. ChannelPipeline 双向链表结构与 ChannelHandlerContext
  2. 入站 / 出站事件传播:fireXXXinvokeXXX 的双向流动
  3. HeadContext / TailContext 的角色与收尾
  4. 自定义 Handler 编排与异常传播(exceptionCaught

Phase 5 · 内存与 ByteBuf(血液)

  1. ByteBuf 设计:读写指针分离、ReferenceCounted 引用计数
  2. 内存分配:ByteBufAllocatorUnpooled vs Pooled
  3. PooledByteBufAllocator 与 jemalloc 风格池化:PoolArena / Chunk / Page / Subpage
  4. Netty 零拷贝:CompositeByteBufsliceFileRegionwrap

Phase 6 · 编解码与数据处理

  1. Codec 框架:ByteToMessageDecoder / MessageToByteEncoder
  2. 拆包 / 粘包:LengthFieldBasedFrameDecoder 源码走读
  3. 常用编解码器:String / Protobuf / HTTP

Phase 7 · 读 / 写 / 连接主链路串讲(收口)

  1. 服务端读链路:OP_ACCEPT → 建连 → OP_READ → 数据流入 Pipeline
  2. 写链路:writeflush → 真正 socket 写出 → OP_WRITE 可写性控制
  3. 背压与可写性:isWritable() / writabilityChanged

Phase 8 · 进阶主题(按需)

  1. Future / Promise 异步模型与 notify 机制
  2. 性能内核:FastThreadLocalRecycler 对象池
  3. 原生 epoll / kqueue 传输(Linux / macOS 优化)
  4. 心跳与空闲检测:IdleStateHandler
  5. 收尾:手写一个 mini-Netty(把核心机制复述一遍)

三、已确认约定(2026-08-26 拍板)

  • 研读版本:锁定 Netty 4.1.x 稳定 tag(netty-4.1.110.Final 附近)。4.1 是长期主线,Netty 5 已废弃,不跟。
  • 日期策略回溯时间线(仿 CS 基础课)。文章 date2025-08-21(周四)起,连续 2 篇/周(周一 + 周四),到 2025-12-04 收尾;博客已开 future: true,按时间顺序渲染。真实发文从今天(2026-08)按节奏推进。
  • 节奏2 篇 / 周(周一 + 周四)
  • 目录组织扁平目录 + 顺序编号,不分子目录。
  • abbrlinknety01xxnety0101 ~ nety0131)。
  • 分类 / 系列categories: [Java, Netty源码研读]series: [Java, Netty源码研读]
  • 排期数据:完整逐篇日期表见同目录 _schedule.json(仿 CS 基础课格式)。

四、分阶段日期表(31 篇 / 2025-08-21 → 2025-12-04)

阶段 篇数 主题
Phase 0 1 2025-08-21 2025-08-21 环境 + 读法约定
Phase 1 3 2025-08-25 2025-09-01 宏观架构与启动流程
Phase 2 4 2025-09-04 2025-09-15 NIO 基石与 Channel 抽象
Phase 3 4 2025-09-18 2025-09-29 事件循环与线程模型
Phase 4 4 2025-10-02 2025-10-13 ChannelPipeline 与事件传播
Phase 5 4 2025-10-16 2025-10-27 内存与 ByteBuf
Phase 6 3 2025-10-30 2025-11-06 编解码与数据处理
Phase 7 3 2025-11-10 2025-11-17 读 / 写 / 连接主链路串讲
Phase 8 5 2025-11-20 2025-12-04 进阶主题 + 收尾 mini-Netty

下一步:从 Phase 0 第 1 篇(环境 + 读法)开始,按"先讲透再下笔"的约定逐篇推进。每篇定稿前会先和你对齐关键概念。