Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Sprimg Cloud: Hystrix

Visión general

En este artículo, le presentaremos Spring Cloud Netflix Hystrix . Es una biblioteca de tolerancia a fallos, que implementa el patrón de empresa del Disyuntor , un patrón diseñado para evitar fallas en cascada.
En una arquitectura típica de microservicio tenemos muchas aplicaciones pequeñas que se ejecutan por separado. Es bastante común que un servicio llame a otro servicio (puede ser más de uno) para completar una solicitud en particular. Siempre existe la posibilidad de que uno de estos servicios posteriores no responda correctamente o simplemente falle por completo.
Un solo bloqueo puede provocar fallos en cascada que conducen a demasiadas llamadas fallidas de la red, desperdicio en la memoria y hace que el servicio principal que realmente recibió la solicitud sea más lento.
El principio del patrón del interruptor es análogo a la electrónica:
Hay interruptores de circuito en nuestras casas que vigilan cualquier falla. Cuando ocurre una falla, abre el circuito (desconectando el circuito) y por lo tanto aísla el área fallada. Una vez que haya solucionado el problema, puede cerrar el circuito manualmente al presionar el interruptor. Esto evita que tu casa se queme.
De la misma manera, Hystrix está observando métodos para fallar llamadas a servicios de flujo descendente. Si una llamada de servicio descendente falla más de lo permitido, Hystrix "abrirá el circuito", aislando las llamadas a ese servicio.
Podemos agregar un método alternativo que se llamará si el circuito está abierto, lo que nos permite recuperar la aplicación del estado de falla. Hystrix cierra automáticamente el circuito después de un cierto tiempo, lo que le da tiempo al servicio que falla en el proceso de recuperación.

Preparar

En este artículo se supone que ya tiene conocimiento del proyecto Eureka de Netflix , que se utiliza como registro de servicios y para equilibrar la carga.
Así es como se ve nuestro servicio de back-end:
  • Eureka Server : funciona como un registro de servicios y se ejecuta en el puerto 8761.
  • Servicio de recomendación : un servicio REST simple que tiene un único punto final /recommendationsy se ejecuta en el puerto 8070.
  • Servicio de usuario : un servicio REST simple que tiene un único punto final /personalized/{id}y se ejecuta en el puerto 8060.
El servicio de usuario llama internamente al servicio de recomendación para obtener un resultado para /personalized/{id}:
@RestController
public class UserRestController {

    @Autowired
    RestTemplate restTemplate;

    @GetMapping(value = "/personalized/{id}")
    public Product[] personalized(@PathVariable int id) {
        Product[] result = restTemplate.getForObject("http://recommendation-service/recommendations", Product[].class);
        return result;
    }
}
Comencemos todos los servicios, navegue su navegador al servidor Eureka en http: // localhost: 8761 / :
spring-cloud-hystrix-setup
Ahora, probemos el punto final del servicio de usuario al navegar por el navegador al http: // localhost: 8060 / personalizado / 1 punto final:
spring-cloud-hystrix-user-service-result-success
Ahora, solo para ver qué sucede, deténgase recommendation-servicey golpee nuevamente el punto final anterior:
spring-cloud-hystrix-user-service-result-failuer
Entonces obtuvimos una 500respuesta de error, y esto puede cambiar dependiendo de la implementación.
Sería malo si esto sucediera cuando un usuario final confía en nuestra aplicación. ¿Y si otro servicio también estuviera esperando una respuesta?
Para evitar estas situaciones, avancemos e implementemos Hystrix en nuestra aplicación.

Añadiendo Hystrix

Para agregar Hystrix a nuestro servicio de usuario, necesitamos importar la dependencia apropiada en nuestro pom.xml:
<dependency>  
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>  
En el caso de que esté creando un proyecto desde cero, puede seleccionar esta dependencia desde Spring Initializr :
spring-cloud-hystrix-spring-intializr
Para habilitar Hystrix, tenemos que anotar nuestra clase principal con @EnableCircuitBreaker@EnableHystrixLa primera opción nos permite implementar el patrón del interruptor automático con otras tecnologías también. La última opción nos permite implementar el patrón de interruptor de circuito solo con Hystrix:
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
Ahora, queremos explorar los lugares adecuados para implementar el patrón del interruptor automático. Una vez que encontremos un punto que podría fallar y donde queremos romper el circuito si es necesario, lo anotaremos con @HystrixCommand.
Esto envuelve un método potencialmente arriesgado y nos permite definir un punto de retorno y un punto de interrupción, utilizando el fallbackMethodatributo.
Agreguemos esto a nuestro .personalized()método:
@GetMapping(value = "/personalized/{id}")
@HystrixCommand(fallbackMethod = "recommendationFallback")
public Product[] personalized(@PathVariable int id) {  
    Product[] result = restTemplate.getForObject("http://recommendation-service/recommendations", Product[].class);
    return result;
}

public Product[] recommendationFallback(int id) {  
    System.out.println("=======recommendationFallback=========" + id);
    return new Product[0];
}
En la @HystrixCommandanotación, agregamos un atributo de fallbackMethod, que apunta al método alternativo que queremos ejecutar. Este atributo tiene que coincidir exactamente con nuestro nombre de método, por supuesto.
Observe que el tipo de retorno y el parámetro del método de reserva son los mismos que el método original. Esto se debe a que el método alternativo debe tener la misma firma que el original. Aunque, en lugar de devolver cualquier dato real, simplemente devolvemos una matriz vacía.
Vamos a reconstruir y comenzar de nuevo el servicio de usuario. Funcionará de la misma manera que antes cuando recommendation-serviceestá arriba.
Pero si volvemos a detener recommendation-service/personalized/{id}volvemos a llegar al punto final del servicio de usuario, recibiremos un mensaje muy diferente:
spring-cloud-hystrix-user-service-fallback
Para configurar el @HystrixCommandpuede usar el atributo commandProperties con una lista de anotaciones @HystrixProperty .

Hystrix Dashboard

Hystrix también proporciona una función opcional para monitorear todos sus interruptores de circuito de una manera amigable a la vista.
Vamos a crear un nuevo proyecto para este panel. Como siempre, la mejor manera de comenzar con un proyecto de esqueleto es usar Spring Initializr.
Seleccione su versión preferida de Spring Boot y agregue la dependencia "Hystrix Dashboard", y genérela como un proyecto de Maven:
spring-cloud-hystrix-spring-intializer-hystrix-dashboard
Para habilitarlo tenemos que agregar la @EnableHystrixDashboardanotación a nuestra clase principal:
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {  
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardApplication.class, args);
    }
}
Comencemos este servicio en el puerto 9903y navegamos nuestro navegador hasta el punto final http: // localhost: 9903 / hystrix :
spring-cloud-hystrix-dashboard-ui

Agregando Hystrix Metrics Stream

Para poder utilizar el panel de control de Hystrix, nuestros microservicios habilitados para el respaldo necesitan proporcionar datos al panel de control a través de un flujo de métricas de Hystrix.
Para agregar esto a nuestro servicio de usuario necesitamos incluir la actuatordependencia de nuestro proyecto:
<dependency>  
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>  
Además, en tu application.propertiesvamos a incluir la corriente:
management.endpoints.web.exposure.include= hystrix.stream  
Al hacerlo se expone /actuator/hystrix.streamcomo un punto final de gestión.

Monitoreo de un flujo de Hystrix

Necesitamos monitorear la corriente métrica de hystrix del servicio de usuario. Para eso, vamos a escribir en http://localhost:8060/actuator/hystrix.streamel cuadro y haga clic en "Monitor Stream" .
spring-cloud-hystrix-dashboard-ui
Podría ver muchas métricas con respecto al punto final del servicio de usuario a través de esta secuencia.
El monitoreo de muchas aplicaciones habilitadas para Hystrix podría ser un desafío, por lo que Spring proporcionó otro proyecto llamado Turbine , que agregará flujos para presentar en un panel de Hystrix.

Conclusión

En este artículo, hemos cubierto cómo utilizar el mecanismo de retorno de Hystrix en nuestros microservicios para evitar fallas en cascada. También configuramos Hystrix Metrics Streams en Hystrix Dashboard para monitorear las métricas de nuestros puntos finales.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas