Envoy路由器支持将流量分发到两个或更多上游虚拟主机群集的路由。有两种常见的场景。
版本升级:到一条路由的流量逐渐从一个集群转移到另一个集群。更详细地描述参见流量转移部分。
在路由运行时配置对象中,确定选择指定路由(以及它的集群)的概率。通过使用运行时配置,虚拟主机中指定路由的流量可逐渐从一个集群转移到另一个集群。参考以下配置示例,其中名为的服务,在Envoy配置文件中声明helloworld_v1
和helloworld_v2
两个版本。
Envoy匹配策略是匹配第一个路由。如果路由具有运行时配置对象,则会根据使用运行时值进行匹配(如果没有指定值,则为默认值)。因此,通过在上面的例子中紧挨着的两条路由配置,通过在第一个路由中指定一个运行时对象,并且改变随着时间推移,修改该运行时对象的值来实现流量转移。以下是完成任务所需的大致操作顺序。
- 在开始时,将
routing.traffic_shift.helloworld
设置为100
,以便所有对helloworld
服务的请求,都与v1的路由匹配,并由helloworld_v1
集群提供服务。 - 要开始将流量转移到
helloworld_v2
集群时,请将routing.traffic_shift.helloworld
设置为0<x<100
范围内。例如,设置90
,对helloworld
虚拟主机的每10个请求中,有1个将不匹配v1的路由,并将落入v2路由,由helloworld_v2
集群提供服务。 - 逐渐设置
routing.traffic_shift.helloworld
中的值变小,以便更大比例的请求匹配到v2路由。 - 当
routing.traffic_shift.helloworld
设置为0时,对虚拟主机的请求将不会匹配v1路由。现在所有的流量都会流向v2路由,并由helloworld_v2
集群提供服务。
多上游主机的流量分流
与前面的例子不同,一个路由条目就足够了。路由中的weighted_clusters
配置可用于指定多个上游群集以及引导每个发送到上游群集的流量百分比权重。
{
"virtual_hosts": [
{
"name": "helloworld",
"domains": ["*"],
"routes": [
{
"prefix": "/",
"weighted_clusters": {
"clusters" : [
{ "name" : "helloworld_v2", "weight" : 33 },
{ "name" : "helloworld_v3", "weight" : 34 }
]
}
}
]
}
]
}
}
可以使用以下运行时变量动态调整分配给每个群集的权重:routing.traffic_split.helloworld.helloworld_v1
routing.traffic_split.helloworld.helloworld_v2
。