流量切换/拆分
Envoy 的路由器可以将流量拆分到虚拟主机中路由的两个或多个上游集群。有两个常见的用例。
1. 版本升级:路由流量从一个集群逐渐转移到另一个集群。 流量切换 部分更详细地描述了这种情况。
2. A/B 测试或多变量测试: two or more versions
同一个服务的版本同时进行测试。路由的流量必须在运行不同版本服务的集群之间拆分。 流量拆分 部分更详细地描述了这种情况。
在两个上游之间切换流量
路由配置中的 运行时 对象决定选择特定路由(及其集群)的概率。通过使用 runtime_fraction 配置,可以将发送到虚拟主机中特定路由的流量从一个集群逐渐转移到另一个集群。考虑以下示例配置,其中服务的两个版本 helloworld_v1
和 helloworld_v2
名为 helloworld
在 Envoy 配置文件中声明。
virtual_hosts:
- name: www2
domains:
- '*'
routes:
- match:
prefix: /
runtime_fraction:
default_value:
numerator: 50
denominator: HUNDRED
runtime_key: routing.traffic_shift.helloworld
route:
cluster: helloworld_v1
- match:
prefix: /
route:
cluster: helloworld_v2
Envoy 使用 首次匹配 策略匹配路由。如果路由具有 runtime_fraction 对象,则请求将根据 runtime_fraction 值 (或默认值,如果没有指定值)进行额外匹配。因此,通过在上面的示例中将路由背靠背放置并在第一个路由中指定 runtime_fraction 对象,可以通过更改 runtime_fraction 值来实现流量切换。以下是完成任务所需的近似操作顺序。
一开始,将
routing.traffic_shift.helloworld
设置为100
,这样所有发送到helloworld
虚拟主机的请求都将与 v1 路由匹配,并由helloworld_v1
集群提供服务。要开始将流量切换到
helloworld_v2
集群,将routing.traffic_shift.helloworld
设置为值0 < x < 100
。例如,在90
时,发送到helloworld
虚拟主机的每 10 个请求中会有 1 个不会与 v1 路由匹配,并将继续匹配 v2 路由。逐渐降低
routing.traffic_shift.helloworld
中设置的值,以便更大的百分比请求与 v2 路由匹配。当
routing.traffic_shift.helloworld
设置为0
时,没有发送到helloworld
虚拟主机的请求将与 v1 路由匹配。现在所有流量都将继续匹配 v2 路由,并由helloworld_v2
集群提供服务。
跨多个上游拆分流量
再次考虑 helloworld
示例,现在有三个版本(v1、v2 和 v3)而不是两个。要将流量均匀地拆分到三个版本(即 33%, 33%, 34%
),可以使用 weighted_clusters
选项为每个上游集群指定权重。
与之前的示例不同,只需要一个 路由 条目。 weighted_clusters 路由中的配置块可用于指定多个上游集群以及指示发送到每个上游集群的流量 百分比 的权重。
virtual_hosts:
- name: www2
domains:
- '*'
routes:
- match: { prefix: / }
route:
weighted_clusters:
runtime_key_prefix: routing.traffic_split.helloworld
clusters:
- name: helloworld_v1
weight: 33
- name: helloworld_v2
weight: 33
- name: helloworld_v3
weight: 34
权重总和必须大于 0。在 V2 API 中, 总权重 默认值为 100,但可以修改以允许更精细的粒度。 总权重 现在已弃用,将使用每个 集群权重 与所有集群权重总和的相对值。
可以使用以下运行时变量动态调整分配给每个集群的权重: routing.traffic_split.helloworld.helloworld_v1
、 routing.traffic_split.helloworld.helloworld_v2
和 routing.traffic_split.helloworld.helloworld_v3
。