Rust in Everything
基于 tower-http 0.7.1

共同骨架

tower-http 有二十多个中间件,读过两三个就会发现它们长得几乎一样。这一部分把共同的部分抽出来讲一次,后面的模块页就只讲各自不同的地方。

  1. Layer、Service、ResponseFuture、ResponseBody:几乎每个模块都是这四件;只在 call 时动手的模块连 ResponseFuture 都省了。poll_ready 全部转发、Error 全部是 S::Error 的统计;短路的模块用枚举同时装「内层 future」和「现成的响应」,并因此要求响应 body 实现 Default,这一条会让层的顺序影响能不能编译。三个内部宏。
  2. ServiceBuilderExt 与 ServiceExt:给 tower::ServiceBuilder 加的 26 个方法,哪些模块没有快捷方法;ServiceBuilder::timeout 其实是 tower 的;0.6.4 的 ServiceExt 为什么对任何类型都实现,以及两个 trait 同时导入时的方法歧义。
  3. body 模块:为什么自己包一层 Full、Limited、UnsyncBoxBody;只在哪几个 feature 下编译;条件加层时的类型错误和 0.7.0 的 UnsyncBoxBody::new。
flowchart TB
  layer["XxxLayer:存配置"] --> svc["Xxx<S>:call 时动手"]
  svc --> fut["ResponseFuture:响应 future 完成时动手"]
  fut --> body["ResponseBody:body 流动时动手"]
  svc -.->|短路| kind["Kind 枚举:内层 future 或现成响应"]
  ext["ServiceBuilderExt / ServiceExt"] --> layer
  bodymod["body 模块"] --> body

第 1 章是全卷的地基:后面每个模块页开头的「主线位置」,说的就是这四件里它实现了哪几件。

💬 关联讨论

发起讨论
加载中...