Modo de interruptores de curcu
En entornos distribuidos, especialmente en sistemas distribuidos con estructuras de microservicios, es muy común que un sistema de software llame a otro sistema remoto. La calle de esta llamada remota puede ser otro proceso u otro host en toda la red. La mayor diferencia entre esta llamada remota y la llamada interna del proceso es que la llamada remota puede fallar o colgar sin ninguna respuesta hasta el tiempo de espera. Peor aún, si múltiples llamadas llaman al mismo servicio pendiente, es muy probable que la espera de tiempo de espera de un servicio se extienda rápidamente a todo el sistema distribuido, causando una reacción en cadena y, por lo tanto, consuma una gran cantidad de recursos de todo el sistema distribuido. Eventualmente puede conducir a la parálisis del sistema.
El modo de interruptores del circuito es para evitar desastres causados por una reacción en cadena similar a la cascada en los sistemas distribuidos.
Una vez que cierto aparato eléctrico tiene problemas, el fusible del circuito soplará para evitar el desastre. Los interruptores de circuitos son similares a los fusibles de circuito. La idea de implementación es muy simple. Pueden encapsular servicios remotos que necesitan protección y monitorear el número de fallas internamente. Una vez que el número de fallas alcanza un cierto umbral, todas las llamadas posteriores al servicio le devolverán directamente el error a la persona que llama después de que el interruptor de circuito se intercepta, y no continuará llamando al servicio que ya ha tenido problemas, logrando así el propósito de proteger a la persona que llama. Todo el sistema no experimentará una reacción en cadena de cascadas causada por el tiempo de espera.
1. Modo básico
La figura anterior es la estructura de un interruptor de circuito (interruptor de curcuit), que tiene dos estados básicos (cerca y abierto) y una acción de viaje básica:
En el estado cercano, el cliente solicita el servicio al proveedor directamente a través del interruptor de circuito sin ningún obstáculo. El valor de retorno del proveedor es devuelto directamente al cliente por el interruptor de circuito.
En el estado abierto, después de que el cliente inicia una solicitud de servicio al proveedor, el interruptor de circuito no transferirá la solicitud al proveedor, sino que devolverá directamente el cliente, y la ruta entre el cliente y el proveedor está rota.
Viaje: en el estado de cierre, si el proveedor continúa corriendo el tiempo y el error, después de alcanzar el umbral especificado, el viaje se producirá en el interruptor de circuito, y luego el estado del interruptor del circuito entrará abierto desde el cierre.
2. Modo extendido
En el modo de disyuntor básico, asegura que el disyuntor no se llame cuando el interruptor de circuito esté en el estado abierto, pero también necesitamos medidas adicionales para restablecer el interruptor de circuito después de que el suministrador restaura el servicio. Una forma factible es detectar regularmente si el servicio del proveedor está restaurado y una vez que se restaura, el estado se cierre. El estado del interruptor del interruptor del circuito está medio abierto.
3. Use ocasiones para disyuntores:
Un proveedor es generalmente muy estable. Si una vez que ocurre una falla, el tiempo de inspección y recuperación lleva mucho tiempo y no se puede reparar rápidamente en poco tiempo, entonces este servicio es más adecuado para usar el modo de interruptores de circuito. De lo contrario, es probable que conduzca a un efecto de ping-pong.
3. El disyuntor no es adecuado para ocasiones:
Para evitar que una aplicación intente invocar un servicio remoto o acceder a un recurso compartido, este patrón puede no ser adecuado si es muy probable que la operación falle.
Para procesar aplicaciones que acceden a recursos dedicados locales, como estructuras de datos dentro de la memoria. En este entorno, generalmente no es adecuado, y el uso de un interruptor de circuito solo aumentará la sobrecarga del sistema.
La siguiente es una introducción directa a cómo usar el interruptor de circuito de Spring Cloud.
SpringCloud Netflix implementa el nombre de la biblioteca de interruptores de circuitos llamado Hystrix. Bajo la arquitectura de microservicio, generalmente hay múltiples niveles de llamadas de servicio. El siguiente es un diagrama esquemático del navegador que accede a los microservicios de back -end a través de API bajo la arquitectura de microservicio:
La falla de un tiempo de espera de microservicio puede conducir a una reacción en cadena de cascadas. En la figura a continuación, Hystrix evita que esto suceda a través de un interruptor de circuito de retroalimentación autónomo.
El servicio B en la figura falla por alguna razón y no está disponible. Todas las llamadas al Servicio B pasarán tiempo. Cuando la llamada a B no puede alcanzar un umbral específico (20 fallas ocurren dentro de los 5 segundos son el valor predeterminado definido por Hystrix), el enlace estará en el estado abierto, y luego todas las llamadas al servicio B no se ejecutarán, en su lugar, un mensaje respaldo que indica el enlace abierto proporcionado por el interruptor del circuito. Hystrix proporciona un mecanismo correspondiente que permite a los desarrolladores definir este mensaje Fallbak.
El enlace de Open bloquea un error de cascada, lo que permite que los servicios inundados o incorrectos tengan tiempo para solucionar. Este retroceso puede ser otra llamada protegida de Hystrix, datos estáticos o valor nulo legal. Las respuestas pueden formar una estructura de cadena, por lo que el primer retroceso que llama a otros servicios comerciales en la parte inferior para devolver datos estáticos.
A continuación, vayamos al punto, agregando un interruptor de circuito a los dos grupos de servicio de Hello World para evitar que uno de los Hello World se aflojara, lo que hace que el sistema no encadene el tiempo de espera.
1. Agregue la biblioteca Hystrix para admitir interruptores de circuitos en el proyecto POM.XML del Proyecto Maven (Cink o Feign Project introducido en el capítulo anterior)
<Spendency> <MoupRupid> org.springframework.cloud </groupid> <artifactID> spring-ncloud-starter-hystrix </artifactid> </dependency>
2. Use interruptores de circuitos en aplicaciones de cinta
1). Añadir la anotación de Breakerbreaker en la clase de inicio de arranque de primavera
@SpringBootApplication@habilitados de consumoChroverClient@habilitaneCuitBreakerPublic Class ServiceRibbonApplication {public static void main (string [] args) {springapplication.run (serviceribbonapplication.class, args); }2). Anotar el método de acceder a los servicios con la anotación de @hystrixcommand
@ServicePublic Class HelloService {@aUtowired RestTemplate RestTemplate; @HystrixCommand (fallbackMethod = "ServiceFailure") public String getHElContent () {return RestTemplate.getForObject ("http: // service-helloworld/", string.class); } public String ServiceFailure () {return "¡Hello World Service no está disponible!"; }}La anotación de @hystrixCommand define un interruptor de circuito que encapsula el método Gethellocontant (). Cuando el servicio de servicio de servicio se aplica al umbral del servicio, ya no se llamará. En cambio, devuelve el método ServiceFailure () definido por FallbackMethod. Hay dos puntos a los que deben prestarse especial atención al definir el método FallbackMethod definido por la anotación @hystrixcommand:
Primero, el valor de retorno y el tipo de parámetro de FallbackMethod deben ser exactamente el mismo que el método anotado por @hystrixCommand. De lo contrario, se lanzará una excepción en tiempo de ejecución. Por ejemplo, en este ejemplo, el valor de retorno de ServiceFailure () y el valor de retorno del método GetHelContant () son ambas cuerdas.
En segundo lugar, cuando el servicio subyacente falla, FallbackMethod no reemplaza todo el método anotado por @hystrixcommand (gethellocontant en este ejemplo), sino solo el servicio específico a los que se accede a través de RestTemplate. Puede ver en la salida del sistema que incluso si falla, todavía habrá "Servicio de llamadas-amarillo" en la salida de la consola.
Comience el servicio Eureka, comience solo dos servicios de Helloworld e interrumpe uno de ellos (simule uno de los microservicios suspendidos), visite http: // localhost: 8901/y luego actualizar, debido al equilibrio de carga, puede ver que las siguientes dos páginas aparecen alternativamente. Puede ver que el segundo servicio pendiente se reemplaza por el método de manejo de errores definido en la cinta.
4. Use los disyuntores en aplicaciones fingidas
1). Feign ya es compatible con los interruptores de circuitos, por lo que no necesita pensar en el método de Ribbon, agregar anotaciones adicionales a la clase de inicio de arranque de primavera.
2). Agregue la clase Fallback con la anotación @FeignClient, que debe implementar la interfaz modificada por @FeignClient.
@FeignClient (name = "Service-howelloRld", Fallback = HelloWorldServiceFailure.Class) Interfaz pública HelloWOrldService {@RequestMapping (valor = "/", método = requestmethod.get) public String sayshello (); }3). Para crear la clase HelloWorldServiceFailure, debe implementar la interfaz HeldoworldService modificada por @FeignClient. Tenga en cuenta que agrega la anotación @Component o @Service para generar un frijol en el contenedor de resorte.
@ComponentPublic Class HelloWorldServiceFailure implementa HelloWorldService {@Override public String Sayshello () {System.out.println ("¡Hello World Service no está disponible!"); Return "¡Hello World Service no está disponible!"; }}4). En las versiones de Brixton antes de Spring Cloud, Feign activó automáticamente el interruptor de circuito de forma predeterminada, pero la versión reciente de Dalston ha cambiado la configuración predeterminada para prohibir.
Por razones, consulte: https://github.com/spring-cloud/spring-cloud-netflix/issues/1277. Presta atención a este punto. Por lo tanto, para usar interruptores de circuitos en Feign, debe agregar la siguiente configuración en Application.yml:
Feign: Hystrix: habilitado: verdadero
5). Inicie la aplicación Feign y visite http: // localhost: 8902/hola para ver el mismo efecto que la cinta.
Referencia: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients
http://projects.spring.io/spring-cloud/spring-cloud.html#spring cloud-feign-hystrix
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.