Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Configure local throttling for an ingress gateway

Última atualização: Jun 28, 2026

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:

Implantar o serviço NGINX

  1. Crie um arquivo nginx.yaml:

       apiVersion: apps/v1
       kind: Deployment
       metadata:
         name: nginx
       spec:
         selector:
           matchLabels:
             app: nginx
         replicas: 1
         template:
           metadata:
             labels:
               app: nginx
               sidecarset-injected: "true"
           spec:
             containers:
             - name: nginx
               image: nginx:1.14.2
               ports:
               - containerPort: 80
       ---
       apiVersion: v1
       kind: Service
       metadata:
         name: nginx
       spec:
         ports:
           - name: http
             port: 80
             protocol: TCP
             targetPort: 80
         selector:
           app: nginx
         type: ClusterIP
  2. Implante no namespace foo:

       kubectl apply -f nginx.yaml -n foo

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.

Gateway

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway
  namespace: default
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - bf2.example.com
    port:
      name: http
      number: 80
      protocol: http

Serviço virtual

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo
  namespace: default
spec:
  gateways:
  - bookinfo-gateway
  hosts:
  - bf2.example.com
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    name: productpage-route-name1
    route:
    - destination:
        host: productpage
        port:
          number: 9080
  - match:
    - uri:
        prefix: /nginx
    name: nginx-route-name1
    rewrite:
      uri: /
    route:
    - destination:
        host: nginx.foo.svc.cluster.local
        port:
          number: 80

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.

Scenario diagram

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.

YAML sem opções avançadas

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMLocalRateLimiter
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  isGateway: true
  workloadSelector:
    labels:
      istio: ingressgateway
  configs:
    - match:
        vhost:
          name: bf2.example.com
          port: 80
          route:
            name_match: productpage-route-name1
      limit:
        fill_interval:
          seconds: 1
        quota: 10

Para retornar um corpo de resposta personalizado quando as solicitações forem limitadas, adicione o campo custom_response_body abaixo de limit:

YAML com corpo de resposta personalizado

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMLocalRateLimiter
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  isGateway: true
  workloadSelector:
    labels:
      istio: ingressgateway
  configs:
    - match:
        vhost:
          name: bf2.example.com
          port: 80
          route:
            name_match: productpage-route-name1
      limit:
        custom_response_body: '{"ret_code": xxx, "message": "Your request be limited"}'
        fill_interval:
          seconds: 1
        quota: 10

Para todos os campos de ASMLocalRateLimiter, consulte Descrição dos campos do ASMLocalRateLimiter.

Criar a regra pelo console

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. Configure os parâmetros a seguir e clique em OK.

    Seção

    Parâmetro

    Valor

    Basic Information About Throttling

    Namespace

    istio-system

    Name

    ingressgateway

    Type of Effective Workload

    Applicable Gateway

    Relevant Workload

    bookinfo-gateway

    List of Throttling Rules

    Gateway Domain Name

    bf2.example.com

    Gateway Port

    80

    Match Routes of Virtual Service

    productpage-route-name1

    Throttling 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)

    Scenario 1 console configuration

Etapa 2: Gerar carga e verificar

  1. 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
  2. Enquanto o hey estiver 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 /productpage está 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
  3. Envie uma solicitação para o caminho /nginx: Nenhum código de status 429 é retornado, confirmando que o tráfego para /nginx não é limitado. Apenas a rota productpage-route-name1 está 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.

YAML

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMLocalRateLimiter
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  isGateway: true
  workloadSelector:
    labels:
      istio: ingressgateway
  configs:
    - match:
        vhost:
          name: bf2.example.com
          port: 80
          route: {}
      limit:
        fill_interval:
          seconds: 1
        quota: 10

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.

Scenario 2 console configuration

Etapa 2: Gerar carga e verificar

  1. Gere tráfego de teste de estresse:

       hey -host bf2.example.com -c 10 -n 100000 http://<ingress-gateway-ip>/nginx
  2. Enquanto o hey estiver em execução, envie uma solicitação para o caminho /nginx: A resposta retorna HTTP/1.1 429 Too Many Requests, confirmando que /nginx agora está limitado. Diferentemente do Cenário 1, a regra abrange todas as rotas em bf2.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.

YAML

apiVersion: istio.alibabacloud.com/v1
kind: ASMLocalRateLimiter
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  isGateway: true
  workloadSelector:
    labels:
      istio: ingressgateway
  configs:
    - match:
        vhost:
          name: bf2.example.com
          port: 80
          route:
            header_match:
              - exact_match: 'true'
                invert_match: false
                name: ratelimit
            name_match: nginx-route-name1
      limit:
        fill_interval:
          seconds: 1
        quota: 10

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

nginx-route-name1

Matched Attributes

Specific Request Header

Request Header

ratelimit

Matching Method

Exact Match

Matched Content

true

Todos os outros parâmetros permanecem iguais aos do Cenário 1.

Scenario 3 console configuration

Etapa 2: Gerar carga e verificar

  1. 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
  2. Enquanto o hey estiver em execução, envie uma solicitação com o cabeçalho ratelimit: true: A resposta retorna HTTP/1.1 429 Too Many Requests, confirmando que as solicitações com o cabeçalho ratelimit: true estão limitadas.

       curl -H 'host: bf2.example.com' -H 'ratelimit: true' http://<ingress-gateway-ip>/nginx -v
  3. Envie uma solicitação sem o cabeçalho: Nenhum código de status 429 é retornado. As solicitações sem o cabeçalho ratelimit: true nã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.

  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. 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.

Tópicos relacionados