(Turn) El tutorial de SpringCloud más simple de la historia | Parte 4: Disyuntor (Hystrix) (Versión Finchley)

En la arquitectura de microservicio, los servicios se dividen en servicios individuales según el negocio. Los servicios y los servicios pueden llamarse entre sí (RPC). En Spring Cloud, puede usar RestTemplate + Ribbon y Feign para llamar. Para garantizar su alta disponibilidad, generalmente se implementa un único servicio en clústeres. Debido a razones de la red o sus propias razones, no se garantiza que el servicio esté 100% disponible. Si un solo servicio tiene un problema, el hilo se bloqueará al llamar a este servicio. Si una gran cantidad de solicitudes fluyen en este momento, se consumirán los recursos de subprocesos del contenedor Servlet., lo que provocará la parálisis del servicio. La dependencia entre servicio y servicio, la falla se propagará y causará consecuencias catastróficas y graves a todo el sistema de microservicio Este es el efecto "avalancha" de la falla del servicio.

Para resolver este problema, la industria ha propuesto un modelo de interruptor automático.

1. Breve introducción del disyuntor

Netflix ha creado una biblioteca llamada Hystrix que implementa el patrón de disyuntor. En una arquitectura de microservicio, es común tener múltiples capas de llamadas de servicio.

. ---- Desde el sitio web oficial

Netflix abrió el componente Hystrix e implementó el patrón del disyuntor, y SpringCloud integró este componente. En la arquitectura de microservicios, es muy común que una solicitud llame a varios servicios, como se muestra en la siguiente figura:

å¨è¿éæå ¥ å¾çæè¿ °

Si los servicios de nivel inferior fallan, causarán fallas en cascada. Cuando la indisponibilidad de llamadas a un servicio en particular alcanza un umbral (Hystric es 20 veces en 5 segundos), se abrirá el disyuntor.

å¨è¿éæå ¥ å¾çæè¿ °

Una vez que se abre el disyuntor, se pueden evitar las fallas en cascada y el método de recuperación puede devolver directamente un valor fijo.

2. Preparación

Este artículo se basa en el proyecto del artículo anterior. Primero, inicie el proyecto del artículo anterior, inicie el proyecto eureka-server, inicie el proyecto service-hi, y su puerto es 8762.

Tres, usa el disyuntor en la cinta

Para modificar el código del proyecto serice-ribbon, primero agregue la dependencia de inicio de spring-cloud-starter-netflix-hystrix en el archivo pox.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

Agregue la anotación @EnableHystrix a la clase de inicio ServiceRibbonApplication del programa para habilitar Hystrix:

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
public class ServiceRibbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Transforme la clase HelloService y agregue la anotación @HystrixCommand al método hiService. Esta anotación crea la función de un fusible para este método y especifica el método fusible fallbackMethod, el método fusible devuelve directamente una cadena, la cadena es "hola," + nombre + ", lo siento, error!", El código es el siguiente:

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

    public String hiError(String name) {
        return "hi,"+name+",sorry,error!";
    }

}

Inicio: proyecto service-ribbon, cuando visitamos http: // localhost: 8764 / hi? Name = forezp, el navegador muestra:

hola forezp, soy del puerto: 8762

Ahora cierre el proyecto service-hi, cuando visitemos http: // localhost: 8764 / hi? Name = forezp nuevamente, el navegador mostrará:

hola, forezp, orry, error!

Esto significa que cuando el proyecto service-hi no está disponible, cuando service-ribbon llama a la interfaz API service-hi, fallará rápidamente y devolverá directamente un conjunto de cadenas en lugar de esperar un tiempo de espera de respuesta, que controla bien el contenedor. el hilo está bloqueado.

Cuarto, el uso de disyuntores en Feign

Feign viene con su propio disyuntor. Después de la versión D de Spring Cloud, no está activado de forma predeterminada. Debe configurarse en el archivo de configuración para abrirlo, y el siguiente código se agrega al archivo de configuración:

feign.hystrix.enabled = verdadero

Para transformar según el proyecto de servicio-fingimiento, solo necesita agregar la clase de respaldo especificada a la anotación de la interfaz SchedualServiceHi de FeignClient:
 

@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

SchedualServiceHiHystric necesita implementar la interfaz SchedualServiceHi e inyectarla en el contenedor Ioc. El código es el siguiente:

@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

Inicie el proyecto de cuatro servcie-feign, abra el navegador http: // localhost: 8765 / hi? Name = forezp, tenga en cuenta que el proyecto service-hi no se inicia en este momento, la página web muestra:

lo siento forezp

Abra el proyecto service-hi, visite nuevamente, el navegador muestra:

hola forezp, soy del puerto: 8762

Esto prueba que el disyuntor ha funcionado.


Descarga el código fuente de este artículo:

https://github.com/forezp/SpringCloudLearning/tree/master/sc-f-chapter4

Lee mas

Resumen de los tutoriales de SpringCloud más simples de la historia

Resumen del tutorial de SpringBoot

Resumen de preguntas de la entrevista de Java

Referencia

http://blog.csdn.net/forezp/article/details/69934399

http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html

 

 

Supongo que te gusta

Origin blog.csdn.net/u014225733/article/details/100538453
Recomendado
Clasificación