proxy-mirror

描述

proxy-mirror 插件提供了镜像客户端请求的能力。流量镜像是将线上真实流量拷贝到镜像服务中,以便在不影响线上服务的情况下,对线上流量或请求内容进行具体的分析。

proxy-mirror - 图1注意

镜像请求返回的响应会被忽略。

参数

名称类型必选项默认值有效值描述
hoststring指定镜像服务的地址,地址中需要包含 schemahttp(s)grpc(s)),但不能包含 path 部分。例如 http://127.0.0.1:9797
pathstring指定镜像请求的路径。如果不指定,则默认会使用当前路径。如果是为了镜像 grpc 流量,这个选项不再适用。
path_concat_modestringreplace[“replace”, “prefix”]当指定镜像请求的路径时,设置请求路径的拼接模式。replace 模式将会直接使用 path 作为镜像请求的路径。prefix 模式将会使用 path + 来源请求 URI 作为镜像请求的路径。当然如果是为了镜像 grpc 流量,这个选项也不再适用。
sample_rationumber1[0.00001, 1]镜像请求的采样率。当设置为 1 时为全采样。

启用插件

以下示例展示了如何在指定路由上启用 proxy-mirror 插件:

proxy-mirror - 图2note

您可以这样从 config.yaml 中获取 admin_key 并存入环境变量:

  1. admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')
  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H "X-API-KEY: $admin_key" -X PUT -d '
  3. {
  4. "plugins": {
  5. "proxy-mirror": {
  6. "host": "http://127.0.0.1:9797"
  7. }
  8. },
  9. "upstream": {
  10. "nodes": {
  11. "127.0.0.1:1999": 1
  12. },
  13. "type": "roundrobin"
  14. },
  15. "uri": "/hello"
  16. }'

指定镜像子请求的超时时间

我们可以在 conf/config.yaml 文件内的 plugin_attr 中指定子请求的超时时间。由于镜像请求是以子请求的方式实现,子请求的延迟将会导致原始请求阻塞,直到子请求完成,才可以恢复正常。因此可以配置超时时间,来避免子请求出现过大的延迟而影响原始请求。

名称类型默认值描述
connectstring60s镜像请求到上游的连接超时时间。
readstring60sAPISIX 与镜像服务器维持连接的时间;如果在该时间内,APISIX 没有收到镜像服务器的响应,则关闭连接。
sendstring60sAPISIX 与镜像服务器维持连接的时间;如果在该时间内,APISIX 没有发送请求,则关闭连接。
  1. plugin_attr:
  2. proxy-mirror:
  3. timeout:
  4. connect: 2000ms
  5. read: 2000ms
  6. send: 2000ms

测试插件

proxy-mirror - 图3提示

因为指定的镜像地址是 127.0.0.1:9797,所以验证此插件是否正常工作需要在端口为 9797 的服务上确认。

我们可以通过 python 启动一个简单的服务:

  1. python -m http.server 9797

按上述配置启用插件后,使用 curl 命令请求该路由,请求将被镜像到所配置的主机上:

  1. curl http://127.0.0.1:9080/hello -i

返回的 HTTP 响应头中如果带有 200 状态码,则表示插件生效:

  1. HTTP/1.1 200 OK
  2. ...
  3. hello world

删除插件

当你需要删除该插件时,可以通过以下命令删除相应的 JSON 配置,APISIX 将会自动重新加载相关配置,无需重启服务:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H "X-API-KEY: $admin_key" -X PUT -d '
  3. {
  4. "uri": "/hello",
  5. "plugins": {},
  6. "upstream": {
  7. "type": "roundrobin",
  8. "nodes": {
  9. "127.0.0.1:1999": 1
  10. }
  11. }
  12. }'