全部產品
Search
文件中心

Microservices Engine:AI Token限流

更新時間:Dec 31, 2024

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

否,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時支援Regex或*

limit_by_per_param

string

否,limit_by_*中選填一項。

-

按規則匹配特定 URL 參數,並對每個參數分別計算限流,配置擷取限流索引值的來源 URL 參數名稱,配置limit_keys時支援Regex或*

limit_by_per_consumer

string

否,limit_by_*中選填一項。

-

按規則匹配特定 consumer,並對每個 consumer 分別計算限流,根據 consumer 名稱進行限流,無需添加實際值,配置limit_keys時支援Regex或*

limit_by_per_cookie

string

否,limit_by_*中選填一項。

-

按規則匹配特定 Cookie,並對每個 Cookie 分別計算限流,配置擷取限流索引值的來源 Cookie中 key 名稱,配置limit_keys時支援Regex或*

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 類型支援配置Regex(以regexp:開頭後面跟Regex)或者*(代表所有),Regex樣本:regexp:^d.*(以d開頭的所有字串);limit_by_per_ip支援配置 IP 位址或 IP 段。

token_per_second

int

否,token_per_secondtoken_per_minutetoken_per_hourtoken_per_day 中選填一項。

-

允許每秒請求Token數。

token_per_minute

int

否,token_per_secondtoken_per_minutetoken_per_hourtoken_per_day 中選填一項。

-

允許每分鐘請求Token數。

token_per_hour

int

否,token_per_secondtoken_per_minutetoken_per_hourtoken_per_day 中選擇填寫一項。

-

允許每小時請求Token數。

token_per_day

int

否,token_per_secondtoken_per_minutetoken_per_hourtoken_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,進行區別限流。

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