For the complete documentation index, see llms.txt. This page is also available as Markdown.

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:

πŸ”— github.com/jacky-htg/workshop/tree/main/16-middleware

16.1 Konsep Middleware

Secara matematis, middleware adalah fungsi dengan tipe:

type Middleware func(http.Handler) http.Handler

Ilustrasi aliran middleware:

Request β†’ Recovery β†’ Timeout β†’ Auth β†’ Handler β†’ Response
              ↓          ↓        ↓
         (panic)    (timeout)  (unauth)
              ↓          ↓        ↓
            Error ← Error ← Error ←

Setiap middleware bisa:

  1. Meneruskan request ke handler berikutnya (next.ServeHTTP())

  2. Menghentikan request dan langsung mengembalikan response (error)

  3. 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

Middleware
Fungsi
Akan diaplikasikan ke

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.Handler interface, yang merupakan hasil dari Then()

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

Middleware
Bab
Kegunaan

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:

Konsep
Implementasi

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