企业级架构与设计模式

原理

企业级 Rust 应用的推荐架构模式:

分层架构(Layered Architecture):

handler (HTTP/gRPC) → service (业务逻辑) → repository (数据访问)

每层仅依赖其下层。handler 负责序列化/验证,service 纯业务逻辑(无 IO),repository 封装数据库/外部服务调用。

六边形架构(Hexagonal/Ports & Adapters):业务核心定义 trait(port),IO 实现(adapter)注入。测试时 mock 这些 trait。

依赖注入:通过 trait 定义接口,dyn Trait 或泛型 <T: Trait> 注入。框架不必要——手动 DI 足够清晰。

事件驱动:使用 tokio::sync::broadcastflume 的多生产者多消费者 channel 实现发布/订阅模式。

状态机模式:用 enum 定义状态,match 穷尽转换,结构体持有当前状态枚举值。


语法

// 分层架构
mod handler {   // HTTP 请求处理
    pub async fn create_user(Json(payload): Json<CreateUserReq>)
        -> Result<Json<User>, AppError> { ... }
}
 
mod service {   // 纯业务逻辑
    pub fn create_user(repo: &impl UserRepo, req: CreateUserReq)
        -> Result<User, ServiceError> { ... }
}
 
mod repository { // 数据访问
    #[async_trait]
    pub trait UserRepo {
        async fn insert(&self, user: User) -> Result<(), DbError>;
        async fn find_by_id(&self, id: Uuid) -> Result<User, DbError>;
    }
}
// 状态机模式
enum Connection {
    Disconnected,
    Connecting { retries: u32 },
    Connected { session_id: Uuid },
    Failed(String),
}
 
impl Connection {
    fn next(self, event: Event) -> Self {
        match (self, event) {
            (Self::Disconnected, Event::Connect) =>
                Self::Connecting { retries: 0 },
            (Self::Connecting { retries }, Event::Timeout) if retries < 3 =>
                Self::Connecting { retries: retries + 1 },
            (Self::Connecting { .. }, Event::Authenticated(id)) =>
                Self::Connected { session_id: id },
            _ => self,
        }
    }
}

实践

AI 自检

  1. 分层架构 vs 六边形架构的区别?为何 trait-based 端口更适合 Rust?
  2. 状态机模式在 Rust 中如何通过 enum 确保所有转换的穷尽性?