路由鏡像策略
這個簡單的範例示範了 Envoy 使用請求鏡像策略的請求鏡像功能。
傳入的請求由 envoy-front-proxy
服務接收。
路徑 /service/1
的請求會被靜態鏡像。
每個請求由 service1
叢集處理,此外,還會轉發到 service1-mirror
叢集
envoy.yaml
1 virtual_hosts:
2 - name: backend
3 domains:
4 - "*"
5 routes:
6 - match:
7 prefix: "/service/1"
8 route:
9 cluster: service1
10 request_mirror_policies:
11 - cluster: "service1-mirror"
12 - match:
13 prefix: "/service/2"
14 route:
15 cluster: service2
16 request_mirror_policies:
17 - cluster_header: "x-mirror-cluster"
18
19 http_filters:
路徑 /service/2
的請求會根據 x-mirror-cluster
標頭的存在和值進行動態鏡像。
此路徑的所有請求都會轉發到 service2
叢集,並且也會鏡像到標頭中命名的叢集。
例如,如果我們傳送具有標頭 x-mirror-cluster: service2-mirror
的請求,則該請求將會轉發到 service2-mirror
叢集。
envoy.yaml
1 virtual_hosts:
2 - name: backend
3 domains:
4 - "*"
5 routes:
6 - match:
7 prefix: "/service/1"
8 route:
9 cluster: service1
10 request_mirror_policies:
11 - cluster: "service1-mirror"
12 - match:
13 prefix: "/service/2"
14 route:
15 cluster: service2
16 request_mirror_policies:
17 - cluster_header: "x-mirror-cluster"
18
19 http_filters:
警告
允許請求標頭決定將請求鏡像到哪個叢集在受信任的環境中最為有用。
例如,下游 Envoy 實例 (或其他作為代理的應用程式) 可能會自動將此標頭新增到請求,以便由使用請求鏡像策略配置的上游 Envoy 實例進行處理。
如果您允許根據請求標頭進行動態鏡像,您可能希望限制哪些請求可以設定或代理標頭。
注意
Envoy 只會將其從主要叢集收到的回應傳回給用戶端。
在此範例中,來自 service1
和 service2
叢集的回應將會傳送到用戶端。service1-mirror
或 service2-mirror
叢集傳回的回應不會傳回給用戶端。
這也表示鏡像叢集中請求處理的任何問題或延遲都不會影響用戶端收到的回應。
步驟 1: 建立沙箱
變更到 examples/route-mirror
目錄。
$ pwd
envoy/examples/route-mirror
$ docker compose build
$ docker compose up -d
$ docker compose ps
NAME COMMAND SERVICE STATUS PORTS
route-mirror-envoy-front-proxy-1 "/docker-entrypoint.…" envoy-front-proxy running 0.0.0.0:10000->10000/tcp, :::10000->10000/tcp
route-mirror-service1-1 "python3 /code/servi…" service1 running (healthy)
route-mirror-service1-mirror-1 "python3 /code/servi…" service1-mirror running (healthy)
route-mirror-service2-1 "python3 /code/servi…" service2 running (healthy)
route-mirror-service2-mirror-1 "python3 /code/servi…" service2-mirror running (healthy)
步驟 2: 向靜態鏡像路由發出請求
讓我們向 envoy-front-proxy
服務傳送請求,該服務會將請求轉發到 service1
,也會將請求傳送到服務 1 鏡像 service1-mirror
。
$ curl localhost:10000/service/1
Hello from behind Envoy (service 1)!
步驟 3: 檢視靜態鏡像請求的日誌
service1
和 service1-mirror
服務的日誌顯示,service1
和 service1-mirror
服務都收到了步驟 2 中發出的請求。
您也可以看到,對於傳送到 service1-mirror
服務的請求,Envoy 修改了 Host
標頭,使其主機名稱中具有 -shadow
後綴。
$ docker compose logs service1
...
Host: localhost:10000
192.168.80.6 - - [06/Oct/2022 03:56:22] "GET /service/1 HTTP/1.1" 200 -
$ docker compose logs service1-mirror
...
Host: localhost-shadow:10000
192.168.80.6 - - [06/Oct/2022 03:56:22] "GET /service/1 HTTP/1.1" 200 -
步驟 4: 向依據請求標頭鏡像的路由發出請求
在此步驟中,我們將會看到一個示範,其中請求透過標頭 x-mirror-cluster
指定 Envoy 將請求鏡像到哪個叢集。
讓我們向 envoy-front-proxy
服務傳送請求,該服務會將請求轉發到 service2
,也會將請求鏡像到名為 service2-mirror
的叢集。
$ curl --header "x-mirror-cluster: service2-mirror" localhost:10000/service/2
Hello from behind Envoy (service 2)!
步驟 5: 檢視依據請求標頭鏡像的請求的日誌
日誌顯示 service2
和 service2-mirror
服務都收到了請求。
$ docker compose logs service2
...
Host: localhost:10000
192.168.80.6 - - [06/Oct/2022 03:56:22] "GET /service/2 HTTP/1.1" 200 -
$ docker compose logs service2-mirror
...
Host: localhost-shadow:10000
192.168.80.6 - - [06/Oct/2022 03:56:22] "GET /service/2 HTTP/1.1" 200 -
您也可以看到,對於傳送到 service2-mirror
服務的請求,Envoy 修改了 Host
標頭,使其主機名稱中具有 -shadow
後綴。
步驟 6: 請求標頭中缺少或無效的叢集名稱
如果您在傳送到 service2
的請求中未指定 x-mirror-cluster
,或者指定了未知的叢集,則請求將不會被鏡像,但會以正常方式處理。
$ curl localhost:10000/service/2
Hello from behind Envoy (service 2)!
$ curl --header "x-mirror-cluster: service2-mirror-non-existent" localhost:10000/service/2
Hello from behind Envoy (service 2)!
檢視 service2
和 service2-mirror
服務的日誌。
$ docker compose logs service2
...
Host: localhost:10000
192.168.80.6 - - [06/Oct/2022 03:56:22] "GET /service/2 HTTP/1.1" 200 -
$ docker compose logs service2-mirror
# No new logs
另請參閱
- Envoy 請求鏡像策略
深入瞭解 Envoy 的請求鏡像策略。