Laboratório 05

Objetivos

  • Implementando circuit breakers com Netflix Hystrix

Tarefas

Implemente circuit breaker via @HystrixCommand

  • Utilize os projetos definidos no exercício anterior
  • Adicione a dependência spring-cloud-starter-hystrix no projeto do aluno-service
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
  </dependency>
  • Ative a configuração do Hystrix utilizando a anotação @EnableCircuitBreaker na aplicação
  @@EnableCircuitBreaker
  @SpringBootApplication
  public class Application {
      public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
      }
  }
  • Implemente uma classe DisciplinaServiceProxy para controlar as chamadas do aluno-service -> disciplina-service
  @Service
  public class DisciplinaServiceProxy {
      // TODO
  }
  • Injete a interface Feign DisciplinaClient via @Autowired na classe proxy
  • Implemente um método para recuperar os nomes das disciplinas via disciplina-service utilizando a interface Feign DisciplinaClient
  • Implemente um fallback método para recuperar nomes das disciplinas caso o disciplina-service esteja indisponível
  • Utilize a anotação @HystrixCommand para configurar um circuit breaker na chamada do método de recuperação dos nomes das disciplinas
  @HystrixCommand(fallbackMethod = "getNomesDisciplinasFallback")
  public List<String> getNomesDisciplinas() {
      // ...
  }
  • Configure as seguintes propriedades para o Hystrix Command utilizando anotação @HystrixProperty
    • execution.isolation.strategy = THREAD
    • circuitBreaker.requestVolumeThreshold = 5
    • requestCache.enabled = false
  • Configure também as seguintes propriedades para o comportamento do Hystrix thread pool
    • coreSize = 5
    • maximumSize = 5
@HystrixCommand(fallbackMethod = "getNomesDisciplinasFallback",
  commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="THREAD"),
      @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="5"),
      @HystrixProperty(name="requestCache.enabled", value="false"),
  },threadPoolProperties = {
      @HystrixProperty(name="coreSize", value="5"),
      @HystrixProperty(name="maximumSize", value="5")
  })
  • Injete o objeto DisciplinaServiceProxy no REST controller, e utilize para acessar os nomes das disciplinas
  • Execute e teste a aplicação
    • Tente realizar mais de 5 chamadas consecutivas ao circuito definido
    • Verifique se o circuito foi aberto acessando o /health status do serviço
      • http://localhost:8080/health
      • Caso não apareça as informações, tente desabilitar a proteção de segurança via management.security.enabled = false

Implemente um circuit breaker via Feign Hystrix fallback

  • Utilize os projetos definidos anteriormente
  • Adicione a dependência spring-cloud-starter-hystrix no projeto da disciplina-service
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
  </dependency>
  • Ative a configuração do Hystrix utilizando a anotação @EnableCircuitBreaker na aplicação
  @@EnableCircuitBreaker
  @SpringBootApplication
  public class Application {
      public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
      }
  }
  • Implemente uma classe AlunoClientFallback fornecendo uma implementação de fallback para cada método definido na interface Feign AlunoClient
  @Component
  public class AlunoClientFallback implements AlunoClient {
      // TODO
  }
  • Configure a implementação deste fallback na interface Feign do AlunoClient
  @FeignClient(name = "aluno-service", fallback = AlunoClientFallback.class)
  public interface AlunoClient {
      // ...
  }
  • Configure a propriedade feign.hystrix.enabled nas configurações da disciplina-service
feign:
  hystrix:
    enabled: true
  • Configure as seguintes propriedades para o Hystrix Command nas propriedades do Config Server
    • execution.isolation.strategy = SEMAPHORE
    • execution.isolation.semaphore.maxConcurrentRequests = 5
    • fallback.isolation.semaphore.maxConcurrentRequests = 5
    • circuitBreaker.requestVolumeThreshold = 5
hystrix:
  command:
    AlunoClient#getAllAlunos():
      execution:
        isolation:
          strategy: SEMAPHORE
          semaphore:
            maxConcurrentRequests: 5
      fallback:
        isolation:
          semaphore:
            maxConcurrentRequests: 5
      circuitBreaker:
        requestVolumeThreshold: 5
  • Execute e teste a aplicação

Monitore um circuit breaker com Hystrix Dashboard

  • Utilize os projetos definidos no exercício anterior
  • Crie um novo projeto Spring Boot para representar o Hystrix Dashboard
  • Configure o suporte da plataforma Spring Cloud no pom.xml
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • Adicione a dependência spring-cloud-starter-hystrix-dashboard no seu projeto
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>
  • Adicione a anotação @EnableHystrixDashboard na classe Application
@EnableHystrixDashboard
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • Adicione a configuração do novo serviço Hystrix Dashboard no Config Server
server:
  port: ${PORT:7979}

eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
  instance:
    preferIpAddress: true
  • Não se esqueça de configurar o bootstrap.yml na aplicação para se conectar com o Config Server
spring:
  application:
    name: hystrix-dashboard
  cloud:
    config:
      uri: http://localhost:8888  

[OPCIONAL]: Monitore todos os circuit breakers via Turbine

  • Utilize os projetos definidos anteriormente
  • Adicione a dependência spring-cloud-starter-turbine no projeto do hystrix-dashboard
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-turbine</artifactId>
    </dependency>
  • Adicione a anotação @EnableTurbine na classe Application
@EnableTurbine
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • Configure o cluster Turbine para monitoramento nas propriedades da aplicação
turbine:
  appConfig: aluno-service,disciplina-service
  clusterNameExpression: "'default'"