Rust 服务端项目分层结构

发布于:2025-06-26 ⋅ 阅读:(19) ⋅ 点赞:(0)

DDD

src/
├── main.rs              # 程序入口,负责启动和依赖注入
├── lib.rs               # 公共库入口,便于单元测试和复用
├── config.rs            # 配置管理(如数据库、端口、环境变量等)
├── entities/            # 数据库实体(ORM模型)
│   ├── mod.rs
│   └── user.rs
├── schema.rs            # 数据库表结构(如 diesel/sea-orm 生成)
├── repository/          # 数据访问层(Repository模式,封装数据库操作)
│   ├── mod.rs
│   └── user_repo.rs
├── service/             # 业务逻辑层(Service/Usecase)
│   ├── mod.rs
│   └── user_service.rs
├── api/                 # 接口层(HTTP/WebSocket/TCP等协议的 handler)
│   ├── mod.rs
│   └── user_handler.rs
├── error.rs             # 统一错误类型和处理
├── utils/               # 工具类/通用模块
│   └── logger.rs
└── tests/               # 集成测试
    └── ...

当然可以!下面给你一个**典型且规范的 Rust 服务端项目分层结构**,适合中大型项目,易于维护和扩展。  
这种分层思想借鉴了 DDD(领域驱动设计)和主流 Web 框架(如 actix-web、axum)的最佳实践。

---

目录结构示例

src/
├── main.rs              # 程序入口,负责启动和依赖注入
├── lib.rs               # 公共库入口,便于单元测试和复用
├── config.rs            # 配置管理(如数据库、端口、环境变量等)
├── entities/            # 数据库实体(ORM模型)
│   ├── mod.rs
│   └── user.rs
├── schema.rs            # 数据库表结构(如 diesel/sea-orm 生成)
├── repository/          # 数据访问层(Repository模式,封装数据库操作)
│   ├── mod.rs
│   └── user_repo.rs
├── service/             # 业务逻辑层(Service/Usecase)
│   ├── mod.rs
│   └── user_service.rs
├── api/                 # 接口层(HTTP/WebSocket/TCP等协议的 handler)
│   ├── mod.rs
│   └── user_handler.rs
├── error.rs             # 统一错误类型和处理
├── utils/               # 工具类/通用模块
│   └── logger.rs
└── tests/               # 集成测试
    └── ...

---

## 2. 各层职责说明

- **main.rs**  
  只负责程序启动、配置加载、依赖注入、路由注册,不写业务逻辑。

- **config.rs**  
  负责读取和管理配置(如数据库连接、端口、环境变量等)。

- **entities/**  
  定义数据库表结构和数据模型(Model),只做数据结构描述,不包含业务逻辑。

- **repository/**  
  封装所有数据库操作(CRUD),对上层隐藏具体 ORM 实现,便于后续切换数据库或重构。

- **service/**  
  业务逻辑层,处理具体业务流程,调用 repository 层,聚合/编排数据。

- **api/**  
  对外接口层,处理 HTTP/WebSocket/TCP 请求,参数校验、响应封装,调用 service 层。

- **error.rs**  
  定义统一的错误类型,实现 From/Into,便于全局错误处理。

- **utils/**  
  放置日志、加解密、通用工具函数等。

- **tests/**  
  集成测试,模拟真实请求,保证各层协作无误。

---

## 3. 代码示例(简化版)

### main.rs

```rust
fn main() {
    // 加载配置
    let config = config::load();
    // 初始化日志
    utils::logger::init();
    // 初始化数据库连接池
    let db = repository::init_db(&config.db_url);
    // 启动 HTTP 服务
    api::start_server(db, config.server_port);
}
```

### api/user_handler.rs

```rust
pub async fn get_user_handler(
    db: DbPool,
    user_id: i32,
) -> Result<Json<UserDto>, AppError> {
    let user = service::user_service::get_user_by_id(&db, user_id).await?;
    Ok(Json(user.into()))
}
```

### service/user_service.rs

```rust
pub async fn get_user_by_id(
    db: &DbPool,
    user_id: i32,
) -> Result<User, AppError> {
    repository::user_repo::find_by_id(db, user_id).await
}
```

### repository/user_repo.rs

```rust
pub async fn find_by_id(
    db: &DbPool,
    user_id: i32,
) -> Result<User, AppError> {
    // ORM 查询
}
```

---

## 4. 规范建议

- 每层只做自己该做的事,**不跨层调用**。
- 业务逻辑尽量不写在 handler(api)里,方便测试和复用。
- 错误类型统一,便于全局处理和日志记录。
- 配置、日志、工具函数独立,便于维护。
- 目录和文件命名清晰,见名知意。

---

## 5. 参考项目

- [actix-web 官方示例](https://github.com/actix/examples)
- [axum 官方示例](https://github.com/tokio-rs/axum/tree/main/examples)
- [SeaORM 项目结构建议](https://www.sea-ql.org/SeaORM/docs/guides/project-structure/)

---

MVCS架构

src/
├── main.rs                # 程序入口
├── config.rs              # 配置管理
├── db.rs                  # 数据库连接和初始化
├── error.rs               # 错误类型
├── models/                # Model:数据结构和数据库实体
│   ├── mod.rs
│   └── user.rs
├── views/                 # View:响应渲染(DTO/模板等)
│   ├── mod.rs
│   └── user_view.rs
├── controllers/           # Controller:路由与流程控制
│   ├── mod.rs
│   └── user_controller.rs
├── services/              # Service:业务逻辑层
│   ├── mod.rs
│   └── user_service.rs
├── repository/            # Repository:数据访问层(可选,复杂项目建议加)
│   ├── mod.rs
│   └── user_repo.rs
├── utils/                 # 工具类
│   └── logger.rs
└── tests/                 # 集成测试
    └── ...

2. 各层职责

  • Model(models/)

数据结构、数据库实体(ORM Model),只负责数据定义和转换。

  • View(views/)

响应渲染(如 JSON/HTML/DTO),只做数据格式转换。

  • Controller(controllers/)

路由注册、参数校验、调用 Service 层,组织业务流程,不直接操作数据库。

  • Service(services/)

业务逻辑实现,聚合/编排数据,调用 Repository 层。

  • Repository(repository/)(可选)

封装数据库操作,便于后续切换数据库或重构。


网站公告

今日签到

点亮在社区的每一天
去签到