0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng dẫn xây dựng dịch vụ gửi email bằng Rust: Từ con số 0 đến sản phẩm (Phần 1)

Đăng vào 1 tháng trước

• 3 phút đọc

Chủ đề:

rustActix-webCargo

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:

Copy
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:

Copy
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:

Copy
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ã:

Copy
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

Copy
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 Copy
[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:

Copy
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 Copy
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:

Copy
cargo run

Hoặc sử dụng hot reload:

Copy
cargo watch -x run

Bạn có thể test API bằng lệnh:

Copy
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 Copy
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:

  1. Viết trực tiếp trong cùng file.
  2. 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:

Copy
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.rsmain.rs để dễ quản lý:

Copy
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:

Copy
DATABASE_URL=postgres://postgress:password@127.0.0.1:5432/newsletter

Chúng ta cần tạo bảng subscriptions như sau:

sql Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào