domain-web

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Web Domain

Web 领域

Layer 3: Domain Constraints
第3层:领域约束

Domain Constraints → Design Implications

领域约束 → 设计影响

Domain RuleDesign ConstraintRust Implication
Stateless HTTPNo request-local globalsState in extractors
ConcurrencyHandle many connectionsAsync, Send + Sync
Latency SLAFast responseEfficient ownership
SecurityInput validationType-safe extractors
ObservabilityRequest tracingtracing + 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 work
RULE: Web handlers must not block
WHY: Block one task = block many requests
RUST: async/await, spawn_blocking for CPU work

State Management

状态管理

RULE: Shared state must be thread-safe
WHY: Handlers run on any thread
RUST: Arc<T>, Arc<RwLock<T>> for mutable
RULE: Shared state must be thread-safe
WHY: Handlers run on any thread
RUST: Arc<T>, Arc<RwLock<T>> for mutable

Request Lifecycle

请求生命周期

RULE: Resources live only for request duration
WHY: Memory management, no leaks
RUST: Extractors, proper ownership

RULE: Resources live only for request duration
WHY: Memory management, no leaks
RUST: Extractors, proper ownership

Trace 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 composition

Framework Comparison

框架对比

FrameworkStyleBest For
axumFunctional, towerModern APIs
actix-webActor-basedHigh performance
warpFilter compositionComposable APIs
rocketMacro-drivenRapid development
框架风格适用场景
axum函数式、基于tower现代API
actix-web基于Actor模型高性能场景
warp过滤器组合可组合API
rocket宏驱动快速开发

Key Crates

核心依赖库

PurposeCrate
HTTP serveraxum, actix-web
HTTP clientreqwest
JSONserde_json
Auth/JWTjsonwebtoken
Sessiontower-sessions
Databasesqlx, diesel
Middlewaretower
用途依赖库
HTTP服务器axum, actix-web
HTTP客户端reqwest
JSON处理serde_json
身份验证/JWTjsonwebtoken
会话管理tower-sessions
数据库sqlx, diesel
中间件tower

Design Patterns

设计模式

PatternPurposeImplementation
ExtractorsRequest parsing
State(db)
,
Json(payload)
Error responseUnified errors
impl IntoResponse
MiddlewareCross-cuttingTower layers
Shared stateApp config
Arc<AppState>
模式用途实现方式
提取器请求解析
State(db)
,
Json(payload)
错误响应统一错误处理
impl IntoResponse
中间件横切关注点处理Tower 层
共享状态应用配置
Arc<AppState>

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

常见错误

MistakeDomain ViolationFix
Blocking in handlerLatency spikespawn_blocking
Rc in stateNot Send + SyncUse Arc
No validationSecurity riskType-safe extractors
No error responseBad UXIntoResponse impl

错误违反的领域规则修复方案
处理器中阻塞操作延迟突增使用spawn_blocking
状态中使用Rc不满足Send + Sync使用Arc
无输入验证安全风险使用类型安全的提取器
无统一错误响应糟糕的用户体验实现IntoResponse

Trace to Layer 1

追溯到第1层

ConstraintLayer 2 PatternLayer 1 Implementation
Async handlersAsync/awaittokio runtime
Thread-safe stateShared stateArc<T>, Arc<RwLock<T>>
Request lifecycleExtractorsOwnership via From<Request>
MiddlewareTower layersTrait-based composition

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

Related Skills

相关技能

WhenSee
Async patternsm07-concurrency
State managementm02-resource
Error handlingm06-error-handling
Middleware designm12-lifecycle
场景参考内容
异步模式m07-concurrency
状态管理m02-resource
错误处理m06-error-handling
中间件设计m12-lifecycle