中间件
axum 没有自己的中间件 trait,Router::layer 收的就是 tower 的 Layer,所以 tower 和 tower-http 的中间件可以直接用。axum 自己加了两样东西:决定 layer 套在路由树的哪些位置(每条路由、方法级 fallback、全局 fallback),以及 axum::middleware 里把普通 async fn 变成 Layer 的几个函数。Service、Layer、ServiceBuilder 本身在 tower 卷,这一部分只讲 axum 这一侧。
- layer 与 route_layer:
Router::layer只套调用时已有的路由和 fallback,中间件在路由之后执行;Router::route_layer跳过 404 却仍套住 405,MethodRouter::route_layer两者都跳过;Handler::layer每个请求重套一遍;中间件的错误必须能转成Infallible,否则配HandleErrorLayer。 - from_fn 与它的兄弟:
FromFn::call先跑提取器、再把内层装箱成Next;from_fn_with_state的状态与路由器无关;map_request能提前结束、map_response不能;from_extractor丢掉提取结果;每层from_fn每个请求的分配次数实测。
flowchart TB lay["tower Layer"] --> rl["Router::layer"] lay --> rr["route_layer"] lay --> ml["MethodRouter::layer"] lay --> hl["Handler::layer"] fnmw["from_fn 一族"] --> lay rl --> routes["每条路由与 fallback"] rr --> only["只套匹配到的路径"]
中间件放在 tower-http 里的那些(压缩、静态文件、超时、CORS 等)在下一部分 tower-http。
💬 关联讨论
发起讨论加载中...