Introdução: Rust no Desenvolvimento Web — De Código de Sistema a APIs de Alta Carga
O Rust se consolidou no nicho de sistemas backend de alto desempenho, onde velocidade, segurança de memória e previsibilidade são cruciais. Para um desenvolvedor web já familiarizado com o básico da linguagem, escolher um framework é um equilíbrio entre ecossistema, assincronicidade e padrões arquiteturais. Neste artigo, analisaremos 10 frameworks maduros adequados para projetos em produção, microsserviços e aplicações em tempo real.
1. Actix-web: O Veterano Assíncrono
Actix-web continua sendo um dos frameworks HTTP mais rápidos do mundo (de acordo com TechEmpower). Ele é baseado no modelo ator e no tokio. Ideal para APIs REST e servidores WebSocket.
Exemplo: Endpoint REST Simples
use actix_web::{web, App, HttpServer, Responder};
async fn hello() -> impl Responder { "Hello from Actix-web!"}
#[actix_web::main]async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().route("/", web::get().to(hello))) .bind(("127.0.0.1", 8080))? .run() .await}Quando escolher: quando você precisa de desempenho máximo (acima de 1 milhão de RPS), conexões WebSocket complexas ou integração com o modelo ator.
2. Axum: O Padrão Moderno da Equipe Tokio
Axum faz parte do ecossistema tokio/tower. Ele usa o conceito de "middleware como serviços tower" e suporte nativo para handlers async fn. É considerado o mais ergonômico para serviços REST típicos.
Exemplo: Extração JSON
use axum::{Json, Router, routing::post};use serde::Deserialize;
#[derive(Deserialize)]struct User { name: String }
async fn create_user(Json(user): Json<User>) -> String { format!("User created: {}", user.name)}
#[tokio::main]async fn main() { let app = Router::new().route("/user", post(create_user)); axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) .serve(app.into_make_service()) .await .unwrap();}Quando escolher: para microsserviços com uma camada de middleware tower, integração com OpenTelemetry ou se você já usa tokio.
3. Rocket: Macros e Ergonomia
Rocket enfatiza a declaratividade através de atributos. Possui validação de formulários, serialização e integração com ORM (via Diesel) nativas. A versão 0.5+ é totalmente assíncrona.
Exemplo: Rota com Parâmetro
#[macro_use] extern crate rocket;
#[get("/hello/<name>")]fn hello(name: &str) -> String { format!("Hello, {}!", name)}
#[launch]fn rocket() -> _ { rocket::build().mount("/", routes![hello])}Quando escolher: para prototipagem rápida, projetos com uso intenso de formulários/arquivos ou se você valoriza minimalismo de código.
4. Warp: O Compositor Funcional
Warp é construído em um sistema de filtros, onde cada middleware é um filtro, combinável através de .and() e .or(). Muito flexível, mas requer compreensão dos tipos do Rust.
Exemplo: Combinando Filtros
use warp::Filter;
#[tokio::main]async fn main() { let hello = warp::path!("hello" / String) .map(|name| format!("Hello, {}", name));
warp::serve(hello).run(([127,0,0,1], 3030)).await;}Quando escolher: para roteamento complexo, proxies WebSocket ou quando você precisa de controle refinado sobre o pipeline de processamento.
5. Tide: Leve e Minimalista
Tide é do Rust Async Working Group. Dependências mínimas, cadeia de middleware simples. Bom para serviços pequenos e aprendizado de assincronicidade.
Exemplo: Middleware de Logging
use tide::{Request, Response, Middleware, Next};
struct Logger;#[tide::utils::async_trait]impl<State: Clone + Send + Sync + 'static> Middleware<State> for Logger { async