domain-web
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseWeb Domain
Web 领域
Layer 3: Domain Constraints
第3层:领域约束
Domain Constraints → Design Implications
领域约束 → 设计影响
| Domain Rule | Design Constraint | Rust Implication |
|---|---|---|
| Stateless HTTP | No request-local globals | State in extractors |
| Concurrency | Handle many connections | Async, Send + Sync |
| Latency SLA | Fast response | Efficient ownership |
| Security | Input validation | Type-safe extractors |
| Observability | Request tracing | tracing + tower layers |
| 领域规则 | 设计约束 | Rust 实现方案 |
|---|---|---|
| 无状态HTTP | 无请求本地全局变量 | 使用提取器管理状态 |
| 并发处理 | 处理大量连接 | 异步编程、Send + Sync |
| 延迟SLA | 快速响应 | 高效所有权管理 |
| 安全性 | 输入验证 | 类型安全的提取器 |
| 可观测性 | 请求追踪 | tracing + tower 层 |
Critical Constraints
关键约束
Async by Default
默认异步
RULE: Web handlers must not block
WHY: Block one task = block many requests
RUST: async/await, spawn_blocking for CPU workRULE: Web handlers must not block
WHY: Block one task = block many requests
RUST: async/await, spawn_blocking for CPU workState Management
状态管理
RULE: Shared state must be thread-safe
WHY: Handlers run on any thread
RUST: Arc<T>, Arc<RwLock<T>> for mutableRULE: Shared state must be thread-safe
WHY: Handlers run on any thread
RUST: Arc<T>, Arc<RwLock<T>> for mutableRequest Lifecycle
请求生命周期
RULE: Resources live only for request duration
WHY: Memory management, no leaks
RUST: Extractors, proper ownershipRULE: Resources live only for request duration
WHY: Memory management, no leaks
RUST: Extractors, proper ownershipTrace Down ↓
向下追溯 ↓
From constraints to design (Layer 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从约束到设计(第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 compositionFramework Comparison
框架对比
| Framework | Style | Best For |
|---|---|---|
| axum | Functional, tower | Modern APIs |
| actix-web | Actor-based | High performance |
| warp | Filter composition | Composable APIs |
| rocket | Macro-driven | Rapid development |
| 框架 | 风格 | 适用场景 |
|---|---|---|
| axum | 函数式、基于tower | 现代API |
| actix-web | 基于Actor模型 | 高性能场景 |
| warp | 过滤器组合 | 可组合API |
| rocket | 宏驱动 | 快速开发 |
Key Crates
核心依赖库
| Purpose | Crate |
|---|---|
| HTTP server | axum, actix-web |
| HTTP client | reqwest |
| JSON | serde_json |
| Auth/JWT | jsonwebtoken |
| Session | tower-sessions |
| Database | sqlx, diesel |
| Middleware | tower |
| 用途 | 依赖库 |
|---|---|
| HTTP服务器 | axum, actix-web |
| HTTP客户端 | reqwest |
| JSON处理 | serde_json |
| 身份验证/JWT | jsonwebtoken |
| 会话管理 | tower-sessions |
| 数据库 | sqlx, diesel |
| 中间件 | tower |
Design Patterns
设计模式
| Pattern | Purpose | Implementation |
|---|---|---|
| Extractors | Request parsing | |
| Error response | Unified errors | |
| Middleware | Cross-cutting | Tower layers |
| Shared state | App config | |
| 模式 | 用途 | 实现方式 |
|---|---|---|
| 提取器 | 请求解析 | |
| 错误响应 | 统一错误处理 | |
| 中间件 | 横切关注点处理 | Tower 层 |
| 共享状态 | 应用配置 | |
Code Pattern: Axum Handler
代码示例:Axum 处理器
rust
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()
}
}rust
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()
}
}Common Mistakes
常见错误
| Mistake | Domain Violation | Fix |
|---|---|---|
| Blocking in handler | Latency spike | spawn_blocking |
| Rc in state | Not Send + Sync | Use Arc |
| No validation | Security risk | Type-safe extractors |
| No error response | Bad UX | IntoResponse impl |
| 错误 | 违反的领域规则 | 修复方案 |
|---|---|---|
| 处理器中阻塞操作 | 延迟突增 | 使用spawn_blocking |
| 状态中使用Rc | 不满足Send + Sync | 使用Arc |
| 无输入验证 | 安全风险 | 使用类型安全的提取器 |
| 无统一错误响应 | 糟糕的用户体验 | 实现IntoResponse |
Trace to Layer 1
追溯到第1层
| Constraint | Layer 2 Pattern | Layer 1 Implementation |
|---|---|---|
| Async handlers | Async/await | tokio runtime |
| Thread-safe state | Shared state | Arc<T>, Arc<RwLock<T>> |
| Request lifecycle | Extractors | Ownership via From<Request> |
| Middleware | Tower layers | Trait-based composition |
| 约束 | 第2层模式 | 第1层实现 |
|---|---|---|
| 异步处理器 | Async/await | tokio 运行时 |
| 线程安全状态 | 共享状态 | Arc<T>, Arc<RwLock<T>> |
| 请求生命周期 | 提取器 | 通过From<Request>实现所有权管理 |
| 中间件 | Tower 层 | 基于 trait 的组合 |
Related Skills
相关技能
| When | See |
|---|---|
| Async patterns | m07-concurrency |
| State management | m02-resource |
| Error handling | m06-error-handling |
| Middleware design | m12-lifecycle |
| 场景 | 参考内容 |
|---|---|
| 异步模式 | m07-concurrency |
| 状态管理 | m02-resource |
| 错误处理 | m06-error-handling |
| 中间件设计 | m12-lifecycle |