Microsserviços em Rust: arquitetura e prática do A ao Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Microsserviços em Rust: arquitetura e prática do A ao Z



A arquitetura de microsserviços se tornou o padrão para construir aplicações modernas e escaláveis. A linguagem Rust, com seu foco em desempenho, segurança de memória e concorrência, oferece vantagens únicas para o desenvolvimento de microsserviços. Neste artigo, abordaremos o ciclo completo de criação de um microsserviço em Rust: desde a escolha das ferramentas até a implantação.



Por que Rust para microsserviços?



Rust combina o controle de baixo nível do C/C++ com a segurança de uma linguagem moderna. Para microsserviços, isso significa:



  • Segurança de memória sem garbage collector — consumo previsível de recursos, sem "lentidão" do GC.
  • Alto desempenho — no nível do C++, crucial para serviços de alta carga.
  • Modelo de ownership (propriedade) — elimina condições de corrida em tempo de compilação.
  • Tamanho pequeno dos binários — inicialização rápida e baixo consumo de memória.


Graças a isso, Rust é ideal para Edge-services, API gateways e componentes críticos.



Principais ferramentas para microsserviços em Rust



No ecossistema Rust, existem várias bibliotecas e frameworks maduros:



  • Actix-web — poderoso framework web assíncrono com modelo de atores. Excelente para REST APIs.
  • Tokio — runtime assíncrono, base da maioria das aplicações de rede.
  • Axum — framework moderno da equipe Tokio, usando tower e hyper.
  • Warp — framework leve, baseado em filtros.
  • Tonic — implementação de gRPC em Rust.


Para demonstração, usaremos Actix-web e Tokio.



Arquitetura de microsserviço em Rust



Vamos considerar a arquitetura de um serviço simples de gerenciamento de usuários. Um microsserviço típico inclui:



  1. Camada HTTP — tratamento de requisições, validação.
  2. Lógica de negócio — camada de serviço.
  3. Camada de dados — interação com o banco de dados (geralmente assíncrona).
  4. Camada de comunicação — clientes gRPC ou HTTP para outros serviços.


Exemplo: REST API simples com Actix-web



Vamos criar um microsserviço básico com endpoints para operações CRUD em usuários.



// Cargo.toml[dependencies]actix-web = "4"actix-rt = "2"serde = { version = "1", features = ["derive"] }tokio = { version = "1", features = ["full"] }sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }


Arquivo principal main.rs:



use actix_web::{web, App, HttpServer, Responder, HttpResponse};use serde::{Deserialize, Serialize};use sqlx::postgres::PgPoolOptions;

#[derive(Serialize, Deserialize, Clone)]struct User { id: i32, name: String, email: String,}

// Armazenamento em memória (para exemplo, na realidade — banco de dados)use std::sync::Mutex;struct AppState { users: Mutex<Vec<User>>,}

async fn get_users(data: web::Data<AppState>) -> impl Responder { let users = data.users.lock().unwrap(); HttpResponse::Ok().json(users.clone())}

async fn create_user( data: web::Data<AppState>, new_user: web::Json<User>,) -> impl Responder { let mut users = data.users.lock().unwrap(); let user = User { id: users.len() as i32 + 1, ..new_user.into_inner() }; users.push(user.clone()); HttpResponse::Created().json(user)}

#[actix_web::main]async fn main() -> std::io::Result<()> { let app_state = web::Data::new(AppState { users: Mutex::new(vec![]), });

HttpServer::new(move || { App::new()

Blogs

Book Recommendations