Axum Service Skill
Geração e revisão idiomática de serviços web Axum 0.8 - uma Skill de Agente para Rust 1.97.0, Tokio 1.x e serde 1.0.
O Que Esta Skill Faz
Produz uma checklist de serviço HTTP implantável: workspace Cargo.toml, módulos Router, AppState compartilhado (PgPool, reqwest::Client), rotas /health e /ready, subscriber tracing, erros de domínio thiserror mapeados para códigos de status e testes de integração com tower::ServiceExt.
Quando Invocar
- Novo microserviço ou BFF em um workspace Rust
- Revisando PRs para chamadas de banco de dados bloqueantes em handlers assíncronos
- Dividindo um binário monolítico em módulos roteados
- Padronizando código Axum de hackathons antes da produção
Entradas
| Entrada | Por quê |
|---|---|
| Nome do serviço | Nome do crate, campos de log, tag da imagem |
| DB necessário? | sqlx::PgPool no estado vs stub |
| Modelo de autenticação | Nenhum, header de chave de API, middleware JWT |
| Porta | Padrão 3000 ou convenção da plataforma |
| Caminho do workspace | services/billing-api vs crate raiz |
Saídas
Cargo.tomlcomaxum,tokio,tower-http,tracing,serde,sqlxopcionalsrc/main.rscomTcpListener, desligamento graciososrc/routes/mod.rs,health.rs, roteadores de domíniosrc/error.rscom mapeamentoIntoResponsetests/health.rsusando requisiçõesoneshot- Bloco de comando de verificação
Guardrails
- Handlers assíncronos não devem bloquear - use
spawn_blockingou DB assíncrono apenas. - Sem segredos nos arquivos gerados - apenas placeholders
.env.example. - Rotas de health antes das rotas de domínio - balanceadores de carga precisam delas desde o primeiro dia.
tracingestruturado -#[instrument]em handlers; semprintln!em caminhos de produção.- Clonar estado barato -
Arc<PgPool>ereqwest::Clientreutilizado. - Mapear erros para status - nunca vazar strings internas em 500 em APIs públicas.
Receita
cd services/billing-api
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo test
cargo run &
curl -sf http://localhost:3000/health
curl -sf http://localhost:3000/readyExemplo de Trabalho (esqueleto)
use axum::{routing::get, Router};
use std::net::SocketAddr;
use tokio::net::TcpListener;
mod routes;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
let app = Router::new()
.merge(routes::health::router());
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
let listener = TcpListener::bind(addr).await?;
axum::serve(listener, app).await?;
Ok(())
}FAQs
Axum ou Actix para este serviço?
Axum quando o padrão da equipe é o ecossistema Tokio + Tower. Actix apenas quando ADR já o seleciona.
Incluir scaffold GraphQL?
Apenas quando a entrada especifica GraphQL desde o primeiro dia; roteadores REST padrão.
Geração OpenAPI?
Adicionar utoipa em um PR subsequente após as rotas estabilizarem.
Relacionado
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.