cluster-key-rate-limit 外掛程式基於 Redis 實現叢集限流,適用於需要跨多個 Higress Gateway 執行個體實現全域一致速率限制的情境。 限流所使用的 Key 可以來源於 URL 參數、HTTP 要求頭、用戶端 IP 位址、消費者名稱或 Cookie 中的 Key。
運行屬性
外掛程式執行階段:預設階段 外掛程式執行優先順序:20
配置說明
配置項 | 類型 | 必填 | 預設值 | 說明 |
rule_name | string | 是 | - | 限流規則名稱,根據限流規則名稱 + 限流類型 + 限流 key 名稱 + 限流 key 對應的實際值來拼裝 redis key |
rule_items | array of object | 是 | - | 限流規則項,按照 rule_items 下的排列順序,匹配第一個 rule_item 後命中限流規則,後續規則將被忽略 |
show_limit_quota_header | bool | 否 | false | 回應標頭中是否顯示 |
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 | 是 | - | 匹配的索引值, |
query_per_second | int | 否, | - | 允許每秒請求次數 |
query_per_minute | int | 否, | - | 允許每分鐘請求次數 |
query_per_hour | int | 否, | - | 允許每小時請求次數 |
query_per_day | int | 否, | - | 允許每天請求次數 |
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
query_per_minute: 10
- key: a6a6d7f2-ba8a-11ec-bec2-00163e1250b5
query_per_hour: 100
- limit_by_per_param: apikey
limit_keys:
# Regex,匹配以 a 開頭的所有字串,每個 apikey 對應的請求 10qds
- key: "regexp:^a.*"
query_per_second: 10
# Regex,匹配以 b 開頭的所有字串,每個 apikey 對應的請求 100qd
- key: "regexp:^b.*"
query_per_minute: 100
# 兜底用,匹配所有請求,每個 apikey 對應的請求 1000qdh
- key: "*"
query_per_hour: 1000
redis:
service_name: redis.static
show_limit_quota_header: true識別要求標頭 x-ca-key,進行區別限流
rule_name: default_rule
rule_items:
- limit_by_header: x-ca-key
limit_keys:
- key: 102234
query_per_minute: 10
- key: 308239
query_per_hour: 10
- limit_by_per_header: x-ca-key
limit_keys:
# Regex,匹配以 a 開頭的所有字串,每個 apikey 對應的請求 10qds
- key: "regexp:^a.*"
query_per_second: 10
# Regex,匹配以b開頭的所有字串,每個 apikey 對應的請求 100qd
- key: "regexp:^b.*"
query_per_minute: 100
# 兜底用,匹配所有請求,每個 apikey 對應的請求 1000qdh
- key: "*"
query_per_hour: 1000
redis:
service_name: redis.static
show_limit_quota_header: true根據要求標頭 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
query_per_day: 10
# IP 段,符合這個 IP 段的 IP,每個 IP 100qpd
- key: 1.1.1.0/24
query_per_day: 100
# 兜底用,即預設每個 IP 1000 qpd
- key: 0.0.0.0/0
query_per_day: 1000
redis:
service_name: redis.static
show_limit_quota_header: true識別 consumer,進行區別限流
rule_name: default_rule
rule_items:
- limit_by_consumer: ''
limit_keys:
- key: consumer1
query_per_second: 10
- key: consumer2
query_per_hour: 100
- limit_by_per_consumer: ''
limit_keys:
# Regex,匹配以 a 開頭的所有字串,每個 consumer 對應的請求 10qds
- key: "regexp:^a.*"
query_per_second: 10
# Regex,匹配以 b 開頭的所有字串,每個 consumer 對應的請求 100qd
- key: "regexp:^b.*"
query_per_minute: 100
# 兜底用,匹配所有請求,每個 consumer 對應的請求 1000qdh
- key: "*"
query_per_hour: 1000
redis:
service_name: redis.static
show_limit_quota_header: true識別 Cookie 中的索引值對,進行區別限流
rule_name: default_rule
rule_items:
- limit_by_cookie: key1
limit_keys:
- key: value1
query_per_minute: 10
- key: value2
query_per_hour: 100
- limit_by_per_cookie: key1
limit_keys:
# Regex,匹配以 a 開頭的所有字串,每個 cookie 中的 value 對應的請求 10qds
- key: "regexp:^a.*"
query_per_second: 10
# Regex,匹配以 b 開頭的所有字串,每個 cookie 中的 value 對應的請求 100qd
- key: "regexp:^b.*"
query_per_minute: 100
# 兜底用,匹配所有請求,每個 cookie 中的 value 對應的請求 1000qdh
- key: "*"
query_per_hour: 1000
rejected_code: 200
rejected_msg: '{"code":-1,"msg":"Too many requests"}'
redis:
service_name: redis.static
show_limit_quota_header: true