Introducción al mecanismo de protección de Hystrix
Hystrix es una biblioteca de Netflix tolerante a fallas y retardo de código abierto, que se utiliza para aislar el acceso a servicios remotos y bibliotecas de terceros para evitar fallas en cascada.
Problema de avalancha
En microservicios, la relación de llamada entre servicios es incorrecta y complicada. Una solicitud puede implementarse llamando a múltiples servicios de interfaz, lo que formará un enlace de llamada particularmente complejo.
Por ejemplo: una solicitud debe llamar a cuatro servicios A / P / H / I, y estos cuatro servicios deben llamar a otros servicios.
Si ocurre una excepción en el microservicio I, la solicitud se bloquea y el usuario no obtendrá una respuesta, entonces este hilo de tomcat no se liberará.
Entonces, cada vez más solicitudes de usuarios, más y más subprocesos se bloquean. La cantidad de concurrencia y subprocesos admitidos por el servidor es limitada, y las solicitudes se bloquean todo el tiempo, lo que hará que se agoten los recursos del servidor, lo que provocará que todos los demás servicios no estén disponibles. Forma un efecto de avalancha .
Hystrix tiene dos métodos para resolver el efecto de avalancha:
- Aislamiento de subprocesos
- Fusión de servicios
Aislamiento de subprocesos, degradación del servicio
Hystrix asigna un grupo de subprocesos para cada llamada de servicio dependiente. Si el grupo de subprocesos está lleno, la llamada se rechazará de inmediato. De forma predeterminada, no se utiliza la cola, y la aceleración falla y se determina el tiempo.
Las solicitudes de usuario ya no accederán directamente al servicio, pero accederán al servicio a través de subprocesos inactivos en el grupo de subprocesos . Si el grupo de subprocesos está lleno o la solicitud se agota , se degradará.
什么是降级处理?
优先保证核心服务,而非核心服务不可用或者弱可用。
Ventaja: cuando los
usuarios solicitan una falla, no serán bloqueados ni verán fallar el sistema. Se puede ver al menos un resultado de ejecución.
Circunstancias que provocan la degradación del servicio de Hystrix:
- Tiempo de espera agotado
- El grupo de subprocesos está lleno
Introducir dependencias
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@SpringBootApplication
@EnableCircutBreaker//开启熔断
public class TestApplcation{
public static void main(String[] args){
SpringApplication.run(TestApplication.class,args);
}
}
o
@SpringCloudApplication
public class TestApplication{
public static void main(String[] args){
SpringApplication.run(TestApplication.class,args);
}
}
@SpringCloudApplication combina tres anotaciones a menudo introducidas por
microservicios , 1. @ EnableCircutBreaker activa el fusible
2. @ SpringBootApplication
3. @ EnableDiscoveryClient activa el equilibrio de carga
Escribir lógica de degradación
@RestController("test")
public class TestController{
@Autowried
private TestTemplate testTemplate;
@HystrixCommand(fallbackMethod="queryTestByIdFallBack")
public String queryTestById(@Param("id")Long id){
}
public String queryTestByIdFallBack(Long id){
return "请求繁忙";
}
}
Nota: El
método lógico de degradación de fusibles debe ser coherente con el valor de retorno del método lógico normal.
@HystrixCommand (fallbackMethod = "queryTestByIdFallBack") se utiliza para declarar un método lógico de degradación.
@RestController("test")
@DefaultProperties(defaultFallback="queryTestByIdFallBack") //声明一个全局降级逻辑方法
public class TestController{
@HystrixCommand
public String queryTestById(@Param("id")Long id){
return "";
}
public String queryTestByIdFallBack(Long id){
return "请求繁忙";
}
}
- @DefaultProperties (defaultFallback = "queryTestByIdFallBack"): indica un método de degradación unificado en la clase.
- @HystrixCommand: use esta anotación directamente en el método y use el método de edición predeterminado.
- defaultFallback: el método de degradación predeterminado, sin ningún parámetro, para que coincida con más métodos, pero el valor de retorno debe ser coherente
Establecer tiempo de espera
El tiempo de espera predeterminado de Hystrix es 1S, podemos hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
establecer el tiempo de espera de Hystrix.
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds:6000 #设置超时时间为6000ms
Fusión de servicios
Principio de fusión de servicios
Los 3 estados de la máquina de estados de fusión:
- Cerrar: estado cerrado, se accede a todas las solicitudes con normalidad.
- Abierto: estado abierto, todas las solicitudes se degradarán. Hystix cuenta las solicitudes. Hystix cuenta el número de solicitudes.Cuando el porcentaje de solicitudes fallidas alcanza el umbral dentro de un cierto período de tiempo, el fusible se activa y el disyuntor se abre por completo. El umbral de tasa de error predeterminado es del 50% y el número de solicitudes es de al menos 20 veces.
- Medio abierto: estado semiabierto. El estado abierto no es permanente. Entrará en el tiempo de reposo después de abrirse (el valor predeterminado es 5S). Entonces el disyuntor entrará automáticamente en el estado semiabierto. En este momento, se liberarán algunas solicitudes. Si estas solicitudes son correctas, el disyuntor se cerrará por completo, de lo contrario, el disyuntor permanecerá abierto y el temporizador de reposo se ejecutará nuevamente.
Modifique los parámetros de la estrategia de fusión:
circuitBreaker:
requestVolumeThreshold:10
sleepWindowInMilliseconds:1000
errorThresholdPercentage:50
1.requestVolumeThreshold: el número mínimo de solicitudes para activar el fusible: predeterminado 20
2.errorThresholdPercentage: la proporción mínima de solicitudes fallidas que activan el fusible: predeterminado 50%
3.sleepWindowInMilliseconds: duración del sueño, predeterminado 5000ms