如何为Envoy同一HTTP端点配置全局与单用户双重限流并同时生效?
问题解答
你的判断是正确的
现有配置中,Envoy的限流规则采用匹配即终止的逻辑:当请求匹配到第一个带x-api-token的嵌套规则后,就不会再匹配第二个全局规则,导致全局限流完全失效。
正确配置方案
要让单用户限流和全局限流同时生效(请求必须同时通过两个维度的限流检查才允许访问),需要调整限流动作和描述符的结构,让Envoy同时发起两个独立的限流查询:
1. 调整Rate Limit Actions配置
通过separator动作分隔出两个独立的查询维度,同时生成用户维度和全局维度的限流请求:
- actions: # 生成用户维度限流查询:路径 + API Token - request_headers: header_name: "x-api-token" descriptor_key: "x-api-token" - request_headers: header_name: ":path" descriptor_key: "path" # 用空分隔符生成第二个独立查询 - separator: separator: "" # 生成全局维度限流查询:仅路径 - request_headers: header_name: ":path" descriptor_key: "path"
2. 保留Rate Limit Descriptors配置
确保两个维度的规则独立存在,无需修改原描述符结构:
domain: my_app descriptors: # 单用户限流规则:特定路径下单个Token每分钟最多60次请求 - key: path value: /my/endpoint descriptors: - key: x-api-token rate_limit: unit: minute requests_per_unit: 60 # 全局限流规则:特定路径下所有请求每分钟最多600次请求 - key: path value: /my/endpoint rate_limit: unit: minute requests_per_unit: 600
配置说明
separator动作会让Envoy向限流服务发送两个独立的查询请求:一个包含path和x-api-token(用户维度),另一个仅包含path(全局维度)。- 只有当两个查询都通过限流检查时,请求才会被放行;任意一个维度触发限流阈值,请求都会被拒绝,完全符合你提出的限流需求。
内容的提问来源于stack exchange,提问作者unpollito
相关产品推荐
相关产品推荐

