Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Configurar disjuntor de circuito para tráfego leste-oeste

Última atualização: Jun 28, 2026

Service Mesh (ASM) permite configurar regras de disjuntor de circuito para o tráfego leste-oeste entre serviços e rotas específicos. Essas regras permitem que o proxy do mesh rejeite ativamente requisições para serviços upstream com falha, oferecendo uma capacidade não intrusiva de disjuntor de circuito de tráfego. Este tópico descreve como usar o CRD ASMCircuitBreaker para configurar regras de disjuntor de circuito para tráfego leste-oeste.

Contexto

O disjuntor de circuito é um mecanismo de proteção contra sobrecarga que impede a falha do sistema devido a picos repentinos de tráfego. Em ambientes cloud-native com tráfego leste-oeste entre serviços, uma única falha (por exemplo, resposta lenta ou alta taxa de erros) pode causar uma reação em cadeia e levar a uma falha em cascata em toda a cadeia de chamadas.

Uma regra de disjuntor de circuito para tráfego leste-oeste "abre o circuito" automaticamente e rejeita requisições para um serviço upstream quando a taxa de erro ou o limiar de tempo limite de resposta é excedido. Isso protege o serviço upstream, evita a propagação da falha e ajuda a prevenir interrupções em todo o sistema.

Após a configuração de uma regra de disjuntor de circuito, cada proxy do mesh calcula independentemente a taxa de erro ou o número de requisições lentas para o tráfego que gerencia. Consequentemente, diferentes proxies de mesh no lado do cliente podem abrir o circuito em momentos ligeiramente distintos para o mesmo serviço upstream com falha.

Pré-requisitos

Etapa 1: Configure o roteamento do caminho da requisição

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

  2. Crie um serviço virtual usando um dos métodos a seguir.

    Usar o console

    1. Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > VirtualService. Na página exibida, clique em Create.

    2. Especifique o **Namespace e o Host, e ative Gateways > Apply To All Sidecars**.

    3. Na seção **Hosts, clique em Add Host** para adicionar o serviço httpbin.

    4. Na seção **HTTP Route, clique em Add Route** e configure as rotas conforme descrito abaixo.

    Defina o nome da rota como error-route. Ative **Match Request URI, selecione Exact** como tipo de correspondência e insira /status/500 no conteúdo de correspondência. Defina o nome do serviço de destino como httpbin.default.svc.cluster.local.

    Defina o nome da rota como **delay-route. Ative Match Request URI, selecione Prefix** como tipo de correspondência e insira /delay no conteúdo de correspondência. Defina o nome do serviço de destino como httpbin.default.svc.cluster.local.

    Defina o nome da rota como default-route. Não adicione regras de correspondência de requisição. Defina o nome do serviço de destino como httpbin.default.svc.cluster.local e deixe os campos de versão, peso e porta vazios.

    Usar YAML

    1. Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > VirtualService. Na página exibida, clique em Create from YAML.

    2. No editor **YAML, cole o seguinte conteúdo e clique em Create**.

      Clique em para visualizar o arquivo YAML

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: httpbin
        namespace: default
      spec:
        hosts:
          - httpbin.default.svc.cluster.local
        http:
          - match:
              - uri:
                  exact: /status/500
            name: error-route
            route:
              - destination: 
                  host: httpbin.default.svc.cluster.local
          - match:
              - uri:
                  prefix: /delay
            name: delay-route
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local
          - name: default-route
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local

    A tabela a seguir mapeia caminhos de requisição para rotas.

    Caminho da requisição

    Tipo de correspondência

    Rota

    Descrição

    /status/500

    Exact

    error-route

    Sempre retorna um código de status 500.

    /delay

    Prefix

    delay-route

    Retorna um código de status 200 após um atraso especificado. Para mais informações sobre como usar o caminho /delay, consulte delay.

    /*

    Qualquer caminho

    default-route

    A rota padrão.

Etapa 2: Configure o disjuntor de circuito

Esta seção descreve como configurar e testar o disjuntor de circuito baseado em taxa de erro e em requisições lentas.

Taxa de erro

O disjuntor de circuito baseado em taxa de erro abre o circuito quando a taxa de erro das respostas do servidor excede um limiar dentro de uma janela de tempo determinada.

  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 no nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Circuit Breaking and Degradation.

  3. Na página **Create, cole o seguinte conteúdo no editor YAML e clique em Create**.

    Clique em para visualizar o arquivo YAML

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMCircuitBreaker
    metadata:
      name: httpbin-error-circuitbreak
      namespace: default
    spec:
      configs:
        - breaker_config:
            break_duration: 60s
            custom_response:
              body: error break!
              header_to_add:
                x-envoy-overload: 'true'
              status_code: 499
            error_percent:
              value: 60
            min_request_amount: 5
            window_size: 10s
          match:
            vhost:
              name: httpbin.default.svc.cluster.local
              port: 8000
              route:
                name_match: error-route
      workloadSelector:
        labels:
          app: sleep
    

    A tabela a seguir descreve os parâmetros da configuração do disjuntor de circuito.

    Parâmetro

    Descrição

    workloadSelector.labels

    Carga de trabalho do serviço downstream à qual a regra de disjuntor de circuito se aplica. Neste exemplo, o serviço downstream é o sleep, selecionado pelo rótulo app: sleep.

    break_duration

    Duração em que o circuito permanece aberto após ser acionado. Neste exemplo, o valor é 60s.

    window_size

    Janela de tempo para detecção do disjuntor de circuito. Neste exemplo, o valor é 10s. Se a taxa de erro de requisição na rota exceder o limiar especificado dentro de 10 segundos, o disjuntor será acionado e rejeitará as requisições.

    error_percent

    Limiar de taxa de erro de requisição necessário para acionar o disjuntor dentro da janela de tempo. Neste exemplo, o valor é 60. Se a taxa de erro na rota exceder 60% dentro de uma janela de 10s, o disjuntor será acionado e rejeitará as requisições.

    min_request_amount

    Número mínimo de requisições necessárias para acionar o disjuntor dentro da janela de tempo. Este parâmetro evita que o disjuntor seja acionado por um volume baixo de requisições.

    Neste exemplo, o valor é 5. O disjuntor só é acionado se mais de 5 requisições forem enviadas na rota dentro de uma janela de 10s e a taxa de erro exceder 60%.

    custom_response

    Resposta personalizada retornada pelo proxy do mesh para requisições rejeitadas após o acionamento do disjuntor.

    • body definido como error break!. O corpo da resposta é error break!.

    • header_to_add definido como x-envoy-overload: 'true'. O cabeçalho x-envoy-overload: 'true' é adicionado à resposta quando o circuito está aberto.

    • status_code definido como 499. O código de resposta para a requisição é 499 após a abertura do circuito.

    match.vhost

    Entrada de rota para a qual o disjuntor está configurado. Deve corresponder a uma entrada específica declarada no serviço virtual.

    • name: Nome de domínio do serviço upstream na cadeia de chamadas. Neste exemplo, definido como httpbin.default.svc.cluster.local, que é o domínio do serviço httpbin (upstream do serviço sleep).

    • port: Porta do serviço upstream. Neste exemplo, definido como 8000, que é a porta do serviço httpbin.

    • route.name_match: Nome real da entrada de rota no serviço virtual onde a configuração do disjuntor entra em vigor. Neste exemplo, definido como error-route, referente à entrada criada na Etapa 1. Requisições correspondentes sempre retornam status 500, garantindo o acionamento do disjuntor.

  4. Conecte-se ao cluster ACK usando kubectl e execute o seguinte comando:

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Saída esperada:

    Clique em para visualizar detalhes

    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    ...

    A saída mostra que o disjuntor é acionado na sexta requisição. As requisições subsequentes retornam o código de resposta personalizado 499. O circuito permanece aberto por 60s.

  5. Com o circuito aberto, tente acessar outros caminhos do serviço httpbin.

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/503 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Saída esperada:

    Clique em para visualizar detalhes

    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    HTTP/1.1 503 Service Unavailable
    ...

    Requisições para outros caminhos do serviço não são afetadas pela configuração do disjuntor na entrada de rota error-route e ainda retornam o conteúdo de resposta do serviço httpbin.

Requisição lenta

O disjuntor baseado em requisições lentas abre o circuito quando o número de "requisições lentas" (aquelas que excedem um limiar de tempo de resposta) ultrapassa um limite dentro de uma janela de tempo determinada.

  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 no nome da instância do ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Circuit Breaking and Degradation.

  3. Na página **Create, cole o seguinte conteúdo no editor YAML e clique em Create**.

    Clique em para visualizar o arquivo YAML

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMCircuitBreaker
    metadata:
      name: httpbin-slow-circuitbreak
      namespace: default
    spec:
      configs:
        - breaker_config:
            break_duration: 60s
            custom_response:
              body: delay break!
              header_to_add:
                x-envoy-overload: 'true'
              status_code: 498
            slow_request_rt: 0.5s
            max_slow_requests: 5
            min_request_amount: 5
            window_size: 10s
          match:
            vhost:
              name: httpbin.default.svc.cluster.local
              port: 8000
              route:
                name_match: delay-route
      workloadSelector:
        labels:
          app: sleep

    A tabela a seguir descreve os parâmetros da configuração do disjuntor de circuito.

    Parâmetro

    Descrição

    workloadSelector.labels

    Carga de trabalho do serviço downstream à qual a regra de disjuntor de circuito se aplica. Neste exemplo, o serviço downstream é o sleep, selecionado pelo rótulo app: sleep.

    break_duration

    Duração em que o circuito permanece aberto após ser acionado. Neste exemplo, o valor é 60s.

    window_size

    Janela de tempo para detecção do disjuntor de circuito. Neste exemplo, o valor é 10s. Se o número de requisições lentas na rota exceder o limiar especificado dentro de 10 segundos, o disjuntor será acionado e rejeitará as requisições.

    slow_request_rt

    Limiar de tempo de resposta para uma requisição lenta. Neste exemplo, o valor é 0,5s. Requisições com tempo de resposta superior a 0,5s são consideradas lentas.

    max_slow_requests

    Número de requisições lentas necessário para acionar o disjuntor dentro da janela de tempo. Neste exemplo, o valor é 5. Se ocorrerem mais de 5 requisições lentas dentro de uma janela de 10s, o disjuntor será acionado e rejeitará as requisições.

    min_request_amount

    Número mínimo de requisições necessárias para acionar o disjuntor dentro da janela de tempo. Este parâmetro evita que o disjuntor seja acionado por um volume baixo de requisições.

    Neste exemplo, o valor é 5. O disjuntor só é acionado se mais de 5 requisições forem enviadas na rota dentro de uma janela de 10s e o número de requisições lentas exceder 5.

    custom_response

    Resposta personalizada retornada pelo proxy do mesh para requisições rejeitadas após o acionamento do disjuntor.

    • body definido como delay break!. O corpo da resposta é delay break!.

    • header_to_add definido como x-envoy-overload: 'true'. O cabeçalho x-envoy-overload: 'true' é adicionado à resposta quando o circuito está aberto.

    • status_code definido como 498. O código de resposta para a requisição é 498 após a abertura do circuito.

    match.vhost

    Entrada de rota para a qual o disjuntor está configurado. Deve corresponder a uma entrada específica declarada no serviço virtual.

    • name: Nome de domínio do serviço upstream na cadeia de chamadas. Neste exemplo, definido como httpbin.default.svc.cluster.local, que é o domínio do serviço httpbin (upstream do serviço sleep).

    • port: Porta do serviço upstream. Neste exemplo, definido como 8000, que é a porta do serviço httpbin.

    • route.name_match: Nome real da entrada de rota no serviço virtual onde a configuração do disjuntor entra em vigor. Neste exemplo, definido como delay-route, referente à entrada criada na Etapa 1. Especifique manualmente um tempo de resposta superior a 0,5 segundos para requisições correspondentes a esta rota para garantir o acionamento do disjuntor.

  4. Conecte-se ao cluster ACK usando kubectl e execute o seguinte comando:

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/delay/1 -I | grep 'HTTP';  echo ''; sleep 0.1; done; 

    Saída esperada:

    Clique em para visualizar detalhes

    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    HTTP/1.1 498 Unknown
    ...

    A saída mostra que o disjuntor é acionado na sexta requisição. As requisições subsequentes retornam o código de resposta personalizado 498. O circuito permanece aberto por 60s.

  5. Com o disjuntor baseado em requisições lentas ativo, execute o seguinte comando para testar o disjuntor baseado em taxa de erro configurado na seção anterior.

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Saída esperada:

    Clique em para visualizar detalhes

    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 500 Internal Server Error
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    HTTP/1.1 499 Unknown
    ...

    A saída indica que as regras de disjuntor configuradas em diferentes entradas de rota operam independentemente. Isso permite definir políticas específicas para diferentes tipos de tráfego leste-oeste.

Operações relacionadas

Visualize métricas de disjuntor de circuito no nível de serviço

No ASM v1.22.6.28 e posterior, é possível visualizar e usar métricas de disjuntor de circuito no nível de serviço para ASMCircuitBreaker.

Métrica

Tipo

Descrição

envoy_asm_circuit_breaker_total_broken_requests

Counter

Número total de requisições rejeitadas pelo ASMCircuitBreaker.

Configure o proxyStatsMatcher para o proxy sidecar reportar as métricas.

  1. Ao configurar o proxyStatsMatcher, selecione **Regular Expression Match** e defina o valor como .*circuit_breaker.*. Para mais informações, consulte proxyStatsMatcher.

  2. Reimplante a aplicação httpbin para aplicar a nova configuração de proxy. Para mais informações, consulte Reimplantar cargas de trabalho.

  3. Execute a Etapa 1 e a Etapa 2 novamente para reconfigurar o disjuntor de circuito.

  4. Execute o seguinte comando para visualizar as métricas de disjuntor de circuito no nível de serviço para o serviço httpbin:

    kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep asm_circuit_breaker

    Saída esperada:

    # TYPE envoy_asm_circuit_breaker_total_broken_requests counter
    envoy_asm_circuit_breaker_total_broken_requests{cluster="outbound|8000||httpbin.default.svc.cluster.local",uuid="af7cf7ad-67e8-49c5-b5fe-xxxxxxxxx"} 1430
    # TYPE envoy_total_asm_circuit_breakers gauge
    envoy_total_asm_circuit_breakers{} 1

Configure coleta de métricas e alertas

Após configurar o relatório de métricas de disjuntor de circuito no nível de serviço, colete essas métricas no Prometheus e crie regras de alerta para notificações oportunas sobre eventos de disjuntor. O exemplo a seguir mostra como configurar a coleta de métricas e alertas usando o Managed Service for Prometheus.

  1. No Managed Service for Prometheus, adicione o componente **Alibaba Cloud ASM** ao cluster de plano de dados ou atualize-o para a versão mais recente para garantir a coleta das métricas de disjuntor expostas. Para mais informações sobre como adicionar um componente, consulte Gerenciamento de componentes. Caso já tenha integrado uma instância auto-gerenciada do Prometheus para monitorar o service mesh e coletar métricas, nenhuma operação adicional é necessária.

  2. Crie uma regra de alerta para disjuntor de circuito no nível de serviço. Para mais informações, consulte Criar uma regra de alerta do Prometheus usando uma instrução PromQL personalizada. A tabela a seguir exemplifica a configuração de parâmetros-chave para uma regra de alerta. Configure outros parâmetros conforme seus requisitos de negócios, seguindo a documentação.

    Parâmetro

    Exemplo

    Descrição

    Instrução PromQL personalizada

    (sum by(cluster, namespace) (increase(envoy_asm_circuit_breaker_total_broken_requests[1m]))) > 0

    Consulta o número de requisições rejeitadas no último minuto e agrupa os resultados pelo namespace e nome do serviço upstream. Um alerta é acionado quando o número de requisições rejeitadas em um minuto é maior que 0.

    Conteúdo do alerta

    Disjuntor de circuito no nível de serviço ocorreu! Namespace: {{$labels.namespace}}, Serviço alvo onde ocorreu o disjuntor de circuito: {{$labels.cluster}}. Número de requisições rejeitadas devido ao disjuntor de circuito no último minuto: {{ $value }}

    Formato da mensagem de alerta. Exibe o namespace e o nome do serviço afetado, além do número de requisições rejeitadas para esse serviço no último minuto.