1. Cài đặt Môi Trường Phát Triển
Rust
Để bắt đầu, bạn cần cài đặt Rust trên máy tính của mình. Sử dụng lệnh sau để cài đặt Rust thông qua rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Sau khi cài đặt, bạn có thể kiểm tra phiên bản Rust bằng các lệnh sau:
rustc --version
cargo --version
Cargo
Cargo là công cụ quản lý gói tương tự như npm trong Node.js. Để sử dụng hot reload, bạn nên cài đặt cargo-watch
:
cargo install cargo-watch
Linter và Format Code
Bạn nên cài đặt clippy
để kiểm tra mã lỗi và rustfmt
để định dạng mã:
rustup component add clippy
rustup component add rustfmt
2. Mục Tiêu Sản Phẩm
Chúng ta sẽ phát triển một dịch vụ gửi email bằng Rust với những tính năng sau:
- Người dùng có thể theo dõi tác giả yêu thích.
- Mỗi khi tác giả đăng bài mới, email thông báo sẽ gửi đến người theo dõi.
Hãy bắt đầu ngay thôi!
3. Đăng Ký Người Theo Dõi Mới
User story của chúng ta như sau:
Là một người dùng
Tôi muốn theo dõi các bài viết
Do đó tôi có thể nhận được email thông báo khi có bài viết mới được đăng lên trang blog.
Chúng ta sẽ thiết kế API /subscriptions
nhận email từ người dùng để thực hiện tính năng này.
Những Công Việc Cần Làm
- Chọn framework để viết API.
- Viết test cho API.
- Tương tác với cơ sở dữ liệu.
Chọn Framework
Hiện có nhiều web framework cho Rust như actix-web, axum, poem, tide, rocket. Chúng ta sẽ chọn actix-web, một framework ổn định và có hỗ trợ cộng đồng rộng rãi.
3.1 Kiểm Tra Sức Khỏe API
Khởi Tạo Dự Án
cargo new zero2prod
Cài Đặt Thư Viện
Cập nhật file Cargo.toml
để thêm thư viện cần thiết:
toml
[dependencies]
actix-web = "4"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
Hoặc bạn có thể cài đặt thông qua lệnh cargo add
:
cargo add actix-web@4
cargo add tokio@1 --features macros,rt-multi-thread
Hello World
Dưới đây là mã lệnh cho một server đơn giản với actix-web:
rust
use actix_web::{web, App, HttpRequest, HttpServer, Responder};
async fn greet(req: HttpRequest) -> impl Responder {
let name = req.match_info().get("name").unwrap_or("World");
format!("Hello {}!", &name)
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route("/", web::get().to(greet))
.route("/{name}", web::get().to(greet))
})
.bind("127.0.0.1:8000")?
.run()
.await
}
Chạy server bằng:
cargo run
Hoặc sử dụng hot reload:
cargo watch -x run
Bạn có thể test API bằng lệnh:
curl http://localhost:8000
Phân Tích Các Thành Phần của Server Actix-web
Các thành phần của server actix-web được tổ chức bao gồm:
- HttpServer: Xử lý các tác vụ liên quan đến giao thức.
- App: Xác định các routes và middlewares.
- Route: Định nghĩa các điểm cuối API.
Triển Khai Logic Kiểm Tra Sức Khỏe API
Logic đơn giản là khi bạn gọi API /health_check
, server sẽ trả về mã trạng thái 200 OK.
rust
async fn health_check() -> impl Responder {
HttpResponse::Ok() // status 200
}
3.2 Bài Test Tích Hợp
Rust cho phép bạn viết test theo hai cách:
- Viết trực tiếp trong cùng file.
- Viết trong thư mục riêng
tests
.
Chúng ta sẽ chọn cách 2 để thuận tiện hơn.
Tạo thư mục tests
:
mkdir -p tests
Cấu Trúc Dự Án
Chúng ta sẽ cấu trúc lại thành các file là lib.rs
và main.rs
để dễ quản lý:
src/
configuration.rs
lib.rs
main.rs
routes/
mod.rs
health_check.rs
subscriptions.rs
Kết Nối Với Cơ Sở Dữ Liệu
Chúng ta sẽ sử dụng PostgreSQL và thư viện sqlx
để thực hiện kết nối:
DATABASE_URL=postgres://postgress:password@127.0.0.1:5432/newsletter
Chúng ta cần tạo bảng subscriptions như sau:
sql
CREATE TABLE subscriptions(
id uuid NOT NULL,
PRIMARY KEY (id),
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
subscribed_at timestamptz NOT NULL
);
Tóm Lại
Chúng ta đã hoàn thành việc thiết lập môi trường, xây dựng các API cơ bản, và cấu trúc lại dự án. Phần tiếp theo sẽ đi sâu vào các tính năng mở rộng, bao gồm gửi email và xử lý người theo dõi.
Tài Liệu Tham Khảo
Bạn có thể tham khảo thêm tại GitHub - LukeMathWalker/zero-to-production.
source: viblo