Nube de Spring: Hystrix

    Visi贸n general

    En este art铆culo, te presentaremos Spring Cloud Netflix Hystrix. Es una biblioteca de tolerancia a fallas, que implementa la Cortacircuitos patr贸n empresarial: un patr贸n dise帽ado para evitar fallas en cascada.

    En una arquitectura de microservicio t铆pica, 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.

    Una sola falla puede resultar en fallas en cascada que conducen a demasiadas llamadas de red fallidas, desperdicio de memoria y ralentiza el servicio superior que realmente recibi贸 la solicitud.

    El principio del patr贸n del interruptor autom谩tico es an谩logo al de la electr贸nica:

    Hay disyuntores en nuestras casas que est谩n atentos a cualquier falla. Cuando ocurre una falla, abre el circuito (desconectando el circuito) y as铆 a铆sla el 谩rea fallada. Una vez que haya solucionado el problema, puede cerrar manualmente el circuito girando el interruptor. Esto evita que su casa se queme.

    Del mismo modo, Hystrix est谩 observando los m茅todos para las llamadas fallidas a los servicios descendentes. Si una llamada de servicio descendente falla con m谩s frecuencia de lo permitido, Hystrix “abrir谩 el circuito” y aislar谩 las llamadas a ese servicio.

    Podemos agregar un m茅todo de respaldo al 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 da tiempo al servicio que falla aguas abajo para recuperarse.

    Preparar

    Este art铆culo asume que ya tiene conocimiento del proyecto Eureka de Netflix, que se usa como registro de servicios y para balanceo de carga.

    As铆 es como se ve nuestro servicio de back-end:

    • Servidor Eureka: Act煤a 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 de /recommendations y corriendo en el puerto 8070.
    • Servicio al usuario: Un servicio REST simple que tiene un 煤nico punto final de /personalized/{id} y corriendo en el puerto 8060.

    El servicio de usuario llama internamente al servicio de recomendaciones para obtener resultados 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 con todos los servicios, navegue con su navegador hasta el servidor de Eureka en http: // localhost: 8761 /:

    Ahora, probemos el punto final del servicio de usuario navegando con el navegador al http: // localhost: 8060 / personalizado / 1 punto final:

    Ahora, solo para ver que pasa, detente recommendation-service y vuelva a presionar el punto final anterior:

    Entonces tenemos un 500 respuesta de error, y esto puede cambiar dependiendo de la implementaci贸n.

    Ser铆a malo que 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, vamos a implementar 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:

    Para habilitar Hystrix, tenemos que anotar nuestra clase principal con @EnableCircuitBreaker o @EnableHystrix. La primera opci贸n nos permite implementar el patr贸n de interruptor autom谩tico con otras tecnolog铆as tambi茅n. La 煤ltima opci贸n nos permite implementar el patr贸n del disyuntor 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 buscar lugares adecuados para implementar el patr贸n de disyuntores. 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 riesgoso y nos permite definir un respaldo y un punto de interrupci贸n para 茅l, utilizando el fallbackMethod atributo.

    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 el @HystrixCommand anotaci贸n, agregamos un atributo de fallbackMethod, que apunta al m茅todo alternativo que queremos ejecutar. Este atributo tiene que coincidir exactamente con el nombre de nuestro m茅todo, por supuesto.

    Observe que el tipo de retorno y el par谩metro del m茅todo de reserva son los mismos que los del 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.

    Reconstruyamos y comencemos nuevamente el servicio al usuario. Funcionar谩 igual que antes cuando el recommendation-service depende.

    Pero si detenemos el recommendation-service y presione el servicio de usuario /personalized/{id} endpoint nuevamente, obtendremos un mensaje muy diferente:

    Para configurar el @HystrixCommand puedes usar el commandProperties atributo con una lista de @HystrixProperty anotaciones.

    Panel de Hystrix

    Hystrix tambi茅n proporciona una funci贸n opcional para monitorear todos sus interruptores de circuito de una manera visualmente amigable.

    Creemos un nuevo proyecto para este tablero. Como siempre, la mejor manera de comenzar con un proyecto esqueleto es usar Spring Initializr.

    Seleccione su versi贸n preferida de Spring Boot y agregue la dependencia “Hystrix Dashboard”, y generela como un proyecto Maven:

    Para habilitarlo tenemos que agregar el @EnableHystrixDashboard anotaci贸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 9903 y navegue nuestro navegador hasta el http: // localhost: 9903 / hystrix punto final:

    Agregar flujo de m茅tricas de Hystrix

    Para poder utilizar el panel de Hystrix, nuestros microservicios habilitados para respaldo deben proporcionar datos al panel a trav茅s de un flujo de m茅tricas de Hystrix.

    Para agregar esto en nuestro servicio de usuario, necesitamos incluir el actuator dependencia a nuestro proyecto:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    Adem谩s, en tu application.properties incluyamos la corriente:

    management.endpoints.web.exposure.include= hystrix.stream
    

    Hacerlo expone el /actuator/hystrix.stream como punto final de gesti贸n.

    Supervisi贸n de una secuencia de Hystrix

    Necesitamos monitorear el flujo de m茅tricas hystrix del servicio de usuario. Para eso, escriba http://localhost:8060/actuator/hystrix.stream en el cuadro y haga clic en “Monitor Stream”.

    Puede ver muchas m茅tricas con respecto al punto final del servicio de usuario a trav茅s de este flujo.

    Monitorear muchas aplicaciones habilitadas para Hystrix podr铆a ser un desaf铆o, por lo que Spring proporcion贸 otro proyecto llamado Turbina, que agregar谩 transmisiones para presentarlas en un panel de Hystrix.

    Conclusi贸n

    En este art铆culo, hemos cubierto c贸mo usar el mecanismo de reserva de Hystrix para nuestros microservicios para evitar fallas en cascada. Tambi茅n configuramos Hystrix Metrics Streams en Hystrix Dashboard para monitorear las m茅tricas de nuestros endpoints.

    Como siempre, el c贸digo de los ejemplos utilizados en este art铆culo se puede encontrar en Github.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *