Envoy 支持在同一虚拟主机内对不同路由进行流量分割,允许将流量分发到两个或多个上游集群。这对于版本升级和A/B测试等场景至关重要。
两个上游集群中分割流量
Envoy允许在两个上游集群之间进行流量转移,适用于逐步迁移版本。例如,假设有两个版本的服务 helloworld_v1
和 helloworld_v2
。通过使用 runtime_fraction
配置,你可以控制每个集群接收的请求比例。
以下是示例配置:
route_config:
virtual_hosts:
- name: hello_vhost
domains: ["hello.io"]
routes:
- match:
prefix: "/"
runtime_fraction:
default_value:
numerator: 0
denominator: HUNDRED
runtime_key: routing.hello_io
route:
cluster: hello_v1
- match:
prefix: "/"
route:
cluster: hello_v2
...
layered_runtime:
layers:
- name: static_layer
static_layer:
routing.hello_io: 90
在此配置中,最初可以将 routing.traffic_shift.helloworld
设置为 100
,以便所有请求都转发至 helloworld_v1
。逐渐减少该值,例如设置为 90
,将使 10% 的请求转发到 helloworld_v2
,最终达到 0
时,所有流量将完全转向 helloworld_v2
。
说明
denominator
为枚举类型,其值只能是HUNDRED
、TEN_THOUSAND
、MILLION
之一。layered_runtime
用于动态管理和调整多个运行时参数,提供灵活性和可扩展性。它允许通过多个层次的值来覆盖配置,实现实时控制。详见 Envoy 文档。
在多个上游集群间分割流量
当需要在多个版本(如 helloworld_v1
、helloworld_v2
和 helloworld_v3
)之间均匀分割流量时,使用 weighted_clusters
配置是一个有效的方案。以下是示例配置:
virtual_hosts:
- name: www2
domains:
- '*'
routes:
- match: { prefix: / }
route:
weighted_clusters:
runtime_key_prefix: routing.hello_io
clusters:
- name: helloworld_v1
weight: 1
- name: helloworld_v2
weight: 2
- name: helloworld_v3
weight: 3
在这个示例中,1/6 的流量被分配为到 helloworld_v1
,2/6 的流量到 helloworld_v2
,而 3/6 的流量分配给 helloworld_v3
。权重可以动态调整,确保流量分发的灵活性。你还可以通过 layer_runtime
、和 runtime_key_prefix
动态配置权重。详见 Envoy 文档。