Hystrix 介绍
Hystrix [hɪst’rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。SpringCloud Hystrix
是Netflix开源的一款容错框架,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能,同样具有自我保护能力。为了实现容错和自我保护
服务雪崩
分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。
一个服务失败,导致整条链路的服务都失败的情形,我们称之为服务雪崩
服务降级
一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然会出现局部的错误,但可以避免因为一个服务挂机,而影响到整个架构的稳定性。
通过服务降级,能保证在某个或某些服务出问题的时间,不会导致整个项目出现问题,避免级联故障,从而来提高分布式系统的弹性。
服务熔断
Hystrix意为“断路器”,就和我们生活中的保险丝,开关一个道理。
当我们给整个服务配置了服务降级后,如果服务提供者发生了错误后,就会调用降级后的方法来保证程序的运行。但是呢?有一个问题,调用者并不知道它调用的这个服务出错了,就会在业务发生的时候一直调用,然后服务会一直报错,然后去调用降级方法。好比下图中:
Hystrix入门案例
添加如下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启动类上添加注解
@EnableHystrix
使用feign
请求数据 ,加上注解@HystrixCommand(fallbackMethod="fallback")
fallback
是方法 在方法中保持传参和返回值相同。
服务报错降级
// http://localhost:7001/consumer/test
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/test")
public String testFeign(String str) throws Exception {
if ("y".equalsIgnoreCase(str)) {
throw new Exception();
}
return providerService.provider(str);
}
public String fallback(String str) {
return "服务繁忙,请稍后重试!";
}
服务超时降级
// http://localhost:7001/consumer/timeout
@HystrixCommand(fallbackMethod = "timeout",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
@GetMapping("/timeout")
public String testTimeout(String str) throws Exception {
Thread.sleep(5000);
return providerService.provider(str);
}
public String timeout(String str) {
return "请求时间超时";
}