Les meilleures crates Rust pour une API en 2026
Les 14 crates Rust que j'utilise pour chaque API backend : Axum, Tokio, SQLx, Utoipa, Tower-HTTP, Tracing, Validator et les autres.
Ne perds pas une semaine à évaluer 40 crates. Voici la stack backend 2026 tranchée que j’utilise pour chaque API Axum.
Cœur
axum 0.7: router. Extracteurs et middlewares Tower. À associer avectokio 1.xfull.tokio: runtime.rt-multi-thread,macros,signal(graceful shutdown !),time.serde+serde_json: DTOs.#[serde(rename_all="camelCase")]à la frontière API,snake_caseà l’intérieur.
Données
sqlx 0.8(runtime-tokio,postgres,macros,migrate) : Postgres async avec requêtes vérifiées à la compilation.query!attrape les fautes SQL au build.redis 0.26/deadpool-redis: cache, rate limit et sessions. Pas de cache dans un HashMap partagé entre instances.refineryousqlx::migrate!: migrations versionnées, jouées au boot. Jamais deCREATE TABLEà la main en prod.
Plomberie HTTP
tower-http:TraceLayer,CorsLayer,CompressionLayer,RequestIdLayer,TimeoutLayer. Il te faut les quatre en prod.utoipa+utoipa-swagger-ui: OpenAPI généré depuis le code. Tes équipes front vont t’adorer.validator(derive) :#[validate(length, email, range)]sur les DTOs d’entrée. Rejette les données pourries à la frontière.
Observabilité
tracing+tracing-subscriber(env-filter,json) : logs structurés. JSON en prod, joli en dev.opentelemetry+tracing-opentelemetry: traces vers Jaeger ou Tempo quand les logs ne suffisent plus.metrics+metrics-exporter-prometheus:/metricspour le RPS, les histogrammes de latence et les stats du pool.
Robustesse
thiserror+anyhow:thiserrorpour les erreurs d’API,anyhowpour les binaires et le démarrage. Un seulAppErrormappé vers HTTP.backonoutokio-retry: backoff exponentiel pour les appels aval. Pas de boucles de retry à la main.reqwest(rustls-tls,json) : HTTP sortant. Mets des timeouts ! Par défaut c’est infini, et c’est un tueur en prod.
Mon extrait Cargo par défaut
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "macros", "migrate", "uuid", "chrono"] }
tower-http = { version = "0.5", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
thiserror = "2"
anyhow = "1"
validator = { version = "0.18", features = ["derive"] }
utoipa = { version = "5", features = ["axum_extras"] }
Ce que j’évite (pour des API)
- Les gros ORM magiques : les requêtes SQLx explicites scalent mieux pour du backend
async-stdpour des serveurs en 2026 : Tokio a gagné, l’écosystème suit- Rouler ta propre auth JWT : prends
jsonwebtoken+axum-loginou une auth externalisée (Clerk/Auth0) pour démarrer
Tu veux tout ça déjà câblé ? Le template gratuit de la newsletter l’a préconfiguré, avec Dockerfile et CI.