企业级架构与设计模式
原理
企业级 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::broadcast 或 flume 的多生产者多消费者 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 自检
- 分层架构 vs 六边形架构的区别?为何 trait-based 端口更适合 Rust?
- 状态机模式在 Rust 中如何通过
enum确保所有转换的穷尽性?