En los microservicios, dividimos el sistema en muchas unidades de servicio, y cada unidad es interdependiente a través del registro de servicios y el consumo de suscripción. Pero, ¿qué sucede si algunos servicios tienen problemas?
Por ejemplo, hay tres servicios (ABC), A las llamadas B y B llama C. Debido al retraso de la red o los problemas de código de C, B no recibirá una respuesta durante mucho tiempo, por lo que las llamadas B de la solicitud B se suspenderán y esperarán.
En el caso de un alto acceso concurrente, estos hilos suspendidos no se pueden liberar, lo que hace que las solicitudes posteriores se bloqueen, y eventualmente B también colgará. Por analogía, también puede colgar, causando que todo el sistema se bloquee.
Para resolver todo el problema, Spring Cloud usa Hystrix para la protección del servicio de fallas, incluida una serie de funciones de protección, como interruptores de circuitos y aislamiento de subprocesos. Hoy echaremos un vistazo a cómo implementar interruptores de circuitos a través de Hystrix.
1. ¿Qué es Spring Cloud Hystrix? ¿Qué es un interruptor de circuito?
Spring Cloud Hystrix se implementa en función del marco de código abierto de Netflix, Hystrix y su propósito es proporcionar una fuerte tolerancia a fallas para la latencia y la falla mediante el control de esos nodos que acceden a sistemas remotos, servicios y terceros.
El interruptor de circuito es similar al interruptor de circuito de fuga utilizado en la caja eléctrica fuerte de nuestro hogar. Cuando la unidad de servicio falla (similar al cortocircuito del dispositivo eléctrico), se devuelve una respuesta de error a la persona que llama a través de la función de monitoreo de fallas del interruptor de circuito (similar al fusible), evitando la espera a largo plazo, evitando así que la falla se extienda a todo el sistema.
2. Si no hay un interruptor de circuito, la pantalla se muestra
¿Todavía recuerda los tres servicios en la Spring Cloud Introduction Series 2: Usar Eureka para el gobierno de servicios (Eureka/Hello-Service/Hello-Consumer) que escribimos antes? Realizamos experimentos basados en esto.
1. Inicie el Centro de registro de servicio Eureka con el número de puerto 1111
2. Comience al proveedor de servicios de saludo. Aquí comenzamos dos servicios, con los números de puerto 9090, 9091 respectivamente.
3. Comience a hola-consumo para servir a los consumidores, con el puerto número 9999; En este momento, no tenemos problemas para visitar http: // localhost: 9999/hola-consumo varias veces.
4. Apague el servicio con el número de puerto 9091, y luego visite http: // localhost: 9999/hello-consumer varias veces, y se informó un error.
PD: Aquí explicamos por qué necesitamos acceder varias veces, porque hemos logrado el equilibrio de carga a través de la cinta. Cuando accedamos a http: // localhost: 9999/hola-consumo, encuestaremos dos servicios que acceden al servicio de saludo. Se informará un error al acceder a un servicio con el número de puerto 9091. No habrá problemas para acceder a un servicio con 9090.
3. Implementación del código del interruptor de circuito
A continuación, echemos un vistazo a cómo implementar el código. No modificamos el centro de registro de servicios y el proveedor de servicios, solo necesitamos modificar el consumidor de servicio de servicio.
1. Modifique los archivos POM e introduzca las dependencias de Hytrix
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion> 4.0.0 </modelversion> <MoupRoD> com.sam </groupid> <artifactid> hello-conconsumer </artifactid> <lision> <MoupRoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <verserse> 1.5.1.release </versión> </parent> <properies> <javaversion> 1.8 </javaversión> </propiedades> <defferencyManemage> <pendences> <ppersion> <MoupRid> org.springframework.cloud </groupid> <artifactid> spring-ncloud-dependencies </artifactid> <version> camden.sr6 </versevers> <proy> pom </type> <cope> import </cope> </dependency> </dependency> </dependency ganagement> <pendencies> <!-introducir eureka cliente-<play de dependencias> <MoupRoD> org.springframework.cloud </groupid> <artifactID> spring-ncloud starter-eureka </artifactid> </pepertency> <!-Introducir la dependencia de la cinta se utiliza para implementar el equilibrio de carga. Solo lo estamos usando aquí y no lo introduciremos en otro lugar-> <Spendency> <MoupRupid> org.springframework.cloud </groupid> <artifactid> spring-ncloud-starter-ribbon </artifactid> </dependency> <!-Introducción de las dependencias de Hystrix para implementar la protección de tolerancia de servicio de servicio-> <fependency> <ProupId> org.sPringFrameMaud <cloude.cloude <artifactID> Spring-Cloud-Starter-Hystrix </artifactid> </pendency> </dependencias> </proyecto>
2. Modifique la clase de inicio, agregue anotación @enablecircuitbreaker y habilite el interruptor de circuito
@Habilitados en el método de bean se aplica en el método y utiliza el valor de retorno del método para el valor de retorno de retorno de la clase de BreakCuterPublic@bean y se utiliza para establecer el valor de retorno del método para ser bean @Bean @loadBalanced //@LoadBalanced para lograr la carga de equilibrio de carga. } public static void main (string [] args) {springapplication.run (consumo de consumo.class, args); }}En este momento, encontrará que esta clase de inicio tiene tres anotaciones. ¿No es esto muy problemático? No importa, podemos usar la anotación @springcloudapplication
@SpringCloudApplicationPublic Class ConsumerApp {// @bean se aplica en el método y se utiliza para establecer el valor de retorno del método para ser bean @Bean @loadBalanced // @LoadBalanced para lograr la carga de carga RESTTEMPLATE PUBLICA } public static void main (string [] args) {springapplication.run (consumo de consumo.class, args); }}@SpringCloudApplication = @EnabledScoveryClient +@SpringBootApplication +@enableCircuitBreaker, puede ver desde el código fuente:
@Target (elementType.type) @Retention (retentionPolicy.Runtime)@documentado@heredado@springbootapplication@habilitedScoveryClient@habilitisbreakerPublic @Interface SpringCloudApplication {}3. Servicio de Agente
@ServicePublic Class ConsumerService {@aUtowired RestTemplate RestTemplate; @HystrixCommand (fallbackMethod = "errorMsg") public string consumer () {// llame al servicio de hello-service, tenga en cuenta que el nombre del servicio se usa aquí, no el IP+puerto resttEmplate.getForObject ("http: // hello-service/hello", string.class); regrese "¡Hola acabado del consumidor!"; } public String ErrormSg () {return "Error !!!"; }}Ponemos la implementación del controlador original de llamar a RestTemplate en el servicio, y especificamos el método de devolución de llamada a través de @hystrixCommand, y llamamos a este método cuando ocurre un error.
4. Modifique el controlador
/** *El RESTTemplate ya no se llama directamente aquí, *sino que se implementa llamando al servicio * */ @RestControllerPublic Class ConsumeController { @Autowired // RestTemplate RestTemplate; Servicio de servicio de consumo; @RequestMapping ("/Hello-Consumer") Public String HELOCONSUMER () {// // Llame al servicio Hello-Service, tenga en cuenta que el nombre del servicio se usa aquí, no el IP+Port // Resttemplate.getForObject ("http: // Hello-Service/Hello", String.class); devuelve servicio.consumer (); }}5. Prueba, múltiples visitas, y cuando se informa un error, se mostrará el siguiente contenido.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.