AI Token 限流
功能说明
ai-token-ratelimit
插件实现了基于特定键值实现 token 限流,键值来源可以是 URL 参数、HTTP 请求头、客户端 IP 地址、consumer 名称、cookie 中 key 名称。
配置说明
配置项 | 数据类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
rule_name | string | 是 | - | 限流规则名称,根据限流规则名称 + 限流类型 + 限流 key 名称 + 限流 key 对应的实际值来拼装 redis key |
rule_items | array of object | 是 | - | 限流规则项,按照 rule_items 下的排列顺序,匹配第一个 rule_item 后命中限流规则,后续规则将被忽略 |
rejected_code | int | 否 | 429 | 请求被限流时,返回的 HTTP 状态码 |
rejected_msg | string | 否 | Too many requests | 请求被限流时,返回的响应体 |
redis | object | 是 | - | redis相关配置 |
rule_items
中每一项的配置字段说明。
配置项 | 数据类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
limit_by_header | string | 否,limit_by_* 中选填一项 | - | 配置获取限流键值的来源 HTTP 请求头名称 |
limit_by_param | string | 否,limit_by_* 中选填一项 | - | 配置获取限流键值的来源 URL 参数名称 |
limit_by_consumer | string | 否,limit_by_* 中选填一项 | - | 根据 consumer 名称进行限流,无需添加实际值 |
limit_by_cookie | string | 否,limit_by_* 中选填一项 | - | 配置获取限流键值的来源 Cookie中 key 名称 |
limit_by_per_header | string | 否,limit_by_* 中选填一项 | - | 按规则匹配特定 HTTP 请求头,并对每个请求头分别计算限流,配置获取限流键值的来源 HTTP 请求头名称,配置 limit_keys 时支持正则表达式或 * |
limit_by_per_param | string | 否,limit_by_* 中选填一项 | - | 按规则匹配特定 URL 参数,并对每个参数分别计算限流,配置获取限流键值的来源 URL 参数名称,配置 limit_keys 时支持正则表达式或 * |
limit_by_per_consumer | string | 否,limit_by_* 中选填一项 | - | 按规则匹配特定 consumer,并对每个 consumer 分别计算限流,根据 consumer 名称进行限流,无需添加实际值,配置limit_keys 时支持正则表达式或* |
limit_by_per_cookie | string | 否,limit_by_* 中选填一项 | - | 按规则匹配特定 Cookie,并对每个 Cookie 分别计算限流,配置获取限流键值的来源 Cookie 中 key 名称,配置 limit_keys 时支持正则表达式或* |
limit_by_per_ip | string | 否,limit_by_* 中选填一项 | - | 按规则匹配特定 IP,并对每个 IP 分别计算限流,配置获取限流键值的来源 IP 参数名称,从请求头获取,以 from-header-对应的header名 ,示例:from-header-x-forwarded-for ,直接获取对端 socket ip,配置为 from-remote-addr |
limit_keys | array of object | 是 | - | 配置匹配键值后的限流次数 |
limit_keys
中每一项的配置字段说明。
配置项 | 数据类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
key | string | 是 | - | 匹配的键值,limit_by_per_header ,limit_by_per_param ,limit_by_per_consumer ,limit_by_per_cookie 类型支持配置正则表达式(以 regexp: 开头后面跟正则表达式)或者 * (代表所有),正则表达式示例:regexp:^d.* (以d开头的所有字符串);limit_by_per_ip 支持配置 IP 地址或 IP 段 |
token_per_second | int | 否,token_per_second ,token_per_minute ,token_per_hour ,token_per_day 中选填一项 | - | 允许每秒请求 token 数 |
token_per_minute | int | 否,token_per_second ,token_per_minute ,token_per_hour ,token_per_day 中选填一项 | - | 允许每分钟请求 token 数 |
token_per_hour | int | 否,token_per_second ,token_per_minute ,token_per_hour ,token_per_day 中选填一项 | - | 允许每小时请求 token 数 |
token_per_day | int | 否,token_per_second ,token_per_minute ,token_per_hour ,token_per_day 中选填一项 | - | 允许每天请求 token 数 |
redis
中每一项的配置字段说明。
配置项 | 数据类型 | 必填 | 默认值 | 说明 |
---|---|---|---|---|
service_name | string | 必填 | - | redis 服务名称,带服务类型的完整 FQDN 名称,例如 my-redis.dns、redis.my-ns.svc.cluster.local |
service_port | int | 否 | 服务类型为固定地址(static service)默认值为 80,其他为 6379 | 输入 redis 服务的服务端口 |
username | string | 否 | - | redis 用户名 |
password | string | 否 | - | redis 密码 |
timeout | int | 否 | 1000 | redis 连接超时时间,单位毫秒 |
配置示例
识别请求参数 apikey,进行区别限流
识别请求头 x-ca-key,进行区别限流
根据请求头 x-forwarded-for 获取对端 IP,进行区别限流
识别 consumer,进行区别限流
识别 cookie 中的键值对,进行区别限流
完整示例
AI Token 限流插件依赖 Redis 记录剩余可用的 token 数,因此首先需要部署 Redis 服务。
在本例中,使用通义千问作为 AI 服务提供商。另外还需要设置 AI 统计插件,因为 AI Token 限流插件依赖 AI 统计插件计算每次请求消耗的 token 数,以下配置限制每分钟的 input 和 output token 总数为 200 个。
注意,AI Token 限流插件中的 Redis 配置项 service_name
来自 McpBridge 中配置的服务来源,另外我们还需要在 McpBridge 中配置通义千问服务的访问地址。
分别创建两条路由规则。
触发限流效果如下: