Episode ini mendalami listener dan filter chain: konfigurasi HTTP connection manager, virtual host, path matching, header manipulation, redirect, dan rewrite, lengkap dengan contoh route yang bisa langsung dicoba.

Konfigurasi hello world di episode 3 masih mentah: semua path diteruskan ke satu cluster. Episode 4 mengubah itu. Kita akan mendalami listener, filter chain, dan route configuration — cara memetakan beberapa domain dan path ke cluster berbeda, serta memanipulasi request lewat header, redirect, dan rewrite.
Ini adalah episode di mana Envoy mulai terasa seperti router beneran. Kalian akan melihat bagaimana satu file config bisa menangani beberapa virtual host sekaligus, dan bagaimana aturan match bekerja dari yang paling spesifik sampai yang paling umum.
Listener adalah gerbang semua traffic. Contoh listener dengan dua filter chain (HTTP dan TCP) akan kita bedah nanti di episode 8, tapi untuk sekarang fokus pada satu filter chain HTTP:
listeners:
- name: listener_http
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: api_gateway
route_config:
name: api_routes
virtual_hosts: []
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.RouterPerhatikan stat_prefix: api_gateway — nilai ini menentukan awalan semua metric yang dihasilkan listener ini. Pemilihan prefix yang jelas memudahkan kalian membedakan metric antar listener di admin interface.
filter_chains mendefinisikan rangkaian filter untuk satu jenis koneksi (misalnya HTTP saja).route_config menyimpan definisi virtual host dan route.http_filters adalah pipeline filter HTTP yang memproses request, dan router harus selalu menjadi filter terakhir.Virtual host memungkinkan satu listener melayani banyak domain sekaligus. Contoh berikut memetakan dua domain ke cluster berbeda:
route_config:
name: api_routes
virtual_hosts:
- name: backend_vh
domains:
- api.example.com
routes:
- match:
prefix: "/orders"
route:
cluster: orders_service
- name: web_vh
domains:
- www.example.com
routes:
- match:
prefix: "/"
route:
cluster: web_serviceEnvoy memilih virtual host berdasarkan header Host dari request. Domain api.example.com dikirim ke orders_service, sementara www.example.com menuju web_service. Virtual host api.example.com akan dipilih hanya jika header Host cocok persis.
Tiga cara umum mencocokkan path:
exact: "/health" — hanya path yang persis sama.prefix: "/api/" — semua path yang diawali string tertentu.safe_regex — pola regex yang diizinkan untuk matching lanjutan.Urutan evaluasi penting: Envoy memeriksa route sesuai urutan kemunculannya di YAML, jadi tempatkan aturan paling spesifik lebih dulu.
Kadang backend tidak menerima path yang sama dengan yang diminta klien. Gunakan prefix_rewrite:
routes:
- match:
prefix: "/api/v1"
route:
cluster: orders_service
prefix_rewrite: "/v1"Dengan prefix_rewrite: "/v1", request /api/v1/users diubah menjadi /v1/users sebelum diteruskan ke backend. Teknik ini sangat umum untuk menyembunyikan struktur internal API.
Jika kalian ingin memberitahu klien untuk pindah ke URL lain:
routes:
- match:
prefix: "/old"
redirect:
path_redirect: "/new"
response_code: 301Konfigurasi redirect mengembalikan respons 301 dengan lokasi /new tanpa menyentuh backend. Redirect cocok untuk migrasi endpoint lama.
Envoy bisa menambah, mengubah, atau menghapus header di level virtual host maupun route:
virtual_hosts:
- name: web_vh
domains:
- www.example.com
request_headers_to_add:
- header:
key: X-Envoy-Gateway
value: "v1"
append_action: ADD_IF_ABSENT
routes:
- match:
prefix: "/"
route:
cluster: web_servicerequest_headers_to_add menambah header X-Envoy-Gateway dengan nilai v1 ke setiap request yang masuk ke virtual host ini. append_action: ADD_IF_ABSENT memastikan header tidak diduplikasi jika sudah ada.
Header adalah alat utama komunikasi Envoy dengan upstream dan klien. Untuk melihat header yang tiba di backend, jalankan backend yang mencetak header:
curl -v -H "Host: www.example.com" http://localhost:10000/ 2>&1 | grep "^> "Baris dengan awalan > menunjukkan request headers yang dikirim Envoy ke backend. Perintah curl -v ini adalah cara tercepat mengamati hasil manipulasi header di episode ini.
Episode 4 membawa routing kalian ke level berikutnya: listener dengan HTTP connection manager, virtual host untuk banyak domain, exact dan prefix matching, rewrite dan redirect, serta manipulasi header per request.
Inti yang harus dibawa pulang:
Host.exact, prefix, atau safe_regex untuk match path.prefix_rewrite mengubah path sebelum ke backend; redirect memberi tahu klien pindah URL.request_headers_to_add menambah header per virtual host atau route.router selalu menjadi filter HTTP terakhir dalam pipeline.Di episode 5 selanjutnya kita akan membahas clusters dan load balancing — definisi cluster dan endpoint, kebijakan round robin, least request, ring hash, dan maglev, plus health checks, connection pools, dan outlier detection.