mcpField
D
domain-web

domain-web

github.com/actionbook开发1.6k3.2k 次安装9 周前更新
代码仓库

关于 domain-web

domain-web 是用于设计 Rust Web 应用的技能,关注异步处理器、线程安全状态、请求生命周期、验证和可观测性,并介绍实现这些约束的框架、crate 与模式。

主要功能

  1. 01异步非阻塞处理器
  2. 02线程安全的共享应用状态
  3. 03按请求管理资源生命周期
  4. 04验证请求数据的提取器
  5. 05统一错误响应
  6. 06使用 tracing 与 Tower 中间件

适用场景

  1. 01设计避免阻塞的 HTTP 处理器
  2. 02在处理器线程间共享应用状态
  3. 03验证传入的请求数据
  4. 04用中间件组织横切逻辑

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/actionbook/rust-skills --skill domain-web

安装后在 Claude Code 中输入/domain-web确认已加载。

详细介绍

Web Domain

第 3 层:领域约束

领域约束 → 设计影响

领域规则设计约束Rust 影响
无状态 HTTP不使用请求局部全局变量在提取器中存储状态
并发处理大量连接异步、Send + Sync
延迟 SLA快速响应高效的所有权管理
安全输入验证类型安全的提取器
可观测性请求追踪tracing + tower 层

关键约束

默认采用异步
RULE: Web handlers must not block
WHY: Block one task = block many requests
RUST: async/await, spawn_blocking for CPU work
状态管理
RULE: Shared state must be thread-safe
WHY: Handlers run on any thread
RUST: Arc<T>, Arc<RwLock<T>> for mutable
请求生命周期
RULE: Resources live only for request duration
WHY: Memory management, no leaks
RUST: Extractors, proper ownership

向下追溯 ↓

从约束追溯到设计(第 2 层):

"Need shared application state"
    ↓ m07-concurrency: Use Arc for thread-safe sharing
    ↓ m02-resource: Arc<RwLock<T>> for mutable state

"Need request validation"
    ↓ m05-type-driven: Validated extractors
    ↓ m06-error-handling: IntoResponse for errors

"Need middleware stack"
    ↓ m12-lifecycle: Tower layers
    ↓ m04-zero-cost: Trait-based composition

框架比较

框架风格最适合
axum函数式、tower现代 API
actix-web基于 Actor高性能
warp过滤器组合可组合的 API
rocket宏驱动快速开发

关键 Crate

用途Crate
HTTP 服务端axum、actix-web
HTTP 客户端reqwest
JSONserde_json
身份验证/JWTjsonwebtoken
会话tower-sessions
数据库sqlx、diesel
中间件tower

设计模式

模式用途实现
提取器请求解析State(db)、Json(payload)
错误响应统一错误impl IntoResponse
中间件横切关注点Tower 层
共享状态应用配置Arc<AppState>

代码模式:Axum 处理器

async fn handler(
    State(db): State<Arc<DbPool>>,
    Json(payload): Json<CreateUser>,
) -> Result<Json<User>, AppError> {
    let user = db.create_user(&payload).await?;
    Ok(Json(user))
}

// Error handling
impl IntoResponse for AppError {
    fn into_response(self) -> Response {
        let (status, message) = match self {
            Self::NotFound => (StatusCode::NOT_FOUND, "Not found"),
            Self::Internal(_) => (StatusCode::INTERNAL_SERVER_ERROR, "Internal error"),
        };
        (status, Json(json!({"error": message}))).into_response()
    }
}

常见错误

错误违反的领域约束修正方法
在处理器中阻塞延迟激增spawn_blocking
在状态中使用 Rc不满足 Send + Sync使用 Arc
未进行验证安全风险使用类型安全的提取器
没有错误响应用户体验差实现 IntoResponse

追溯到第 1 层

约束第 2 层模式第 1 层实现
异步处理器Async/awaittokio 运行时
线程安全的状态共享状态Arc、Arc<RwLock>
请求生命周期提取器通过 From 实现所有权
中间件Tower 层基于 Trait 的组合

相关技能

场景参阅
异步模式m07-concurrency
状态管理m02-resource
错误处理m06-error-handling
中间件设计m12-lifecycle

评论

支持 Markdown