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>
- Classe de Inicialização
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
- 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
- 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.