3、Envoy使用案例
Envoy使用案例
目录
[toc]
本节实战
实战名称 |
---|
🚩 实战:前端代理-2023.11.2(测试成功) |
🚩 实战:流量镜像-2023.11.4(测试成功) |
🚩 实战:故障注入过滤器-2023.11.4(测试成功) |
🚩 实战:MySQL 过滤器-2023.11.4(测试成功) |
🚩 实战:Golang HTTP 过滤器-2023.11.4(测试成功) |
前言
前面我们已经学习了 Envoy 的基础知识,接下来我们就可以来学习如何使用 Envoy 来进行流量管理了。Envoy 作为一个高性能的边缘和内部代理,可以用于许多不同的场景。在本节中,我们将介绍 Envoy 的流量管理功能,包括路由、负载平衡、故障转移、故障注入、速率限制和等方面。
这些案例都位于 Envoy 官方代码仓库中的 examples 目录下,我们可以在这里找到各种使用案例。
所以我们可以先 Clone 一份 Envoy 的代码仓库到本地,然后在本地的 examples 目录下面找到对应的案例进行学习。
$ git clone https://github.com/envoyproxy/envoy.git
1、流量拆分
Envoy 的路由器可以将流量拆分到跨两个或多个上游集群的虚拟主机中的路由,有两种常见的用例。
-
- 版本升级: 一条路由的流量逐渐从一个集群转移到另一个集群。
-
- A/B 测试: 同时测试同一服务的两个或多个版本,路由的流量必须在运行同一服务的不同版本的集群之间分配。
1.两个上游之间的流量转移
路由配置中的运行时对象决定选择特定路由的概率。通过使用 runtime_fraction
配置,可以逐渐将虚拟主机中特定路由的流量从一个群集转移到另一个群集。比如以下示例配置,其中在 Envoy 配置文件中声明了名为 helloworld
的服务的两个版本 helloworld_v1
和 helloworld_v2
。
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
集群提供服务。
2.跨多个上游的流量拆分
现在我们有三个(v1、v2 和 v3)而不是两个版本。可以使用 weighted_clusters
选项可以用来指定每个上游集 群的权重来在三个版本之间平均分配流量(比如 33%、33%、34%)。
与前面的示例不同,一个路由条目就够了。路由中的 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
默认情况下,权重的和必须等于 100。然后就可以通过运行时变量
routing.traffic_split.helloworld.helloworld_v1
、
routing.traffic_split.helloworld.helloworld_v2
和
routing.traffic_split.helloworld.helloworld_v3
对每个集群的权重进行动态地调整。