envoy&istio 对接ratelimit 实现限流之envoy配置

envoy与ratelimit对接需要完成两步,1 启用ratelimit 过滤器,2 配置触发条件。

一、启用ratelimit 过滤器

envoy要与ratelimit服务对接,需要在lds的http_filter配置上启用ratelimit filter,启用方式如下

 1 http_filters:
 2                   - name: envoy.filters.http.ratelimit
 3                     typed_config:
 4                       "@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
 5                       domain: rl
 6                       request_type: external
 7                       stage: 0
 8                       rate_limited_as_resource_exhausted: true
 9                       failure_mode_deny: false
10                       enable_x_ratelimit_headers: DRAFT_VERSION_03
11                       rate_limit_service:
12                         grpc_service:
13                           envoy_grpc:
14                             cluster_name: ratelimit
15                         transport_api_version: V3
16                   - name: envoy.filters.http.router
17                     typed_config:
18                       "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

对于七层协议,router filter一定要放在最后!

添加限流过滤器,指定限流服务器、domain、request_type
domain 与限流服务中定义的domain 保持一致,不一致不会报错,限流配置会失效。
request_type: 什么类型的请求使用限流服务,支持的配置 internal、external、both
判断规则,请求头中x-envoy-internal为true 则请求类型为internal,如果request_type 设置为external则不应用限流,反之亦然。
当request_type设置为both时 所有请求都应用限流(不一定触发,后面还有触发设置)
enableXRatelimitHeaders: 启用限流响应头类型,即当请求被限流后,envoy网关会在响应头中添加标头
X-RateLimit-Limit-:指示当前时间窗口中与客户端关联的请求配额,后跟配额策略的描述,例如:10, 10;w=1;name="per-ip", 1000;w=3600
X-RateLimit-Remaining-:当前时间窗口内剩余请求数量
X-RateLimit_Rest-: 限流重置剩余秒

完整配置如下图所示

二、配置触发规则

 1  - match:
 2       prefix: /test/testlimit/
 3     route:
 4       cluster: k8s_proxy
 5       rateLimits:
 6         - actions:
 7             - requestHeaders:
 8                 headerName: :path
 9                 descriptorKey: abc
10         - actions:
11             - requestHeaders:
12                 headerName: :path
13                 descriptorKey: minute100
14         - actions:  
15             - requestHeaders:
16                 headerName: userid
17                 descriptorKey: userid
18             - requestHeaders:
19                 headerName: :path
20                 descriptorKey: path
21         - actions:
22             - requestHeaders:
23                 headerName: userid
24                 descriptorKey: useridminute
25             - requestHeaders:
26                 headerName: :path
27                 descriptorKey: path

在vhds的路由配置中添加如上配置

该配置设置在路由层面,详细描述限流触发规则,每个actions 是同级别的代表它们同时生效。

actions内部是规则链,顺序很重要,例如示例中的 第三个actions 它触发的规则是 userid_useridvalue_path_pathvalue

参考地址 https://www.envoyproxy.io/docs/envoy/v1.28.0/api-v3/config/route/v3/route_components.proto#envoy-v3-api-msg-config-route-v3-ratelimit

特别备注

1. 对于每个请求,如果满足限流规则,envoy会将触发的key一次性传递给限流服务。
2. 如果限流服务不可用,则envoy直接放过请求,不做限流
3. 触发规则的统计是累加的,如果要放宽限制,要考虑累加的超限数量。 例如 10次/小时,如果超限了,客户端仍旧访问了100次即当前小时内该接口/服务被访问了110次/小时,业务找运维放宽限制至100次/小时,这个时候客户端访问依旧超限

posted @ 2024-04-02 18:52  王鹏翀  阅读(73)  评论(0编辑  收藏  举报