10 лучших фреймворков Rust для веб-разработки в 2024

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

10 лучших фреймворков Rust для веб-разработки: полный обзор 2024

Rust — язык программирования, сочетающий производительность C++ с безопасностью памяти, которую гарантирует компилятор. В 2024 году экосистема веб-фреймворков Rust достигла зрелости: появились стабильные релизы, богатая документация и тысячи production-проектов. В этой статье мы разберём 10 лучших фреймворков Rust для веб-разработки, приведём примеры кода и поможем выбрать инструмент под вашу задачу.

1. Actix Web — самый производительный

Actix Web (ранее Actix) — бессменный лидер бенчмарков TechEmpower. Основан на акторной модели, но в версии 4+ стал ближе к классическому middleware-подходу. Поддерживает WebSocket, HTTP/2, автоматическую сериализацию через Serde.

Пример кода:

use actix_web::{get, web, App, HttpServer, Responder};

#[get("/hello/{name}")]
async fn greet(name: web::Path<String>) -> impl Responder {
    format!("Привет, {}!", name)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new().service(greet)
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

Когда выбрать: высоконагруженные API, микросервисы, real-time приложения.

2. Axum — современный и эргономичный

Axum от команды Tokio — фреймворк, построенный поверх tower и hyper. Главная фишка — экстракторы (Extractors), которые позволяют получать данные из запроса без явного парсинга. Полностью асинхронный, поддерживает Tower middleware.

Пример кода:

use axum::{routing::get, Router, Json, extract::Path};
use serde_json::{json, Value};

async fn user_handler(Path(id): Path<u32>) -> Json<Value> {
    Json(json!({"user_id": id, "name": "Rust"}))
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/user/:id", get(user_handler));
    axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
        .serve(app.into_make_service())
        .await
        .unwrap();
}

Когда выбрать: новые проекты, где важна модульность и интеграция с Tokio.

3. Rocket — простота и макросы

Rocket — фреймворк с богатой системой макросов, который минимизирует шаблонный код. Поддерживает автоматическую валидацию форм, работу с базами данных через ORM (Diesel) и шаблонизаторы (Tera). Требует nightly-версию Rust.

Пример кода:

#[macro_use] extern crate rocket;

#[get("/<name>")]
fn hello(name: &str) -> String {
    format!("Привет, {}!", name)
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![hello])
}

Когда выбрать: прототипирование, небольшие проекты, обучение Rust.

4. Warp — композиция фильтров

Warp использует концепцию «фильтров» — комбинируемых компонентов, которые обрабатывают запрос. Позволяет строить сложную логику маршрутизации без вложенных структур. Работает на hyper и tokio.

Пример кода:

use warp::Filter;

#[tokio::main]
async fn main() {
    let hello = warp::path!("hello" / String)
        .map(|name| format!("Привет, {}!", name));

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

Когда выбрать: сложные маршруты, middleware-цепочки, WebSocket.

5. Tide — минимализм и async/await

Tide — лёгкий фреймворк от создателей async-std. Минимальный API, но при этом гибкий. Подходит для микросервисов и приложений, где не нужны тяжёлые зависимости.

Пример кода:

use tide::Request;

async fn hello(req: Request<()>) -> tide::Result<String> {
    let name: String = req.param("name")?;
    Ok(format!("Привет, {}!", name))
}

#[async_std::main]
async fn main() -> tide::Result<()> {
    let mut app = tide::new();
    app.at("/hello/:name").get(hello);
    app.listen("127.0.0.1:8080").await?;
    Ok(())
}

Когда выбрать: простые API, эксперименты, async-std экосистема.

6. Salvo — асинхронный и быстрый

Salvo — относительно новый фреймворк, который делает упор на безопасность типов и производительность. Имеет встроенную поддержку OpenAPI (Swagger), WebSocket и middleware.

Пример кода:

use salvo::prelude::*;

#[handler]
async fn hello(req: &mut Request, res: &mut Response) {
    let name = req.param::<String>("name").unwrap();
    res.render(Text::Plain(format!("Привет, {}!", name)));
}

#[tokio::main]
async fn main() {
    let router = Router::with_path("hello/<name>").get(hello);
    Server::new(TcpListener::bind("0.0.0.0:8080"))
        .serve(router)
        .await;
}

Когда выбрать: проекты с автоматической генерацией API-документации.

7. Poem — модульность и OpenAPI

Poem предлагает уникальную систему middleware, основанную на трейтах. Поддерживает OpenAPI, gRPC, WebSocket. Отличается хорошей документацией и низким порогом входа.

Когда выбрать: сложные enterprise-приложения, требующие OpenAPI.

8. Nickel — классика Rust

Nickel — один из первых веб-фреймворков для Rust. Вдохновлён Express.js. Использует middleware и макросы. Сейчас уступает по производительности, но остаётся простым для понимания.

Когда выбрать: обучение, миграция с Node.js.

Блоги

Рекомендаций по книгам