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.
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:
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.
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"
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.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!
Để 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 }
.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(); // ... }
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.
Xuất bản vào 4/8/2025