共同骨架
tower-http 有二十多个中间件,读过两三个就会发现它们长得几乎一样。这一部分把共同的部分抽出来讲一次,后面的模块页就只讲各自不同的地方。
- Layer、Service、ResponseFuture、ResponseBody:几乎每个模块都是这四件;只在
call时动手的模块连ResponseFuture都省了。poll_ready全部转发、Error全部是S::Error的统计;短路的模块用枚举同时装「内层 future」和「现成的响应」,并因此要求响应 body 实现Default,这一条会让层的顺序影响能不能编译。三个内部宏。 - ServiceBuilderExt 与 ServiceExt:给
tower::ServiceBuilder加的 26 个方法,哪些模块没有快捷方法;ServiceBuilder::timeout其实是 tower 的;0.6.4 的ServiceExt为什么对任何类型都实现,以及两个 trait 同时导入时的方法歧义。 - 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 章是全卷的地基:后面每个模块页开头的「主线位置」,说的就是这四件里它实现了哪几件。
💬 关联讨论
发起讨论加载中...