这部分是 Axum 和别家差异最大的一章。
Axum 官方文档一直强调:
Axum 不用自己独立的 middleware 体系,而是直接接入 tower::Service。
这意味着:
tower的 Layer 可以直接套上来tower-http的TraceLayer、CorsLayer、压缩、超时、请求校验都能直接用- 你写给 Axum 的很多中间件思路,也能和
hyper/tonic共享
这可以翻译成一句很工程的话:
Axum 的安检带是工业标准件,不是私有定制件。
一个典型组合写法:
[dependencies]
tower = "0.5.3"
tower-http = { version = "0.6.8", features = ["trace", "cors"] }use axum::{routing::get, Router};
use tower::ServiceBuilder;
use tower_http::{cors::CorsLayer, trace::TraceLayer};
let app = Router::new()
.route("/health", get(health))
.layer(
ServiceBuilder::new()
.layer(TraceLayer::new_for_http())
.layer(CorsLayer::permissive())
);这张图很好记:
请求车
│
▼
TraceLayer -> 记录通关轨迹
│
▼
CorsLayer -> 检查跨域放行规则
│
▼
Router -> 找窗口
│
▼
Handler -> 真正办事