Configuração do Zuul Gateway e Hystrix - Notas de Estudo

1.1 Dependência do Zuul

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

Caso não funcione, utilize a seuginte configuração:

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.0.1.RELEASE</spring-boot.version>
    <spring-cloud.version>Finchley.SR4</spring-cloud.version>
</properties>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

1.2 Dependência do Hystrix

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

  1. Classe de Inicialização

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy

  1. Configurações do Application.yml

3.1 Gateway

server:
  port: 6670
eureka:
  client:
    service-url:
      defaultZone: http://root:123456@localhost:8083/eureka
zuul:
  routes:
    servicoNoticia: /servicoNoticia/**
  ignored-services: "*"

3.2 Circuit Breaker

# Habilita configuração de timeout global
hystrix.command.default.execution.timeout.enabled=true

# Configura tempo limite (padrão é 1 segundo)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000

# Habilita circuit breaker do Hystrix
feign.hystrix.enabled=true

# Número de falhas necessárias para ativar o circuito
hystrix.command.default.circuitBreaker.requestVolumeThreshold=2

# Tempo de espera antes de tentar recuperação (em milissegundos)
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=30000

# Percentual de erros para ativar o curto-circuito
hystrix.command.default.circuitBreaker.errorThresholdPercentage=1
hystrix.dashboard.proxy-stream-allow-list=localhost

  1. Filtros

@Component
public class FiltroPersonalizado extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        ContextoRequisicao contexto = ContextoRequisicao.getContextoAtual();
        HttpServletResponse resposta = contexto.getResposta();
        HttpServletRequisicao requisicao = contexto.getRequisicao();
        
        String[] caminho = requisicao.getURI().getPath().split(",");
        
        for(int indice = 0; indice < caminho.length; indice++) {
            if(caminho[indice].contains("/servicoNoticia")) {
                contexto.setEnviarRespostaZuul(false);
                resposta.setContentType("text/html;charset=UTF-8");
                contexto.setCorpoResposta("Usuário não autenticado. Favor realizar login!");
                return "redirecionarLogin";
            }
        }
        
        return null;
    }
}

A implementação acima demonstra um filtro Zuul que intercepta requisições e verifica a auetnticação do usuário antes de permitir o acesso ao serviço de notícias.

Tags: spring-cloud Zuul Hystrix netflix api-gateway

Publicado em 7-18 10:44