How to use tower middleware with Axum

Stack Tower middleware in Axum using Router::layer or ServiceBuilder to add reusable request handling logic.

Use tower::ServiceBuilder to stack middleware layers and wrap your Axum router with tower::ServiceExt::into_make_service_with_connect_info or directly via axum::Router::layer.

use axum::{routing::get, Router};
use tower::{ServiceBuilder, ServiceExt};
use tower_http::trace::TraceLayer;

#[tokio::main]
async fn main() {
    let app = Router::new()
        .route("/", get(|| async { "Hello" }))
        .layer(TraceLayer::new_for_http())
        .layer(ServiceBuilder::new().layer(tower_http::cors::CorsLayer::permissive()));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}