路由鏡像策略

這個簡單的範例示範了 Envoy 使用請求鏡像策略的請求鏡像功能。

傳入的請求由 envoy-front-proxy 服務接收。

路徑 /service/1 的請求會被靜態鏡像。

每個請求由 service1 叢集處理,此外,還會轉發到 service1-mirror 叢集

具有靜態路由鏡像策略的 Envoy 組態 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 組態 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 只會將其從主要叢集收到的回應傳回給用戶端。

在此範例中,來自 service1service2 叢集的回應將會傳送到用戶端。service1-mirrorservice2-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: 檢視靜態鏡像請求的日誌

service1service1-mirror 服務的日誌顯示,service1service1-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: 檢視依據請求標頭鏡像的請求的日誌

日誌顯示 service2service2-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)!

檢視 service2service2-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 的請求鏡像策略。