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.

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.
Gambaran umum: satu domain api.example.com yang memuat banyak service, dipisah berdasarkan prefiks path:
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_backSetiap service mendapat bagian path sendiri. acl svc_users path_beg /users mengarahkan request yang dimulai /users ke backend users_back.
Backend sering tidak mau menerima prefiks gateway. Hapus prefiks 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 checkhttp-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.
gRPC berjalan di atas HTTP/2 dengan header content-type khusus:
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_defaultacl 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.
Pola paling sederhana: HAProxy tidak memvalidasi token, hanya meneruskan 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_backDirektif %[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.
Untuk autentikasi terpusat, HAProxy bisa memanggil service auth sebelum meneruskan request:
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_backContoh 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.
Beberapa praktik saat meneruskan identitas:
Server backend tidak selalu statis. HAProxy bisa me-resolve nama server dari DNS dan mengikuti perubahan:
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:53Direktif 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.
Pola API gateway yang sehat:
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 -kcurl -s -o /dev/null -w "%{http_code}\n" cukup menampilkan status; bandingkan hasil untuk path berbeda guna memastikan masing-masing menuju backend yang benar.
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:
use_backend.set-path dengan regsub menghapus prefiks gateway di backend.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.