Skip to content

Hyper 与 Tower:工业级 HTTP 栈

第一本从源码视角系统剖析 Rust HTTP 基础设施的中文技术专著。

打开任何一个 Rust 后端服务的 Cargo.toml,几乎都会看到这两行:

toml
hyper = "1"
tower = "0.5"

你可能只是在 Axum 里写了一个 async fn handler(Request) -> Response,可能只是在 reqwest 里敲了一句 client.get(url).send().await,但真正把你的 async fn 搬到网络上、让它接住成千上万并发连接的,是这两个库。它们是 Rust 后端生态的水和电——无处不在,却少有人真正看清它们的内部结构。

这本书的目的,就是把"水和电"打开给你看。

你会看到 Tower 如何用一个只有两个方法的 Service trait,为整个 Rust 生态统一了"异步函数"的抽象;你会看到 Layer 如何在类型系统层面把中间件堆成洋葱;你会看到 Hyper 如何把 HTTP/1 和 HTTP/2 这两套截然不同的协议,用同一套 Connection<T, S> 状态机驱动;你会看到 poll_ready 这个看似多余的 API,为什么是整个背压体系的基石;你会看到 hyper::body::Incoming 如何把字节流包装成可以被你的业务代码消费的 Body;你会看到 hyper-util 为什么必须存在——它桥接了 hyper 1.0 自己的 Service trait 与 tower 的 Service trait 之间那道看似细微却后果深远的裂缝。

这是《Rust 源码之道》丛书的第五卷,也是"Rust 后端三部曲"的中间一环:

  • 卷三 · Rust 编译器与运行时揭秘:讲编译器如何把你写的 async fn 展开成状态机。
  • 卷四 · Tokio 源码深度解析:讲运行时如何把状态机调度到线程与 I/O 之上。
  • 卷五 · Hyper 与 Tower(本书):讲 HTTP 协议栈如何把字节流翻译成可以被业务代码消费的请求与响应,讲 Service / Layer 抽象如何把"中间件"这件事做到真正的协议无关。
  • 后续:Axum、Tonic、reqwest 源码书将直接建立在这三卷的心智模型之上。

适合谁读

  • Rust Web 开发者:每天写 Axum、actix-web 或 Tonic,想理解这些框架"底下的底下"到底长什么样。
  • 中间件作者:准备给自己的服务写一个 retry、rate limiting、tracing 中间件,想从 Tower 生态里偷师一套经过工业打磨的模式。
  • 性能工程师:在生产环境被 HTTP/2 的 flow control、连接池耗尽、优雅关闭、尾延迟这些问题折磨过,需要从协议栈源码层面找根因。
  • 开源贡献者:准备给 Hyper、Tower、Axum 提 PR,或者在自己的项目里封装一个 HTTP 客户端/服务端库。
  • 读过《Tokio 源码深度解析》的读者:希望把 Future/Waker/Runtime 的心智模型,延伸到真实的网络协议与中间件编排之上。

前置知识:本书假设读者熟悉 Rust 的 trait、泛型、生命周期、PinFutureasync/await。如果对 Tokio 的 runtime、I/O driver 或 Waker 机制还有疑问,建议先阅读卷四——本书不会重复解释这些概念,但会在每一处与 Tokio 心智模型相关的地方给出章节索引。

目录

开篇

第一部分:Tower 的核心抽象

第二部分:Tower 中间件源码实录

第三部分:HTTP 数据模型

第四部分:Hyper HTTP/1 实现

第五部分:Hyper HTTP/2 实现

第六部分:Upgrade 与桥接

第七部分:客户端

第八部分:工程实践与设计哲学

源码版本

本书所有源码引用均基于以下版本(2026 年 4 月 20 日锁定):

Crate版本Git Commit
hyper1.9.00d6c7d5
tower0.5.3251296d
tower-service0.3.x随 tower
tower-layer0.3.x随 tower
http1.4.029dd307
http-body1.0.1c8cb37f
http-body-util0.1.3c8cb37f

读者可通过以下命令获取与本书完全一致的源码:

bash
git clone https://github.com/hyperium/hyper.git
cd hyper && git checkout 0d6c7d5

git clone https://github.com/tower-rs/tower.git
cd tower && git checkout 251296d

git clone https://github.com/hyperium/http.git
cd http && git checkout 29dd307

git clone https://github.com/hyperium/http-body.git
cd http-body && git checkout c8cb37f

书中每一段源码引用都会标注文件路径和行号,读者可在对应版本的代码中逐行验证。

与其他书的关联

  • 前置:《Tokio 源码深度解析》第 2-3 章(Future / Waker)、第 4-7 章(Runtime / Task)、第 8-10 章(I/O Driver)——本书所有 .await 都跑在 Tokio 之上,不会重复解释这些机制。
  • 前置:《Rust 编译器与运行时揭秘》第 9 章(async 状态机)、第 10 章(Pin / Waker / Future)——在本书第 13 章讨论 hyper::Service 为什么用 &self 时,我们会直接引用 async trait 的单态化结论。
  • 平行:《Serde 元编程》——Tower 的 Layer trait 和 Serde 的 Serializer trait 共享同一个设计哲学:用 trait 把 M×N 矩阵拆成 M+N。第 3 章会专门对照两者的设计。
  • 后续:Axum、Tonic、reqwest 源码书会直接建立在本书已经讲清楚的 Service / Layer / Body 心智模型之上。

版权声明

本书采用 CC BY-NC 4.0 许可协议。转载或引用请署名 杨艺韬 并附原文链接,禁止商业用途。

基于 VitePress 构建