参数流量控制

最近更新时间:2023-06-26 10:26:32

我的收藏

操作场景

参数流控可以针对用户的请求参数以及用户在插件中设置的条件执行进行流控,参数流控配置支持如下特性:
支持秒、分钟、小时、天的流控维度
可以根据客户端请求参数、API 网关内置的系统参数设置条件,来执行不同的流控维度
可以使用单个参数、或多个参数的组合来设置流控
注意
参数流控插件和 基础流控插件 同属于流控插件,一个 API 上只能绑定一个流控插件。因此如果在API已绑定流控插件时,再次绑定流控插件,则会自动替换成最新选定的插件。

操作步骤

步骤1:创建插件

1. 登录 API 网关控制台
2. 在左侧导航栏,单击插件 > 系统插件,进入系统插件列表页。
3. 单击列表左上角的新建,插件类型选择参数流量控制



参数
是否必填
说明
开启默认策略
必填
是否开启默认策略;默认策略是 API 级别的流控,独立于所有的流控策略;每次请求时,会先校验默认流控,再校验流控策略。
默认流控值
开启默认策略后必填
默认流控值是指时长内一个 API 能够被访问的次数上限,可输入正整数。
默认控制时长
开启默认策略后必填
支持秒、分钟、小时、天四个单位,与默认流控值搭配使用。
限流策略
必填
设置针对参数的限流策略,同一个参数限流插件内最多创建10条限流策略,限流策略的配置项详见下文。
同一个参数限流插件内最多创建10条限流策略,每条限流策略中都有以下配置项:
参数
是否必填
说明
策略名称
必填
当前策略的名称,最多50个字符,要求同一插件下不同策略间名称不能一样。
权重
必填
可输入0-100之间的正整数,权重越大优先级越高,要求同一插件下不同策略间权重不能一样。
触发条件
选填
如果设置了条件,只有当条件符合时,才会执行此条流控策略。
请输入条件表达式,条件表达式的写作规范详见本文 注意事项 章节。
流控参数位置
必填
仅支持填写一个流控参数,需要选择位置并填写参数名。例如:Header.ClientIP 表示,针对 Header 中每个 ClientIP 参数的取值分别进行流控。
流控参数位置支持 Header、Query、Path。Path 参数代表完整 API 路径,不需要填写参数名称。
流控参数名称
必填
仅支持填写一个流控参数,需要选择位置并填写参数名。例如:Header.ClientIP 表示,针对 Header 中每个 ClientIP 参数的取值分别进行流控。
流控参数名称需要和流控参数位置搭配使用。Path 参数代表完整 API 路径,不需要填写参数名称。
流控值
必填
本条策略中针对流控参数的流控值,请输入正整数,必须与控制时长搭配使用。
控制时长
必填
支持秒、分钟、小时、天四个单位,与流控值搭配使用。

步骤2:绑定 API 并生效

1. 系统插件列表中选中刚刚创建好的插件,单击操作列的绑定 API
2. 在绑定 API 弹窗中选择服务和环境,并选择需要绑定插件的 API。



3. 单击确定,即可将插件绑定到 API,此时插件的配置已经对 API 生效。

原理详解




默认策略是 API 级别的流控,独立于所有的限流策略。每次请求时,会先校验默认策略,再校验限流策略。
一个插件中同时配置多条流控策略时,API 网关将按策略权重由大到小的顺序依次校验请求是否满足条件;只要有一条流控策略不满足则触发流控,拒绝请求。
校验单条流控策略时,若配置了条件表达式将先校验条件,通过条件校验后再进行参数校验;未配置条件表达式时将直接根据参数校验。
如果在流控策略中设置 header.userid 参数每分钟流控10次,针对请求中该参数的每个不同取值,都会分别按每分钟十次进行限流。

PluginData

{
"default_window":60, // 限流时间窗口,单位秒,取值 0 时默认限流关闭
"default_rate_limit":5, // 限流值,需要正整数
"strategies":[ // 参数限流策略列表,至少一个策略,最多 10 个策略
{
"name":"a", // 策略名称
"strategy_weight":0, // 策略执行优先级,数值高先执行,不允许重复
"parameters":[ // 限流参数列表,暂时支持 1 个参数
{
"type":"query", // 限流参数类型,取值范围:[query,header,path]
"name":"a" // 限流参数名称,参数类型为 path 时,参数为整个请求路径,不需要传 name
}
],
"rate_limit":1, // 策略限流值,需要正整数
"window":1, // 策略限流时间窗口,单位秒
"condition":"" // 策略触发条件,空字符串则为无条件执行
}
]
}

注意事项

参数流控插件的条件表达式与条件路由插件的条件表达式完全一致,写作方法请参见 条件表达式写作指南