Appearance
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、泛型、生命周期、Pin、Future 与 async/await。如果对 Tokio 的 runtime、I/O driver 或 Waker 机制还有疑问,建议先阅读卷四——本书不会重复解释这些概念,但会在每一处与 Tokio 心智模型相关的地方给出章节索引。
目录
开篇
第一部分:Tower 的核心抽象
- 第2章 Service trait:
async fn(Req) -> Res的协议无关抽象 - 第3章 Layer 与 ServiceBuilder:类型级中间件组合
- 第4章 poll_ready 与 backpressure:显式容量信号的工程意义
第二部分:Tower 中间件源码实录
- 第5章 Timeout / Retry / RateLimit:基础中间件的源码剖析
- 第6章 Buffer / LoadShed / ConcurrencyLimit:容量工程
- 第7章 Balance / Discover / ready_cache:负载均衡抽象
- 第8章 Filter / MapRequest / Steer:请求路由与变换
第三部分:HTTP 数据模型
- 第9章 http crate:Request / Response / HeaderMap 的零分配设计
- 第10章 http-body 与 Body trait:frame、trailers、size_hint
第四部分:Hyper HTTP/1 实现
- 第11章 HTTP/1 wire:parser、encoder、chunked 编码
- 第12章 Connection Dispatcher 与 Role:请求分发状态机
- 第13章 hyper 的 Service trait:为什么 1.0 不复用 tower::Service
- 第14章 keep-alive、半关闭与超时矩阵
第五部分:Hyper HTTP/2 实现
- 第15章 h2 crate 与 HPACK:HTTP/2 的线路层
- 第16章 多流调度与流控:backpressure 在 HTTP/2 的落地
- 第17章 PING / GOAWAY / 超时:HTTP/2 的生存线
第六部分:Upgrade 与桥接
第七部分:客户端
第八部分:工程实践与设计哲学
源码版本
本书所有源码引用均基于以下版本(2026 年 4 月 20 日锁定):
| Crate | 版本 | Git Commit |
|---|---|---|
| hyper | 1.9.0 | 0d6c7d5 |
| tower | 0.5.3 | 251296d |
| tower-service | 0.3.x | 随 tower |
| tower-layer | 0.3.x | 随 tower |
| http | 1.4.0 | 29dd307 |
| http-body | 1.0.1 | c8cb37f |
| http-body-util | 0.1.3 | c8cb37f |
读者可通过以下命令获取与本书完全一致的源码:
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 的
Layertrait 和 Serde 的Serializertrait 共享同一个设计哲学:用 trait 把 M×N 矩阵拆成 M+N。第 3 章会专门对照两者的设计。 - 后续:Axum、Tonic、reqwest 源码书会直接建立在本书已经讲清楚的
Service/Layer/Body心智模型之上。
版权声明
本书采用 CC BY-NC 4.0 许可协议。转载或引用请署名 杨艺韬 并附原文链接,禁止商业用途。