Durante picos de tráfego, como promoções relâmpago, solicitações sem limitação podem sobrecarregar os serviços de back-end e causar falhas em cascata. A limitação de taxa local do Service Mesh (ASM) rejeita o excesso de tráfego no gateway de entrada antes que ele chegue às suas aplicações, retornando HTTP 429 (Too Many Requests) quando o tráfego excede uma cota configurada.
O ASM oferece suporte a três escopos de limitação de taxa em um gateway de entrada:
|
Escopo |
Descrição |
|
Nível de rota |
Limita o tráfego para uma rota específica de serviço virtual |
|
Nível de domínio:porta |
Limita todo o tráfego para uma combinação de domínio:porta |
|
Baseado em cabeçalho |
Limita apenas solicitações que contêm um cabeçalho específico |
Escopo
A limitação de taxa local aplica-se a gateways de entrada e serviços com proxies sidecar injetados.
Pré-requisitos
Antes de começar, verifique se você possui:
-
Uma instância do ASM que atenda aos requisitos de versão:
Enterprise Edition ou Ultimate Edition: v1.11.5.30 ou posterior. Para atualizar, consulte Atualizar uma instância do ASM
Standard Edition: v1.9 ou posterior. A Standard Edition suporta apenas o recurso nativo de limitação de taxa do Istio. Para mais detalhes, consulte Enabling Rate Limits using Envoy
Um cluster adicionado à instância do ASM. Consulte Adicionar um cluster a uma instância do ASM
Um gateway de entrada implantado. Consulte Criar um gateway de entrada
O serviço Bookinfo implantado no namespace
defaulte o serviço NGINX implantado no namespacefoo. Para a configuração do Bookinfo, consulte Implantar uma aplicação em uma instância do ASMUm gateway Istio e um serviço virtual configurados. Consulte Gerenciar gateways Istio e Gerenciar serviços virtuais
A ferramenta de teste de estresse hey instalada
Todos os exemplos neste tópico compartilham a seguinte configuração de gateway e serviço virtual. O gateway escuta em bf2.example.com:80. O serviço virtual roteia /productpage, /static, /login, /logout e /api/v1/products para o serviço productpage do Bookinfo, e /nginx para o serviço NGINX.
Cenário de exemplo
O diagrama a seguir mostra a configuração usada nos três cenários. O Bookinfo é executado no namespace default, o NGINX é executado no namespace foo e ambos são acessíveis através do gateway de entrada em bf2.example.com.

Cenário 1: Limitar taxa de uma rota específica de serviço virtual
Limite a taxa da rota productpage-route-name1 em bf2.example.com:80. Com essa regra ativa, as solicitações para /productpage, /static, /login e /logout têm a taxa limitada, enquanto as solicitações para /nginx passam livremente.
Etapa 1: Criar a regra de limitação de taxa
O YAML a seguir limita a rota productpage-route-name1 a 10 solicitações por segundo.
Para retornar um corpo de resposta personalizado quando as solicitações forem limitadas, adicione o campo custom_response_body abaixo de limit:
Para todos os campos de ASMLocalRateLimiter, consulte Descrição dos campos do ASMLocalRateLimiter.
Criar a regra pelo console
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Rate Limiting. Clique em Create.
-
Configure os parâmetros a seguir e clique em OK.
Seção
Parâmetro
Valor
Basic Information About Throttling
Namespace
istio-systemName
ingressgatewayType of Effective Workload
Applicable Gateway
Relevant Workload
bookinfo-gatewayList of Throttling Rules
Gateway Domain Name
bf2.example.comGateway Port
80Match Routes of Virtual Service
productpage-route-name1Throttling Configuration
Time Window for Throttling Detection
1 segundo
Number of Requests Allowed in Time Window
10
Advanced Settings
Custom Throttling Response Body
{"ret_code": xxx,"message": "Your request be limited"}(opcional)
Etapa 2: Gerar carga e verificar
-
Gere tráfego de teste de estresse com
hey:hey -host bf2.example.com -c 10 -n 100000 http://<ingress-gateway-ip>/productpage hey -host bf2.example.com -c 10 -n 100000 http://<ingress-gateway-ip>/nginx -
Enquanto o
heyestiver em execução, envie uma solicitação para o caminho/productpage: Saída esperada: O código de status 429 confirma que o tráfego para/productpageestá sendo limitado.curl -H 'host: bf2.example.com' http://<ingress-gateway-ip>/productpage -v< HTTP/1.1 429 Too Many Requests < Content-Length: 18 < Content-Type: text/plain < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < local_rate_limited -
Envie uma solicitação para o caminho
/nginx: Nenhum código de status 429 é retornado, confirmando que o tráfego para/nginxnão é limitado. Apenas a rotaproductpage-route-name1está sujeita à regra de limitação de taxa.curl -H 'host: bf2.example.com' http://<ingress-gateway-ip>/nginx -v
Cenário 2: Limitar taxa de todas as rotas em um domínio:porta
Limite a taxa de todo o tráfego para bf2.example.com:80, independentemente da rota. Tanto /productpage quanto /nginx têm a taxa limitada.
Etapa 1: Criar a regra de limitação de taxa
A principal diferença em relação ao Cenário 1: o campo route é definido como {} (vazio), o que corresponde a todas as rotas no domínio e porta especificados.
Criar a regra pelo console
Siga as mesmas etapas do console do Cenário 1, com uma alteração:
|
Parâmetro |
Valor |
|
Match Routes of Virtual Service |
Deixe desmarcado (nenhuma rota específica). Isso aplica a regra de limitação de taxa a todas as rotas na combinação de domínio:porta. |
Todos os outros parâmetros permanecem iguais aos do Cenário 1.

Etapa 2: Gerar carga e verificar
-
Gere tráfego de teste de estresse:
hey -host bf2.example.com -c 10 -n 100000 http://<ingress-gateway-ip>/nginx -
Enquanto o
heyestiver em execução, envie uma solicitação para o caminho/nginx: A resposta retornaHTTP/1.1 429 Too Many Requests, confirmando que/nginxagora está limitado. Diferentemente do Cenário 1, a regra abrange todas as rotas embf2.example.com:80.curl -H 'host: bf2.example.com' http://<ingress-gateway-ip>/nginx -v
Cenário 3: Limitar taxa de solicitações com um cabeçalho específico em uma única rota
Limite a taxa apenas das solicitações para a rota nginx-route-name1 que contenham o cabeçalho ratelimit: true. Solicitações sem esse cabeçalho passam sem limitação.
Etapa 1: Criar a regra de limitação de taxa
O campo header_match restringe a limitação de taxa a solicitações com correspondência exata no cabeçalho ratelimit.
Criar a regra pelo console
Siga as mesmas etapas do console do Cenário 1, com estas alterações:
|
Parâmetro |
Valor |
|
Match Routes of Virtual Service |
|
|
Matched Attributes |
Specific Request Header |
|
Request Header |
|
|
Matching Method |
Exact Match |
|
Matched Content |
|
Todos os outros parâmetros permanecem iguais aos do Cenário 1.

Etapa 2: Gerar carga e verificar
-
Gere tráfego de teste de estresse com o cabeçalho
ratelimit: true:hey -host bf2.example.com -H 'ratelimit: true' -c 10 -n 10000 http://<ingress-gateway-ip>/nginx -
Enquanto o
heyestiver em execução, envie uma solicitação com o cabeçalhoratelimit: true: A resposta retornaHTTP/1.1 429 Too Many Requests, confirmando que as solicitações com o cabeçalhoratelimit: trueestão limitadas.curl -H 'host: bf2.example.com' -H 'ratelimit: true' http://<ingress-gateway-ip>/nginx -v -
Envie uma solicitação sem o cabeçalho: Nenhum código de status 429 é retornado. As solicitações sem o cabeçalho
ratelimit: truenão são limitadas.curl -H 'host: bf2.example.com' http://<ingress-gateway-ip>/nginx -v
Excluir uma regra de limitação de taxa
Para interromper a limitação de taxa, exclua o resource ASMLocalRateLimiter.
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Rate Limiting.
Localize a regra de limitação de taxa e clique em Delete na coluna Actions. Na mensagem Submit, clique em OK.
Após a exclusão, verifique se a limitação de taxa não está mais ativa:
curl -H 'host: bf2.example.com' http://<ingress-gateway-ip>/nginx -v
Uma resposta normal sem o código de status 429 confirma que a limitação de taxa foi removida.