跳到主要内容

proxy-mirror

proxy-mirror 插件会将传入请求复制到次级上游,同时网关仍将原始请求发送到其配置的上游。它可以镜像每个请求,也可以按比例采样流量,用于故障排除、安全检查、测试和分析。网关会忽略镜像上游的响应。

示例​

流量镜像需要一个网关可以访问的次级上游。以下示例使用 NGINX 作为该上游,并配置控制镜像请求的超时时间。

镜像部分流量​

以下示例将大约 50% 的请求镜像到次级 NGINX 服务,同时所有请求仍会发送到路由的原始上游。

启动一个示例 NGINX 服务器以接收镜像流量:

将 GATEWAY_CONTAINER 设置为正在运行的 APISIX 或 API7 Gateway 容器名称。创建专用网络并将网关连接到该网络:

export GATEWAY_CONTAINER=replace-with-gateway-container-name

docker network create gateway-mirror-net
docker network connect gateway-mirror-net "$GATEWAY_CONTAINER"

在同一网络中启动 NGINX:

docker run -d --name mirror-receiver \
--network gateway-mirror-net \
-p 127.0.0.1:8081:80 \
nginx:1.30.5-alpine

等待 NGINX 可用:

until curl -fsS "http://127.0.0.1:8081" > /dev/null; do
sleep 1
done

设置 Admin API 和 ADC 示例使用的镜像接收端 URL:

export MIRROR_RECEIVER_URL=http://mirror-receiver

创建一条启用 proxy-mirror 的路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "traffic-mirror-route",
"uri": "/get",
"plugins": {
"proxy-mirror": {
"host": "$MIRROR_RECEIVER_URL",
"sample_ratio": 0.5
}
},
"upstream": {
"nodes": {
"httpbin.org": 1
},
"type": "roundrobin"
}
}
EOF

❶ host:配置接收镜像请求的上游协议和地址。

❷ sample_ratio:将采样率配置为 0.5,以镜像 50% 的流量。

向该路由发送 20 个请求:

for i in $(seq 1 20); do
curl -fsS "http://127.0.0.1:9080/get" > /dev/null || exit 1
done

发送到原始上游的 20 个请求都应成功。如果任何请求返回错误,该命令会提前退出。

检查 NGINX 访问日志:

docker logs mirror-receiver 2>&1 | grep '"GET /get HTTP/1.1" 404'

日志中应包含大约 10 个请求。由于每个请求都是独立采样,实际数量可能有所不同。NGINX 的默认配置未定义 /get,因此会对镜像请求返回 404;该响应会被忽略,不会影响原始上游的响应。

配置镜像超时​

以下示例更新镜像请求使用的连接、读取和发送超时时间。当镜像上游响应缓慢或不可用时,较短的超时时间可以限制请求占用连接和网关资源的时长。

连接、读取和发送超时时间默认为 60 秒。若要更改这些值,请配置网关静态设置:

在网关配置文件中添加或更新以下配置:

config.yaml
plugin_attr:
proxy-mirror:
timeout:
connect: 2000ms
read: 2000ms
send: 2000ms

重新加载网关以使更改生效。