用途:为 Axum 应用通过 tower 与 tower-http 添加中间件。Axum 中一切可路由对象都是 tower::Service,因此可直接复用 tower 与 tower-http 生态;中间件即包装 Service 的 tower::Layer。
主要能力:覆盖 Service 与 Layer 两个 trait、ServiceBuilder 顺序规则、常用 tower-http 层及其 Cargo feature、CorsLayer 配置与限流。涉及 TraceLayer、CorsLayer、CompressionLayer、TimeoutLayer、RequestBodyLimitLayer、ServeDir/ServeFile 等。tower-http 中间件默认关闭,每个层需启用对应 feature(如 trace、cors、timeout、limit、fs;compression 需 compression-gzip/-br/-deflate/-zstd 或 compression-full;full 可一次启用全部)。
使用方式:建议用单个 ServiceBuilder 构建全局中间件栈并通过一次 .layer() 应用,最外层先写;ServiceBuilder 与堆叠 Router::layer() 的顺序方向相反。CORS 生产环境用 CorsLayer::new() 加显式 .allow_origin(...) 白名单,不要用 permissive/very_permissive,也不要将 allow_credentials(true) 与通配符 Any 源组合。限流方面没有官方 tower-http 限流层:粗粒度全局并发用 tower::limit::ConcurrencyLimitLayer,全局速率用 RateLimitLayer(须包在 tower::buffer::Buffer 中,因其服务非 Clone);按客户端/按 IP 的生产限流用 tower_governor 的 GovernorLayer,其 API 对版本敏感,使用前需核对最新文档。手写 Service 时必须先将 poll_ready 驱动到 Poll::Ready(Ok(())) 再调用 call。
适用场景:Axum 0.7/0.8 应用的中间件栈搭建、CORS 与限流配置。限制:.layer() 在路由上的放置(先注册路由、.layer() 与 .route_layer() 区别)由 axum-impl-middleware 负责,本技能不重复讲解;RequestBodyLimitLayer 需与 DefaultBodyLimit::disable() 配合设置硬上限,避免内存耗尽型 DoS。具体版本细节与完整示例见其 references 文档。