请求管线
Boot 为 HTTP、WebSocket 和消息传输提供一致的执行概念,并为每种协议保留专属上下文与响应类型。
HTTP 执行顺序
同类组件按应用级、Module、Controller、Route 的声明拓扑组合。显式顺序是 API 契约,不应让组件依赖未声明的全局副作用。
每个阶段的职责
注册全局组件
Controller 和 Route 可以通过 #[use_guard]、#[use_interceptor]、#[use_pipe] 与 #[use_filter] 添加局部组件。#[apply_decorators(...)] 可以组合一组经过复用的属性。
需要从 DI 容器解析 application-wide enhancer 时,把对应 Provider 声明为 HTTP、WebSocket 或 transport enhancer。Provider-backed enhancer 支持 scope bubbling,并在每次调用的 context 中解析。直接传给 builder 的值不会从 Module 注入依赖。
Around Interceptor
Interceptor 接收 CallHandler,因此可以:
- 在下游之前与之后执行逻辑
- 不调用
next并直接短路 - 转换成功响应
- 恢复某类错误
- 多次调用
next.handle()实现顺序重试或 timeout wrapper
重试具有 at-least-once 语义。Provider 内部状态、日志、数据库写入和外部副作用不会自动回滚。只对明确可重放的操作启用重试,并为副作用使用幂等键。
Filter 只收到 Interceptor 未恢复的错误。局部 Filter 比全局 Filter 更接近 handler,catch_errors(...) 或 #[catch] 可以按 BootErrorKind 限定处理范围。
协议中立与协议专属
ExecutionContext 暴露协议种类和共用 metadata,适合跨 HTTP、WebSocket 与 transport 的 Guard 或 Interceptor。协议专属组件使用:
只有真正共享策略时才使用 protocol-neutral enhancer。WebSocket room、message acknowledgement 或 HTTP header 仍应留在协议专属层。
Middleware Consumer
Module 的 configure 可以使用 MiddlewareConsumer 选择 include 与 exclude route。它适合只对一组 Controller 应用日志、兼容处理或请求标记,同时避免在 handler 中重复分支。
错误边界
- 适配器验证在 Middleware 和 handler 执行前完成。
- Guard 返回拒绝时不会进入 handler。
- Pipe 与 Validation 错误进入同一 Filter 链。
- Interceptor 恢复后的结果不会再交给 Filter。
- 没有 Filter 接管时,Boot 使用稳定的默认错误响应。
继续在验证与序列化中配置 DTO 边界。