Mecanismo de protección SpringCloud Hystrix

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.
Inserte la descripción de la imagen aquí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á.
Inserte la descripción de la imagen aquí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 .

Inserte la descripción de la imagen aquí

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

Diagrama esquemáticoHystrix 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.timeoutInMillisecondsestablecer 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

Supongo que te gusta

Origin blog.csdn.net/weixin_42789301/article/details/105093898
Recomendado
Clasificación