路由镜像策略
此简单示例演示了 Envoy 使用 请求镜像策略 的请求镜像功能。
传入请求由 envoy-front-proxy
服务接收。
路径为 /service/1
的请求将被静态镜像。
每个请求都由 service1
集群处理,此外,还会转发到 service1-mirror
集群
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
集群。
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 请求镜像策略的更多信息。