Nube de Spring: Hystrix

N

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.

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad