Configurando Timeouts para Rotas do Zuul no SpringCloud

Ao implementar o roteamento com Zuul em um ecossistema SpringCloud, é comum enfrentar problemas relacionados a tempos de espera. Para simular e analisar o comportamento do circuit breaker do Zuul, podemos ajustar os serviços backend para introduzir atrasos artificiais.

No código a seguir, três endpoints são definidos com diferentes tempos de resposta, permitindo testar os limites de timeout do Zuul:


@GetMapping("/servico-dorminhoco")
public Object servicoDorminhoco() {
    try {
        Thread.sleep(3500);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    return "resultado_processado";
}

@GetMapping("/servico-moderado")
public Object servicoModerado() {
    try {
        Thread.sleep(1200);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    return "resultado_processado";
}

@GetMapping("/servico-preguicoso")
public Object servicoPreguicoso() {
    try {
        Thread.sleep(6000);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    return "resultado_processado";
}

Ao acessar esses endpoints, o Zuul pode interromper a requisição com um erro de timeout após aproximadamente 2 segundos, acionando o mecanismo de fallback.

As mensagens de erro típicas incluem:

  • com.netflix.zuul.exception.ZuulException: Erro no encaminhamento
  • java.lang.RuntimeException: java.net.SocketTimeoutException: Tempo de leitura esgotado

Estas ocorrências indicam claramente que o tempo de espera configurado no Zuul foi excedido durante a comunicação com o serviço de destino.

Estratégias de Resolução

A abordagem para configurar timeouts depende do método de roteamento utilizado. Para rotas baseadas em serviceId, as configurações do Ribbon devem ser aplicadas. Em contraste, para rotas definidas por URL, as configurações do host Zuul são relevantes.

Além disso, se um fallback Hystrix estiver ativado, seu tempo de timeout deve ser cuidadosamente ailnhado com os do Ribbon e Zuul. Caso contrário, o Hystrix pode acionar o circuit breaker antes que as configurações de timeout do Ribbon entrem em vigor.

Exemplo de configuração em application.yml:


hystrix:
  command:
    servico-alvo:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 7000

ribbon:
  ConnectTimeout: 12000
  ReadTimeout: 4000
  MaxTotalHttpConnections: 4500
  MaxConnectionsPerHost: 900

zuul:
  max:
    host:
      connections: 9500
  host:
    socket-timeout-millis: 7000
    connect-timeout-millis: 7000

Equivalente em formato application.properties:


hystrix.command.servico-alvo.execution.isolation.thread.timeoutInMilliseconds=7000
ribbon.ConnectTimeout=12000
ribbon.ReadTimeout=4000
ribbon.SocketTimeout=4000
zuul.max.host.connections=9500
zuul.host.socket-timeout-millis=7000
zuul.host.connect-timeout-millis=7000

Tags: SpringCloud Zuul Ribbon Hystrix Timeout

Publicado em 7-19 09:05