跳到主要内容
版本:3.9.x

配置金丝雀流量转移

金丝雀流量转移(Canary traffic shifting)能够通过将少量流量逐渐路由到新的上游(upstreams),同时将大部分流量保持在稳定的默认上游,从而安全地测试新的上游。这种增量方法通过将潜在问题控制在有限的用户范围内来降低风险,让你能够在不影响更广泛用户群的情况下识别并解决问题。

备注

金丝雀流量转移与金丝雀发布不同,因为 API/服务版本是不变的。金丝雀发布是指同一 API/服务的两个版本的并发运行和可用。

先决条件

  1. 安装 API7 企业版
  2. 创建一个路由/headers

按权重转移流量

在这个示例中,你将把 10% 的流量引导到一个新的上游。其余 90% 的流量将继续转发到默认上游。

在测试完新上游后,考虑用新值重写默认上游配置,并删除插件以终止金丝雀过程。

  1. 从侧边导航栏选择你网关组的 已发布服务,然后点击你要修改的服务,例如版本为 1.0.0httpbin
  2. 在该服务下,从侧边导航栏选择 上游
  3. 连接配置 模块中,点击 编辑,在 连接配置 模块中,选择 node,然后点击 保存

    注意:由于 mock.api7.ai 强制使用 HTTPS 访问,上游需要配置为对 HTTPS 端点使用 443 端口。pass_host 参数必须更改为 node,以确保成功与上游握手。请根据你的实际情况进行调整。

  4. 点击 新增上游
  5. 在对话框中,执行以下操作:
    • 名称 字段中,输入 new upstream
    • 点击 新增节点 来调整节点的主机,使其指向新的后端。例如,使用 mock.api7.ai 作为主机,443 作为端口。
    • 点击 新增
  6. 在上游标题处(在 操作 按钮下方)点击 查看 ID 并复制以供使用。
  7. 在已发布的服务下,从侧边导航栏选择 插件
  8. 点击 新增插件
  9. 搜索 traffic-split 插件,然后点击 新增
  10. 在对话框中,执行以下操作:
  • 将以下配置添加到 JSON 编辑器

    {
    "rules": [
    {
    "weighted_upstreams": [
    {
    "upstream_id": "new_upstream_id", // 使用 upstream id, 而不是 upstream name
    "weight": 1
    },
    {
    "weight": 9
    }
    ]
    }
    ]
    }
  • 点击 新增

验证

通过发送 10 个请求来验证金丝雀规则:

for i in {1..10}; do "curl 127.0.0.1:9080/headers";  done

9 个请求将被发送到默认上游地址 httpbin.org,你将收到以下响应:

{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.74.0",
"X-Amzn-Trace-Id": "Root=1-6650ab7e-32c90eba787abbeb4e3dbb0c",
"X-Forwarded-Host": "127.0.0.1"
}
}

有 1 个请求将被发送到新上游地址 mock.api7.ai

{
"headers": {
"accept": "*/*",
"accept-encoding": "gzip, br",
"cf-connecting-ip": "159.89.160.194",
"cf-ipcountry": "IN",
"cf-ray": "888e28733f9604aa",
"cf-visitor": "{\"scheme\":\"https\"}",
"connection": "Keep-Alive",
"content-type": "application/json",
"host": "mock.api7.ai",
"user-agent": "curl/7.74.0",
"x-application-owner": "API7.ai",
"x-forwarded-for": "127.0.0.1",
"x-forwarded-host": "127.0.0.1",
"x-forwarded-port": "9080",
"x-forwarded-proto": "https",
"x-real-ip": "159.89.160.194",
"X-Application-Owner": "API7.ai",
"Content-Type": "application/json"
}
}

下面是此用例的交互式演示。点击并按照此演示中的步骤操作,你将更好地了解如何在 API7 企业版中使用它。

按条件转移流量:请求头

在此示例中,你将把带有 version = test 请求头的请求引导到新上游,而其余流量将继续发送到默认上游。该金丝雀规则适用于服务中的所有路由,并且不能应用于单个路由。

  1. 从侧边导航栏选择你网关组的 已发布服务,然后点击你要修改的服务,例如版本为 1.0.0httpbin
  2. 在该服务下,从侧边导航栏选择 上游
  3. 点击 新增上游
  4. 在对话框中,执行以下操作:
    • 名称 字段中,输入 new upstream
    • 点击 新增节点 来调整节点的主机,使其指向新的后端。例如,使用 mock.api7.ai 作为主机,443 作为端口。
    • 点击 Add
  5. 在上游标题处(在 操作 按钮下方)点击 查看 ID 并复制以供使用。
  6. 在已发布的服务下,从侧边导航栏选择 插件
  7. 点击 新增插件
  8. 搜索 traffic-split 插件,然后点击 新增
  9. 在对话框中,执行以下操作:
  • 将以下配置添加到 JSON 编辑器

    {
    "rules": [
    {
    "match": [
    {
    "vars": [
    [
    "version",
    "==",
    "test"
    ]
    ]
    }
    ],
    "weighted_upstreams": [
    {
    "upstream_id": "new_upstream_id", // 使用 upstream id, 而不是 upstream name
    "weight": 1
    },
    {
    "weight": 9
    }
    ]
    }
    ]
    }
  • 点击 Add

验证

通过发送请求来验证金丝雀规则:

  • 发送一个带有 version:test 请求头的请求:

    curl 127.0.0.1:9080/headers -H "version:test"

    你将收到来自新上游的以下响应:

    {
    "headers": {
    "accept": "*/*",
    "accept-encoding": "gzip, br",
    "cf-connecting-ip": "159.89.160.194",
    "cf-ipcountry": "IN",
    "cf-ray": "888e28733f9604aa",
    "cf-visitor": "{\"scheme\":\"https\"}",
    "connection": "Keep-Alive",
    "content-type": "application/json",
    "host": "mock.api7.ai",
    "user-agent": "curl/7.74.0",
    "x-application-owner": "API7.ai",
    "x-forwarded-for": "127.0.0.1",
    "x-forwarded-host": "127.0.0.1",
    "x-forwarded-port": "9080",
    "x-forwarded-proto": "https",
    "x-real-ip": "159.89.160.194",
    "X-Application-Owner": "API7.ai",
    "Content-Type": "application/json"
    }
    }
  • 发送一个带有错误请求头的请求:

    curl 127.0.0.1:9080/headers -H "version:new"

    你将收到来自默认上游的以下响应:

    {
    "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.74.0",
    "X-Amzn-Trace-Id": "Root=1-6650ab7e-32c90eba787abbeb4e3dbb0c",
    "X-Forwarded-Host": "127.0.0.1"
    }
    }
  • 发送一个没有请求头的请求:

    curl 127.0.0.1:9080/headers
  • 你将收到来自默认上游的以下响应:

    {
    "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.74.0",
    "X-Amzn-Trace-Id": "Root=1-6650ab7e-32c90eba787abbeb4e3dbb0c",
    "X-Forwarded-Host": "127.0.0.1"
    }
    }
  • 发送更多请求以测试新上游,直到它符合你的期望。

附加资源