Middleware dengan Tower Layer
Penjelasan
Di Axum, middleware bukan konsep khusus miliknya sendiri — middleware adalah `Layer` dari Tower. `Layer` membungkus sebuah `Service` (handler-mu) menjadi `Service` baru yang menjalankan logic tambahan sebelum/sesudah handler asli dipanggil. Karena ini standar Tower, ribuan crate middleware yang sudah ada di ekosistem Tower (bukan cuma buatan tim Axum) bisa langsung dipakai. Contoh paling umum: `TraceLayer` dari crate `tower-http`, yang otomatis mencatat log setiap request masuk dan response yang dihasilkan (method, path, status, durasi) — sangat berguna untuk debugging tanpa harus menulis logging manual di setiap handler. Layer didaftarkan ke router lewat `.layer(...)`. Urutan pemasangan layer penting: layer yang dipasang PALING TERAKHIR adalah yang PALING LUAR (dijalankan paling dulu saat request masuk, paling belakang saat response keluar) — seperti membungkus kado berlapis.
Contoh Konsep
// cargo add tower-http --features trace
// cargo add tracing tracing-subscriber
use axum::{routing::get, Router};
use tower_http::trace::TraceLayer;
async fn hello() -> &'static str {
"Hello!"
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
let app = Router::new()
.route("/", get(hello))
// TraceLayer mencatat log setiap request/response secara otomatis
.layer(TraceLayer::new_for_http());
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Praktikum
Tambahkan `TraceLayer::new_for_http()` ke router di bawah ini supaya semua request tercatat di log.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Selain `TraceLayer`, `tower-http` juga menyediakan `TimeoutLayer` (batas waktu request), `CompressionLayer` (kompresi response otomatis), dan `RequestBodyLimitLayer` (batas ukuran body). Semuanya bisa ditumpuk dengan `.layer()` berulang kali — inilah kekuatan model Layer dibanding middleware yang framework-specific.