限流¶
当请求的路由或者虚拟主机有一个或者多个 限流配置 匹配到过滤级设置时,HTTP 限流过滤器将会调用限流服务。路由 可以选择包括虚拟主机的限流配置。多项配置可以同时应用到一个请求上。每项配置都会使描述符被发送到限流服务上。
如果限流服务被调用,并且有任何的描述符响应超出限制,则返回 429 响应。限流过滤器还会为响应设置 x-envoy-ratelimited 头部。
如果调用限流服务时发生错误,或者限流服务返回错误,并且 failure_mode_deny 的设置为 true,则返回 500 响应。
组合动作¶
路由或虚拟主机上的每个 限流动作 都会填充一个描述符条目。描述符条目的向量组成描述符。要创建更复杂的限流描述符,可以按任意顺序组合动作。描述符将按照配置中指定动作的顺序进行填充。
示例 1¶
例如,要生成如下的描述符:
("generic_key", "some_value")
("source_cluster", "from_cluster")
配置将会是:
actions:
- {source_cluster: {}}
- {generic_key: {descriptor_value: some_value}}
示例 2¶
如果动作中没有附加描述符条目,则配置中不会生成描述符。
对于以下配置:
actions:
- {source_cluster: {}}
- {remote_address: {}}
- {generic_key: {descriptor_value: some_value}}
如果请求未设置 x-forwarded-for,则不会生成描述符。
如果请求设置了 x-forwarded-for,则会生成如下的描述符:
("generic_key", "some_value")
("remote_address", "<trusted address from x-forwarded-for>")
("source_cluster", "from_cluster")
限流覆盖¶
限流动作 可以选择包含 限流覆盖。限制值将附加到动作产生的描述符中,并发送到限流服务,从而覆盖静态服务配置。
可以将覆盖配置为从指定的 动态元数据 下的 :ref: 键 <envoy_v3_api_msg_config.type.metadata.v3.MetadataKey> 中获取。如果该值配置错误或者键不存在,则覆盖配置将会被忽略。
示例 3¶
如下配置
actions:
- {generic_key: {descriptor_value: some_value}}
limit:
metadata_key:
key: test.filter.key
path:
- key: test
将查找动态元数据的值。这个值必须是有整数字段 “requests_per_unit” 和字符串字段 “unit”,可以解析为 RateLimitUnit 枚举 的结构。例如,使用如下动态元数据,则每小时限制 42 个请求的限流覆盖将被附加到限流描述符中。
test.filter.key:
test:
requests_per_unit: 42
unit: HOUR
统计¶
限流过滤器会输出 cluster.<route target cluster>.ratelimit. 命名空间下的统计信息。429 响应会被发送到常规集群 动态 HTTP 统计信息 中。
名称 |
类型 |
描述 |
---|---|---|
ok |
Counter |
处于限流服务限制之下的响应总数 |
error |
Counter |
与限流服务相关的错误总数 |
over_limit |
Counter |
超出限流服务限制的响应总数 |
failure_mode_allowed |
Counter |
出错但由于 failure_mode_deny 设置为 false 而被允许通过的请求总数。 |