Rust + Actix + MongoDB:高性能 API 服务器完整构建指南

作者:API传播员 · 2025-09-27 · 阅读时间:7分钟

本文将详细介绍如何使用 Rust 和 Actix 框架RESTful API,并掌握 Rust 在构建高性能网络服务中的优势。


为什么选择 Rust?

在构建现代 API 服务器时,TypeScript、Go 和 Rust 是当前社区中最受欢迎的三种语言。它们各有优缺点:

  • TypeScript:生产效率高,但性能相对较差。
  • Go:在生产效率和性能之间取得平衡。
  • Rust:性能最佳,但开发效率较低。

尽管 Rust 的学习曲线较陡,但它的类型安全性和高性能使其成为构建高效、可靠 API 服务器的绝佳选择。

类型安全

在 TypeScript 中,开发者可能会忽略对请求体或第三方数据源的详细类型定义。而 Rust 的类型系统则强制开发者为所有数据类型提供完整的定义,或者明确选择使用通用类型(如 serde_json 中的 Value 类型)。这种严格的类型检查极大地降低了运行时错误的可能性。

执行速度

Rust 的执行速度接近 C 和 C++,并且由于没有垃圾回收机制,其内存管理更加高效。这种高性能特性使得 Rust 应用在垂直扩展时比 Node.js 更具优势,从而降低了基础设施的成本和复杂性。

开发效率

虽然 Rust 的开发效率可能不如 TypeScript,但在某些场景下,Rust 的优势反而更明显。例如,在 Rust 中使用 MongoDB 不需要额外的库(如 Mongoose),这简化了开发流程。此外,Rust 的高类型安全性可以减少代码维护成本,从长远来看提高了整体生产力。


为什么选择 MongoDB?

在本教程中,我们选择 MongoDB 作为数据库,原因如下:

  1. 快速设置:相比 PostgreSQL 等 SQL 数据库,MongoDB 的设置更为简单。
  2. 类型安全性:Rust 的类型系统为 MongoDB 的无模式设计提供了额外的安全性和可预测性。

如果您需要手动安装 MongoDB,可以参考其官方安装指南


项目目标

我们将构建一个用于管理遛狗预约的 API。以下是项目的主要数据结构和功能:

数据结构

  1. :记录宠物的名字、年龄和品种。
  2. 主人:记录主人的姓名、地址和联系方式。
  3. 预约:记录预约的开始时间、持续时间以及相关的主人信息。

API 功能

  • POST /owner:添加主人信息。
  • POST /dog:为指定主人添加宠物信息。
  • POST /booking:为指定主人创建预约。
  • GET /booking:获取所有未来的预约,按时间排序。
  • PUT /booking/{id}/cancel:取消指定预约。

通过这些功能,您将能够轻松管理遛狗预约,并为后续功能扩展打下基础。


环境准备

在开始之前,请确保您的系统已安装 Rust 和 Cargo。运行以下命令检查安装情况:

rustc --version
cargo --version

创建新项目

使用 Cargo 创建一个新的 Rust 项目:

cargo new rust-web-server-tutorial

接着,打开项目目录下的 Cargo.toml 文件,并添加以下依赖项:

  • Actix:用于构建高性能 HTTP 服务器。
  • MongoDB:连接和操作 MongoDB 数据库。
  • Serde:用于序列化和反序列化数据。
  • Chrono:处理日期和时间。
  • Futures-util:处理异步流。

在项目的入口文件 main.rs 中,添加一个简单的 HTTP 服务器示例,并绑定到 http://localhost:5001


快速开发和调试

在开发过程中,您可以使用以下命令实时监控代码更改并自动运行项目:

cargo watch -c -w src -x run

其中:

  • -c:清除屏幕。
  • -w src:仅监控 src 目录中的文件。
  • -x run:在检测到更改时运行项目。

访问 http://localhost:5001,您应该会看到返回的文本“Hello Medium!”。


文件结构设置

为了更好地组织代码,我们将项目划分为以下三个主要模块:

  1. models:定义数据库和 HTTP 请求中使用的数据结构。
  2. routes:定义 API 路由及其处理逻辑。
  3. services:处理数据库连接和操作。

项目的文件结构如下:

rust-web-server-tutorial/
└── src/
├── main.rs
├── models/
│ ├── booking_model.rs
│ ├── dog_model.rs
│ ├── mod.rs
│ └── owner_model.rs
├── routes/
│ ├── booking_route.rs
│ ├── dog_route.rs
│ ├── mod.rs
│ └── owner_route.rs
└── services/
├── db.rs
└── mod.rs

可以通过以下命令快速生成这些文件和目录:

cd src && 
mkdir models routes services && 
touch models/booking_model.rs models/dog_model.rs models/mod.rs models/owner_model.rs && 
touch routes/booking_route.rs routes/dog_route.rs routes/mod.rs routes/owner_route.rs && 
touch services/db.rs services/mod.rs && 
cd ..

定义数据模型

预订模型

定义 Booking 数据结构,用于表示数据库中的预约记录。同时,为了简化用户请求,我们创建了 BookingRequest 结构体,并实现了 TryFrom 特性以支持数据转换。

主人模型

定义 Owner 数据结构,包含主人的姓名、地址和联系方式。某些字段(如电子邮件)可能是可选的,因此使用了 Option 类型。

狗模型

定义 Dog 数据结构,记录宠物的基本信息。

mod.rs 文件中公开这些模型,以便在其他模块中使用。


数据库服务

services/db.rs 文件中,定义一个 Database 结构体,用于管理 MongoDB 的连接和操作。通过 init 方法初始化数据库连接,并实现以下功能:

  1. 创建记录:支持添加主人、宠物和预约。
  2. 取消预约:更新预约状态为已取消。
  3. 获取预约:通过 MongoDB 的聚合操作获取完整的预约数据。

添加 HTTP 路由

routes 目录下,为每个功能模块创建对应的路由文件,并实现以下端点:

  1. 狗路由:处理宠物相关的 API 请求。
  2. 主人路由:处理主人相关的 API 请求。
  3. 预约路由:处理预约的创建、查询和取消。

mod.rs 文件中公开这些路由,并在 main.rs 中将其连接到 HTTP 服务器。


测试和验证

使用 Postman 或 cURL 测试 API。例如:

curl -X POST http://localhost:5001/owner -H "Content-Type: application/json" -d '{"name": "John Doe", "address": "123 Main St"}'

通过这些测试,确保 API 的功能正常运行。


总结

通过本教程,您学习了如何使用 Rust 和 Actix 构建一个高性能的 API 服务器,并结合 MongoDB 实现数据存储。虽然 Rust 的学习曲线较陡,但其高性能和类型安全性使其成为构建可靠网络服务的理想选择。

原文链接: https://www.bretcameron.com/blog/how-to-build-an-api-server-with-rust