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 卷。
💬 关联讨论
发起讨论加载中...