Rust in Everything
基于 tower 0.5.3

tower 源码解析

这一卷对着 tower 0.5.3(tag tower-0.5.3,commit 4b0a6b0)读源码,同仓库的 tower-service 0.3.3、tower-layer 0.3.3 一起讲。所有源码链接都指向这个 tag。

tower 自己不带运行时,也不懂任何网络协议。它只定了一个约定:调用方先问服务「能接请求吗」(poll_ready),得到肯定答复后才发请求(call)。全卷沿这个约定的两个方向读:

  • 就绪主线(往里传):ready().await 从最外层的 poll_ready 问起,每一层先占自己的资源再问内层;任何一层返回 Pending,整条链挂起,压力传回调用方。
  • 请求主线(往外包):call(req) 从外往里调,每一层把内层返回的 future 包进自己的 ResponseFuture;响应从里往外一层层解开。
flowchart TB
  intro[00 导读] --> overview[01 全景]
  overview --> core[02 核心契约]
  core --> util[03 util 组合子]
  core --> mw[04 单服务中间件]
  util --> retry[05 重试]
  mw --> retry
  mw --> balance[06 负载均衡]
  util --> balance
  retry --> testing[07 测试]
  balance --> testing
  testing --> design[08 设计取舍]
  design --> pit[09 常见坑]
  pit --> site[10 在本站中]
  site --> hands[11 动手]

从「导读」开始。只想会用 tower 的读者,读 01、02、03、09 四部分;想读懂实现的,按顺序读。tower 的中间件大量借用 tokio 的 Semaphore、mpsc、oneshot、Sleep,讲到时链回 tokio 卷,不重复讲原语本身。

HTTP 专用的中间件(压缩、CORS、Trace、ServeDir 等)不在 tower 仓库里,在同组织的 tower-http,单独成卷:tower-http 卷。

💬 关联讨论

发起讨论
加载中...