SpringCloud Hystrix保护机制

Hystrix保护机制简介

Hystrix是Netflix公司的一款开源的一个延迟和容错库,用于隔离访问远程服务,第三方库,防止出现级联失败。

雪崩问题

微服务,服务间调用关系错中复杂,一个请求,可能调用多个接口服务才能实现,会形成特别复杂的调用链路。
例如:一次请求需要调用A/P/H/I四个服务,这四个服务又要调用其他服务。
在这里插入图片描述如果微服务 I 发生异常,请求阻塞,用户不会得到响应,则tomcat的这个线程不会得到释放。
在这里插入图片描述于是越来越多用户请求,越来越多的线程阻塞。服务器支持的并发数和线程是有限的,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其他服务都不可用。形成雪崩效应

在这里插入图片描述

Hystrix解决雪崩效应有两个手段:

  • 线程隔离
  • 服务熔断

线程隔离,服务降级

示意图Hystrix为每个依赖服务调用分配一个线程池,如果线程池已满调用将会被立即拒绝。默认不采用排队,加速失败,判定时间。
用户请求将不在直接访问服务,而是通过线程池中的闲置线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。

什么是降级处理?
	优先保证核心服务,而非核心服务不可用或者弱可用。

优势:
用户请求故障时,不会被阻塞或看到系统崩溃。至少可以看到一个执行结果。
导致Hystrix服务降级的情况:

  • 请求超时
  • 线程池已满

引入依赖

<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);
	}
}

或者

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

@SpringCloudApplication 组合了微服务经常会引入的三个注解,
1.@EnableCircutBreaker 开启熔断
2.@SpringBootApplication
3.@EnableDiscoveryClient 开启负载均衡

编写降级逻辑

@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 "请求繁忙";
	}

}

注意:
熔断降级逻辑方法必须跟正常逻辑方法返回值保持一致。
@HystrixCommand(fallbackMethod=“queryTestByIdFallBack”)用来声明一个降级逻辑方法。

@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”):类上指明统一的降级方法。
  • @HystrixCommand:在方法上直接使用该注解,使用默认的剪辑方法。
  • defaultFallback:默认降级方法,不用任何参数,以匹配更多方法,但是返回值一定一致

设置超时

Hystrix默认超时时间为1S,我们可以通过hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds来设置Hystrix超时时间。

hystrix:
	command:
		default:
			execution:
				isolation:
					thread:
						timeoutInMilliseconds:6000 #设置超时时间为6000ms
			

服务熔断

服务熔断原理

熔断状态机3个状态:

  • Close:关闭状态,所有请求都正常访问。
  • Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时。

修改熔断策略参数:

circuitBreaker:
	requestVolumeThreshold:10
	sleepWindowInMilliseconds:1000
	errorThresholdPercentage:50

1.requestVolumeThreshold:触发熔断的最小请求次数:默认20
2.errorThresholdPercentage:触发熔断的失败请求最小占比:默认50%
3.sleepWindowInMilliseconds:休眠时长,默认5000ms

猜你喜欢

转载自blog.csdn.net/weixin_42789301/article/details/105093898