Middleware
Dalam pengembangan web, ada kebutuhan lintas endpoint yang harus dipenuhi: logging, autentikasi, recovery dari panic, timeout, CORS, dan lain-lain. Menulis kode yang sama di setiap handler akan melanggar prinsip DRY (Don't Repeat Yourself).
Middleware adalah solusi elegant: fungsi yang membungkus handler dan dieksekusi sebelum handler utama dipanggil.
📂 Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:
16.1 Konsep Middleware
Secara matematis, middleware adalah fungsi dengan tipe:
type Middleware func(http.Handler) http.HandlerIlustrasi aliran middleware:
Request → Recovery → Timeout → Auth → Handler → Response
↓ ↓ ↓
(panic) (timeout) (unauth)
↓ ↓ ↓
Error ← Error ← Error ←Setiap middleware bisa:
Meneruskan request ke handler berikutnya (next.ServeHTTP())
Menghentikan request dan langsung mengembalikan response (error)
Memodifikasi request/response (menambah header, logging)
16.2 Library Middleware
Kita akan menggunakan library sederhana dari go-libs/middleware:
16.3 Middleware yang Akan Dibangun
Recovery
Menangkap panic, mencegah server crash
Semua route
Timeout
Membatalkan request yang terlalu lama
Semua route
Auth
Memvalidasi token (sederhana dulu)
Private routes
16.4 Recovery Middleware
Panic di Go (misal: index out of range, nil pointer dereference) akan menghentikan program. Middleware ini menangkap panic dan mengembalikan error 500:
16.5 Timeout Middleware
Middleware ini membungkus request dengan context timeout. Jika handler tidak selesai sebelum timeout, client mendapat 504 Gateway Timeout:
16.6 Auth Middleware (Sederhana)
Untuk sementara, auth middleware hanya memeriksa bahwa token tidak kosong dan panjangnya > 10 karakter. Nanti di bab Token akan diperbaiki dengan JWT:
16.7 Menambahkan Konfigurasi Gateway Timeout
Tambahkan GatewayTimeout ke config:
Kita menggunakan env config baru untuk gateway timeout
Update .env:
16.8 Mengaplikasikan Middleware ke Routes
Sekarang kita bagi routes menjadi:
Public routes – tidak perlu auth (health check)
Private routes – perlu auth (CRUD users)
16.9 Perbedaan Handle vs HandleFunc
Perhatikan perbedaan ini:
HandleFunc – langsung menerima
func(http.ResponseWriter, *http.Request)Handle – menerima
http.Handlerinterface, yang merupakan hasil dariThen()
16.10 Menguji Middleware
Uji Health Check (Public)
Response :
Uji Private Route Tanpa Token
Response :
Uji Private Route Dengan Token
Response :
16.11 Diagram Alur Middleware
16.12 Middleware yang Akan Datang
Logging/Tracing
OpenTelemetry
Request logging, distributed tracing
CORS
Security
Mengizinkan cross-origin request
Rate Limiter
Performance
Mencegah abuse
Metrics
OpenTelemetry
Mengumpulkan metrics (request count, latency)
Ringkasan Bab 16
Di bab ini kita telah belajar:
Middleware definition
func(http.Handler) http.Handler
Chaining
middleware.Chain() atau Stack.Then()
Recovery
Menangkap panic, return 500
Timeout
Context timeout, return 504
Auth
Validasi token (sementara)
Public vs Private
Base stack vs Private stack
Manfaat yang kita peroleh:
✅ Kode lintas endpoint tidak berulang (DRY)
✅ Server tidak crash saat panic
✅ Request yang terlalu lama dibatalkan (504)
✅ Proteksi sederhana untuk private routes
Yang akan datang:
Saat ini auth hanya pengecekan panjang token (insecure)
Bab selanjutnya: Token (Autentikasi) – implementasi JWT yang aman
Last updated
Was this helpful?