实验4:重试
在这个实验中,我们将学习如何配置不同的重试策略。我们将使用 httpbin
Docker 镜像,因为我们可以向不同的路径(例如 /status/[statuscode]
)发送请求,而 httpbin
会以该状态码进行响应。
确保你有 httpbin
容器在 3030 端口监听。
docker run -d -p 3030:80 kennethreitz/httpbin
让我们创建 Envoy 配置,定义一个关于 5xx
响应的简单重试策略。我们还将启用管理接口,这样我们就可以在指标中看到重试的报告。
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: hello_service
http_filters:
- name: envoy.filters.http.router
route_config:
virtual_hosts:
- name: httpbin
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: httpbin
retry_policy:
retry_on: "5xx"
num_retries: 5
clusters:
- name: httpbin
connect_timeout: 5s
load_assignment:
cluster_name: single_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 3030
admin:
address:
socket_address:
address: 127.0.0.1
port_value: 9901
将上述 YAML 保存为 2-lab-4-retries-1.yaml
,然后运行 Envoy 代理:
func-e run -c 2-lab-4-retries-1.yaml
让我们向 /status/500
路径发送一个单一请求。
$ curl -v localhost:10000/status/500
...
< HTTP/1.1 500 Internal Server Error
< server: envoy
...
< content-length: 0
< x-envoy-upstream-service-time: 276
正如预期的那样,我们收到了一个 500 响应。另外,注意到 x-envoy-upstream-service-time
(上游主机处理该请求所花费的时间,以毫秒为单位)比我们发送 /status/200
请求时要大得多。
$ curl localhost:10000/status/200
...
< HTTP/1.1 200 OK
< server: envoy
...
< content-length: 0
< x-envoy-upstream-service-time: 2
这是因为 Envoy 执行了重试,但最后还是失败了。同样,如果我们在管理界面(http://localhost:9901/stats/prometheus)上打开统计页面,我们会发现代表重试次数的指标(envoy_cluster_retry_upstream_rq
)的数值为 5。
# TYPE envoy_cluster_retry_upstream_rq counter
envoy_cluster_retry_upstream_rq{envoy_response_code="500",envoy_cluster_name="httpbin"} 5