Xây dựng API với Rust và Axum – Phần 1: Khởi tạo & Thiết lập dự án


Trong bối cảnh phát triển backend nhanh chóng ngày nay, Rust đang ngày càng được ưa chuộng nhờ hiệu suất, tính an toàn và hệ sinh thái đang phát triển. Trong loạt bài viết này, chúng tôi sẽ hướng dẫn cách xây dựng một API hiện đại, có khả năng mở rộng và dễ bảo trì bằng Axum , SeaORM và Rust. Chúng tôi sẽ sử dụng dự án API CMS mã nguồn mở của tôi, my-cms , làm ví dụ tham khảo.

Bài viết đầu tiên này tập trung vào việc thiết lập dự án từ đầu: khởi tạo dự án Rust, cấu hình các phụ thuộc và khởi động một máy chủ HTTP cơ bản với Axum.

Yêu cầu #

Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt các công cụ sau trên hệ thống của mình:

  • Rust : Ngôn ngữ lập trình.
  • Cargo : Trình quản lý gói của Rust (được cài đặt cùng với Rust).
  • SQLite : Cơ sở dữ liệu chúng ta sẽ sử dụng trong hướng dẫn này.

🔧 Bước 1: Khởi tạo dự án #

Bắt đầu bằng cách tạo một dự án mới bằng Cargo:

cargo new my-cms-api
cd my-cms-api

Lệnh này sẽ tạo cấu trúc dự án Rust mặc định:

my-cms-api/
├── Cargo.toml
└── src
└── main.rs

Chúng ta sẽ mở rộng cấu trúc này khi tiến hành.

📦 Bước 2: Thêm các phụ thuộc #

Mở Cargo.toml và thêm các phụ thuộc sau:

[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
sea-orm = { version = "0.12", features = ["sqlx-postgres", "runtime-tokio-rustls", "macros"] }
dotenvy = "0.15"
tracing = "0.1"
tracing-subscriber = "0.3"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

Phân tích các phụ thuộc #

  • axum – Framework web được xây dựng trên hyper, thiết kế cho các API an toàn kiểu dữ liệu và mô-đun.
  • tokio – Runtime bất đồng bộ hỗ trợ phần lớn hệ sinh thái.
  • sea-orm – ORM bất đồng bộ hoạt động tốt với PostgreSQL, MySQL hoặc SQLite.
  • dotenvy – Tải các biến môi trường từ tệp .env (chúng ta sẽ sử dụng cho cấu hình).
  • tracing & tracing-subscriber – Dùng để ghi log có cấu trúc, tương thích bất đồng bộ.
  • serde & serde_json – Dùng để (giải) tuần tự hóa cấu trúc dữ liệu trong JSON.

🌐 Bước 3: Khởi động máy chủ HTTP #

Hãy khởi động máy chủ của chúng ta. Mở src/main.rs và viết ứng dụng Axum cơ bản này:

use axum::{routing::get, Router};
 use std::net::SocketAddr;

 #[tokio::main]
 async  fn  main () {
 // Initialize router with a single route
 let  app = Router::new().route("/", get(root_handler));

 // Define server address
 let  addr = SocketAddr::from(([127, 0, 0, 1], 3000));
 println! ("🚀 Server running at http://{}", addr);

 // Start server
axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap();
}

 // Basic handler
 async  fn  root_handler ()  -> &  'static  str {
 "Hello, Rust + Axum!"
}

Run the server with:

cargo run

Thử truy cập vào http://localhost:3000 và thứ bạn nhìn được là Hello, Rust + Axum!

📁 Bước 4: Chuẩn bị Cấu trúc Dự án để Phát triển #

Để giữ mọi thứ sạch sẽ và có tổ chức, chúng ta sẽ phân chia các phần từ sớm. Hãy tạo một số thư mục:

mkdir -p src/{routes,handlers,config,database,models}
touch src/routes/mod.rs src/handlers/mod.rs

Example of modular routing ( src/routes/mod.rs ):

use axum::{Router, routing::get};
use crate::handlers::health::health_check;

pub  fn  create_routes ()  -> Router {
 Router::new().route("/health", get(health_check))
}

Example handler ( src/handlers/health.rs ):

pub  async  fn  health_check ()  -> &  'static  str {
 "OK"
}

Update src/main.rs to use these:

mod routes;
mod handlers;

use routes::create_routes;

#[tokio::main]
async  fn  main () {
 let  app =  create_routes ();
 // ... rest is same
}

🧪 Bước 5: Thêm Cấu hình .env #

Tạo một tệp .env trong thư mục gốc:

DATABASE_URL=postgres://postgres:password@localhost:5432/mycms

Load it at runtime with dotenvy :

use dotenvy::dotenv;

#[tokio::main]
async fn main() {
    dotenv().ok();
    // ...
}

✅ Tiếp theo là gì? #

Bây giờ bạn đã có một máy chủ web tối giản, có cấu trúc sử dụng Axum, sẵn sàng phát triển thành một API hoàn chỉnh. Trong bài viết tiếp theo (Phần 2) , chúng ta sẽ đi sâu vào thiết kế kiến trúc sạch sẽ bằng cách sử dụng hệ thống định tuyến của Axum, tích hợp SeaORM để lưu trữ dữ liệu, và phân tách các phần qua các module.

Muốn xem trước? Hãy xem kho mã: https://github.com/doitsu2014/my-cms

Hãy cho tôi biết khi bạn sẵn sàng làm việc với Phần 2 , hoặc nếu bạn muốn xuất bài viết này sang định dạng Markdown.

Bởi [email protected]

Xuất bản vào 4/8/2025