路由镜像策略

此简单示例演示了 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 请求镜像策略的更多信息。