Belajar HAProxy - HAProxy as API Gateway
Episode 11 of 23

Belajar HAProxy - HAProxy as API Gateway

Episode ini memakai HAProxy sebagai API gateway: reverse proxy untuk REST dan gRPC, rewrite path, virtual hosts, integrasi autentikasi dengan JWT dan external auth, serta pola routing untuk microservices dengan service discovery.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Semakin banyak arsitektur yang berbentuk microservices, dan setiap service membutuhkan satu pintu masuk. HAProxy sangat cocok memainkan peran API gateway: menerima semua request, menentukan service tujuan, melakukan rewrite, dan memeriksa identitas.

Episode 11 menggabungkan semua kemampuan yang sudah kalian pelajari: routing, ACL, rewrite, dan proteksi — menjadi satu pintu untuk REST dan gRPC, lengkap dengan integrasi autentikasi dan pola service discovery.

Reverse Proxy untuk REST dan gRPC

Gateway REST dengan Path Rewrite

Gambaran umum: satu domain api.example.com yang memuat banyak service, dipisah berdasarkan prefiks path:

API gateway untuk service REST
frontend api_front
    bind *:443 ssl crt /etc/haproxy/certs/fullchain.pem
    mode http
    option httplog
 
    acl svc_users path_beg /users
    acl svc_orders path_beg /orders
    acl svc_payment path_beg /payment
 
    use_backend users_back if svc_users
    use_backend orders_back if svc_orders
    use_backend payment_back if svc_payment
    default_backend users_back

Setiap service mendapat bagian path sendiri. acl svc_users path_beg /users mengarahkan request yang dimulai /users ke backend users_back.

Rewrite Path agar Backend Sederhana

Backend sering tidak mau menerima prefiks gateway. Hapus prefiks sebelum diteruskan:

Rewrite path sebelum diteruskan
backend users_back
    balance roundrobin
    option httpchk GET /healthz
    http-request set-path %[path,regsub(^/users/,/)]
    server user1 10.0.0.11:8080 check
    server user2 10.0.0.12:8080 check

http-request set-path %[path,regsub(^/users/,/)] mengganti awalan /users/ menjadi / sehingga backend menerima path asli layanan. Teknik ini membuat backend tetap fokus pada domain bisnisnya.

Dukungan gRPC

gRPC berjalan di atas HTTP/2 dengan header content-type khusus:

Routing untuk gRPC
frontend grpc_front
    bind *:443 ssl crt /etc/haproxy/certs/fullchain.pem \
        alpn h2,http/1.1
    mode http
 
    acl is_grpc req.hdr(Content-Type) -i application/grpc
    acl svc_catalog path_beg /catalog.CatalogService/
 
    use_backend grpc_catalog if is_grpc svc_catalog
    default_backend grpc_default

acl is_grpc req.hdr(Content-Type) -i application/grpc mendeteksi trafik gRPC dari header Content-Type, lalu use_backend grpc_catalog if is_grpc svc_catalog mengarahkan panggilan RPC spesifik ke backend yang tepat.

Integrasi Autentikasi

Forwarding JWT ke Backend

Pola paling sederhana: HAProxy tidak memvalidasi token, hanya meneruskan header Authorization:

Forwarding header Authorization
frontend api_front
    bind *:443 ssl crt /etc/haproxy/certs/fullchain.pem
    mode http
 
    acl has_token req.hdr(Authorization) -m found
 
    http-request set-header X-User-ID \
        %[req.hdr(Authorization),jwt_payload('sub')]
 
    http-request deny deny_status 401 if !has_token
    default_backend users_back

Direktif %[req.hdr(Authorization),jwt_payload('sub')] mengekstrak klaim sub dari JWT dan menaruhnya di header X-User-ID. Ini membuat backend tidak perlu menguraikan token lagi untuk mengenali pengguna.

External Authentication

Untuk autentikasi terpusat, HAProxy bisa memanggil service auth sebelum meneruskan request:

External auth sebelum routing
backend auth_check
    server auth 10.0.0.100:8443 ssl verify required \
        ca-file /etc/ssl/certs/ca-certificates.crt
 
frontend api_front
    bind *:443 ssl crt /etc/haproxy/certs/fullchain.pem
    mode http
 
    http-request lua.auth
    http-request deny deny_status 401 if !{ var(txn.authed) -m bool }
 
    default_backend users_back

Contoh di atas memakai Lua untuk memanggil endpoint auth, lalu var(txn.authed) menyimpan hasilnya. Jika hasilnya tidak benar, request ditolak 401 sebelum masuk ke backend.

Menjaga Token Tetap Aman

Beberapa praktik saat meneruskan identitas:

  • Jangan log header Authorization penuh; hanya simpan hash atau klaim tertentu.
  • Ganti token dengan token internal yang pendek jika backend tidak butuh JWT asli.
  • Pastikan koneksi ke service auth memakai TLS.

Pola Microservices dan Service Discovery

Backend Dinamis dengan DNS

Server backend tidak selalu statis. HAProxy bisa me-resolve nama server dari DNS dan mengikuti perubahan:

Backend dengan resolusi DNS
backend users_back
    balance roundrobin
    server svc users-svc.internal:8080 check resolvers dns_srv \
        init-addr libc,none
    resolver dns_srv nameserver dns1 10.0.0.53:53

Direktif server svc users-svc.internal:8080 check resolvers dns_srv membuat HAProxy mengikuti IP dari DNS setiap interval tertentu. Saat service discovery memperbarui DNS, HAProxy otomatis mengikuti tanpa reload.

Memisahkan Tanggung Jawab

Pola API gateway yang sehat:

  • Frontend hanya bertugas routing, rewrite, dan otentikasi ringan.
  • Backend memegang logika service dan health check endpoint.
  • Rate limiting dan proteksi dipasang di frontend (episode 10).
  • Observability dipasang di level gateway agar seluruh trafik terpantau.
Uji routing gateway
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/users/me -k
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/orders/1 -k

curl -s -o /dev/null -w "%{http_code}\n" cukup menampilkan status; bandingkan hasil untuk path berbeda guna memastikan masing-masing menuju backend yang benar.

Penutup

Episode 11 merangkum peran HAProxy sebagai API gateway: satu pintu untuk banyak service, rewrite yang menjaga backend tetap bersih, autentikasi yang terpusat, dan service discovery yang hidup lewat DNS.

Inti yang harus dibawa pulang:

  • Pisahkan service berdasarkan prefiks path dengan ACL dan use_backend.
  • set-path dengan regsub menghapus prefiks gateway di backend.
  • Deteksi gRPC lewat Content-Type dan routing berbasis service method.
  • Forward JWT ke header internal agar backend ringan.
  • External auth memakai Lua atau pemanggilan service auth sebelum routing.
  • DNS-based service discovery membuat backend mengikuti perubahan IP.

Di episode 12 selanjutnya kita akan membahas layer 4 proxy & TCP routing — perbedaan mode TCP dan HTTP, proxying layanan raw seperti database dan gRPC, serta inspeksi SNI dan TLS passthrough.

Belajar HAProxy - HAProxy as API Gateway | Belajar HAProxy