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.