O plug-in cluster-key-rate-limit implementa limitação de taxa em nível de cluster baseada em Redis para garantir controle de fluxo globalmente consistente entre múltiplas instâncias do Higress Gateway. As chaves podem derivar de parâmetros de URL, cabeçalhos de requisição HTTP, endereços IP do cliente, nomes de consumidores ou chaves de cookies.
Atributos de execução
Estágio de execução do plug-in: default stage. Prioridade de execução do plug-in: 20.
Parâmetros
|
Campo |
Tipo |
Obrigatório |
Valor padrão |
Comentário |
|
rule_name |
string |
Sim |
- |
Nome da regra de limitação. O sistema concatena o nome da regra, o tipo de limitação, o nome da chave e o valor real da chave para formar a chave do Redis. |
|
rule_items |
array de objetos |
Sim |
- |
Itens da regra de limitação, avaliados em ordem. Após encontrar uma correspondência, o sistema ignora os itens subsequentes. |
|
show_limit_quota_header |
bool |
Não |
false |
Defina se a resposta deve incluir os cabeçalhos |
|
rejected_code |
int |
Não |
429 |
Código de status HTTP retornado quando as requisições são limitadas. |
|
rejected_msg |
string |
Não |
Too many requests |
Corpo da resposta retornado quando as requisições são limitadas. |
|
redis |
objeto |
Sim |
- |
Configurações de conexão do Redis. |
A tabela a seguir descreve os campos em rule_items.
|
Campo |
Tipo |
Obrigatório |
Valor padrão |
Descrição |
|
limit_by_header |
string |
Não. Configure apenas um dos campos |
- |
Nome do cabeçalho de requisição HTTP usado como chave de limitação. |
|
limit_by_param |
string |
Não. Configure apenas um dos campos |
- |
Nome do parâmetro de URL usado como chave de limitação. |
|
limit_by_consumer |
string |
Não. Configure apenas um dos campos |
- |
Nome do consumidor usado como chave de limitação. Nenhum valor real é necessário. |
|
limit_by_cookie |
string |
Não. Configure apenas um dos campos |
- |
Nome da chave do cookie usado como chave de limitação. |
|
limit_by_per_header |
string |
Não. Configure apenas um dos campos |
- |
Nome do cabeçalho de requisição HTTP para limitação por valor individual. Cada valor distinto de cabeçalho tem sua taxa limitada independentemente. O campo |
|
limit_by_per_param |
string |
Não. Configure apenas um dos campos |
- |
Nome do parâmetro de URL para limitação por valor individual. Cada valor distinto de parâmetro tem sua taxa limitada independentemente. O campo |
|
limit_by_per_consumer |
string |
Não. Configure apenas um dos campos |
- |
Nome do consumidor para limitação por consumidor individual. Cada consumidor tem sua taxa limitada independentemente. Nenhum valor real é necessário. O campo |
|
limit_by_per_cookie |
string |
Não. Configure apenas um dos campos |
- |
Nome da chave do cookie para limitação por valor individual. Cada valor distinto de cookie tem sua taxa limitada independentemente. O campo |
|
limit_by_per_ip |
string |
Não. Configure apenas um dos campos |
- |
Origem do endereço IP para limitação por IP individual. Defina como |
|
limit_keys |
array de objetos |
Sim. |
- |
Limiares de limitação de taxa aplicados ao corresponder a um valor de chave. |
A tabela a seguir descreve os campos em limit_keys.
|
Campo |
Tipo |
Obrigatório |
Valor padrão |
Descrição |
|
key |
string |
Sim. |
- |
Valor da chave a ser correspondido. Para |
|
query_per_second |
int |
Não. Configure um entre |
- |
Requisições permitidas por segundo. |
|
query_per_minute |
int |
Não. Configure um entre |
- |
Requisições permitidas por minuto. |
|
query_per_hour |
int |
Não. Configure um entre |
- |
Requisições permitidas por hora. |
|
query_per_day |
int |
Não. Configure um entre |
- |
Requisições permitidas por dia. |
A tabela a seguir descreve os campos em redis.
|
Campo |
Tipo |
Obrigatório |
Valor padrão |
Descrição |
|
service_name |
string |
Sim |
- |
Nome do serviço Redis como nome de domínio totalmente qualificado (FQDN), como my-redis.DNS ou redis.my-ns.svc.cluster.local. |
|
service_port |
int |
Não |
Se o tipo de serviço for static service, o valor padrão é 80. Para outros serviços, o valor padrão é 6379. |
Número da porta da instância Tair (compatível com Redis OSS). |
|
username |
string |
Não |
- |
Nome de usuário do Redis. |
|
password |
string |
Não |
- |
Senha do Redis. |
|
timeout |
int |
Não |
1000 |
Tempo limite de conexão para a instância Tair (compatível com Redis OSS), em milissegundos. |
Exemplos de configuração
Identificar requisições com base no parâmetro apikey e aplicar diferentes operações de limitação
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:
# A regular expression is used to match all strings that start with a. For each request that matches the apikey parameter, 10 QDS is allowed.
- key: "regexp:^a.*"
query_per_second: 10
# A regular expression is used to match all strings that start with b. For each request that matches the apikey parameter, 100 QD is allowed.
- key: "regexp:^b.*"
query_per_minute: 100
# All requests are matched. For each request, 1,000 QDH is allowed.
- key: "*"
query_per_hour: 1000
redis:
service_name: redis.static
show_limit_quota_header: true
Identificar requisições com base no cabeçalho de requisição x-ca-key e aplicar diferentes operações de limitação
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:
# A regular expression is used to match all strings that start with a. For each request that matches the apikey parameter, 10 QDS is allowed.
- key: "regexp:^a.*"
query_per_second: 10
# A regular expression is used to match all strings that start with b. For each request that matches the apikey parameter, 100 QD is allowed.
- key: "regexp:^b.*"
query_per_minute: 100
# All requests are matched. For each request, 1,000 QDH is allowed.
- key: "*"
query_per_hour: 1000
redis:
service_name: redis.static
show_limit_quota_header: true
Obter endereços IP remotos com base no cabeçalho de requisição x-forwarded-for e aplicar diferentes operações de limitação
rule_name: default_rule
rule_items:
- limit_by_per_ip: from-header-x-forwarded-for
limit_keys:
# The exact IP address.
- key: 1.1.1.1
query_per_day: 10
# The CIDR block. For each IP address in the CIDR block, 100 QPD is allowed.
- key: 1.1.1.0/24
query_per_day: 100
# By default, 1,000 QPD is allowed for each IP address.
- key: 0.0.0.0/0
query_per_day: 1000
redis:
service_name: redis.static
show_limit_quota_header: true
Identificar requisições com base em consumidores e aplicar diferentes operações de limitação
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:
# A regular expression is used to match all strings that start with a. For each consumer that matches the apikey parameter, 10 QDS is allowed.
- key: "regexp:^a.*"
query_per_second: 10
# A regular expression is used to match all strings that start with b. For each consumer that matches the apikey parameter, 100 QD is allowed.
- key: "regexp:^b.*"
query_per_minute: 100
# All requests are matched. For each consumer, 1,000 QDH is allowed.
- key: "*"
query_per_hour: 1000
redis:
service_name: redis.static
show_limit_quota_header: true
Identificar requisições com base em pares chave-valor em cookies e aplicar diferentes operações de limitação
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:
# A regular expression is used to match all strings that start with a. For each request that matches a specific cookie value, 10 QDS is allowed.
- key: "regexp:^a.*"
query_per_second: 10
# A regular expression is used to match all strings that start with b. For each request that matches a specific cookie value, 100 QD is allowed.
- key: "regexp:^b.*"
query_per_minute: 100
# All requests are matched. For each request, 1,000 QDH is allowed.
- 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