ai-token-ratelimit外掛程式實現了基於特定索引值的token限流,索引值來源可以是 URL 參數、HTTP 要求頭、用戶端 IP 位址、consumer 名稱、cookie中 key 名稱。
此外掛程式功能生效,需要同時開啟AI 可觀測外掛程式,實現 token 數的統計。
運行屬性
外掛程式執行階段:預設階段 外掛程式執行優先順序:600
配置說明
配置項 | 資料類型 | 必填 | 預設值 | 說明 |
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 | 否, | - | 配置擷取限流索引值的來源 HTTP 要求頭名稱。 |
limit_by_param | string | 否, | - | 配置擷取限流索引值的來源 URL 參數名稱。 |
limit_by_consumer | string | 否, | - | 根據 consumer 名稱進行限流,無需添加實際值。 |
limit_by_cookie | string | 否, | - | 配置擷取限流索引值的來源 Cookie中 key 名稱。 |
limit_by_per_header | string | 否, | - | 按規則匹配特定 HTTP 要求頭,並對每個要求標頭分別計算限流,配置擷取限流索引值的來源 HTTP 要求頭名稱,配置 |
limit_by_per_param | string | 否, | - | 按規則匹配特定 URL 參數,並對每個參數分別計算限流,配置擷取限流索引值的來源 URL 參數名稱,配置 |
limit_by_per_consumer | string | 否, | - | 按規則匹配特定 consumer,並對每個 consumer 分別計算限流,根據 consumer 名稱進行限流,無需添加實際值,配置 |
limit_by_per_cookie | string | 否, | - | 按規則匹配特定 Cookie,並對每個 Cookie 分別計算限流,配置擷取限流索引值的來源 Cookie中 key 名稱,配置 |
limit_by_per_ip | string | 否, | - | 按規則匹配特定 IP,並對每個 IP 分別計算限流,配置擷取限流索引值的來源 IP 參數名稱,從要求標頭擷取,以 |
limit_keys | array of object | 是 | - | 配置匹配索引值後的限流次數。 |
limit_keys中每一項的配置欄位說明。
配置項 | 資料類型 | 必填 | 預設值 | 說明 |
key | string | 是 | - | 匹配的索引值, |
token_per_second | int | 否, | - | 允許每秒請求Token數。 |
token_per_minute | int | 否, | - | 允許每分鐘請求Token數。 |
token_per_hour | int | 否, | - | 允許每小時請求Token數。 |
token_per_day | int | 否, | - | 允許每天請求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,進行區別限流。
rule_name: default_rule
rule_items:
- limit_by_param: apikey
limit_keys:
- key: 9a342114-ba8a-11ec-b1bf-00163e1250b5
token_per_minute: 10
- key: a6a6d7f2-ba8a-11ec-bec2-00163e1250b5
token_per_hour: 100
- limit_by_per_param: apikey
limit_keys:
# Regex,匹配以a開頭的所有字串,每個apikey對應的請求10qds
- key: "regexp:^a.*"
token_per_second: 10
# Regex,匹配以b開頭的所有字串,每個apikey對應的請求100qd
- key: "regexp:^b.*"
token_per_minute: 100
# 兜底用,匹配所有請求,每個apikey對應的請求1000qdh
- key: "*"
token_per_hour: 1000
redis:
service_name: redis.static識別要求標頭 x-ca-key,進行區別限流。
rule_name: default_rule
rule_items:
- limit_by_header: x-ca-key
limit_keys:
- key: 102234
token_per_minute: 10
- key: 308239
token_per_hour: 10
- limit_by_per_header: x-ca-key
limit_keys:
# Regex,匹配以a開頭的所有字串,每個apikey對應的請求10qds
- key: "regexp:^a.*"
token_per_second: 10
# Regex,匹配以b開頭的所有字串,每個apikey對應的請求100qd
- key: "regexp:^b.*"
token_per_minute: 100
# 兜底用,匹配所有請求,每個apikey對應的請求1000qdh
- key: "*"
token_per_hour: 1000
redis:
service_name: redis.static根據要求標頭 x-forwarded-for,擷取對端IP,進行區別限流。
rule_name: default_rule
rule_items:
- limit_by_per_ip: from-header-x-forwarded-for
limit_keys:
# 精確ip
- key: 1.1.1.1
token_per_day: 10
# ip段,符合這個ip段的ip,每個ip 100qpd
- key: 1.1.1.0/24
token_per_day: 100
# 兜底用,即預設每個ip 1000qpd
- key: 0.0.0.0/0
token_per_day: 1000
redis:
service_name: redis.static識別consumer,進行區別限流。
rule_name: default_rule
rule_items:
- limit_by_consumer: ''
limit_keys:
- key: consumer1
token_per_second: 10
- key: consumer2
token_per_hour: 100
- limit_by_per_consumer: ''
limit_keys:
# Regex,匹配以a開頭的所有字串,每個consumer對應的請求10qds
- key: "regexp:^a.*"
token_per_second: 10
# Regex,匹配以b開頭的所有字串,每個consumer對應的請求100qd
- key: "regexp:^b.*"
token_per_minute: 100
# 兜底用,匹配所有請求,每個consumer對應的請求1000qdh
- key: "*"
token_per_hour: 1000
redis:
service_name: redis.static識別cookie中的索引值對,進行區別限流。
rule_name: default_rule
rule_items:
- limit_by_cookie: key1
limit_keys:
- key: value1
token_per_minute: 10
- key: value2
token_per_hour: 100
- limit_by_per_cookie: key1
limit_keys:
# Regex,匹配以a開頭的所有字串,每個cookie中的value對應的請求10qds
- key: "regexp:^a.*"
token_per_second: 10
# Regex,匹配以b開頭的所有字串,每個cookie中的value對應的請求100qd
- key: "regexp:^b.*"
token_per_minute: 100
# 兜底用,匹配所有請求,每個cookie中的value對應的請求1000qdh
- key: "*"
token_per_hour: 1000
rejected_code: 200
rejected_msg: '{"code":-1,"msg":"Too many requests"}'
redis:
service_name: redis.static