Hystrix豪猪哥
1、分布式系统面临的问题
复杂分布式系统结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
简单来说:A调用B,B调用C,C调用D,或者A同事调B、C、D等情况,如果一切顺利则没有问题,但中间的某个服务可能超时、机房断电等原因就整个崩溃!
2、服务雪崩
如果某个微服务调用的响应时间过长或者不可用,对微服务A的低啊用就会占用越来越多的系统资源,进而引起系统崩溃,这就是所谓的“雪崩效应”。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。所以,通常当你发现一个模块下的某个实例失败后,这时候整个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。
3、Hystrix
Hystrix是一个用于处理分布式系统的延时和容错的开源库,Hystrix能够保证在一个依赖出问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务低啊用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
github网站:https://github.com/Netflix/Hystrix
4、Hystrix的功能
- 服务降级
- 服务熔断
- 接近实时的监控
4.1 服务降级fallback
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback。
发生降级的原因:
-
程序运行异常
-
超时
-
服务熔断触发服务降级
-
线程池/信号量打满与会导致服务降级
配置如下:
//服务调用降级注解(本方法调用超过配置的时间或者出现异常等会调用注解中的方法) @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", //服务降级要调用的方法 commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //配置此方法超时时间为3秒 })
4.2 服务熔断break
类比保险丝达到最大服务访问后,直接拒绝访问,然后调用服务降级的方法并返回友好提示。
熔断机制概述:熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长是,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用链路。
在Spring Cloud框架里,熔断机制是通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,默认是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand
熔断类型:
- 熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态
- 熔断关闭:熔断关闭不会对服务进行熔断
- 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则认为当前服务恢复正常,关闭熔断
配置如下:
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", //服务降级调用方法
commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间窗口期 10秒
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60") //失败率达到多少后跳闸
//参数总结:在开启断路器的情况下,10秒内如果有超过10次请求且失败率大于等于60%就熔断
})
Hystrix实现了自动恢复功能,熔断后,Hystrix会启动一个休眠时间窗,当休眠时间窗到期,断路器会进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将闭合,主逻辑恢复;如果此次请求依然有问题,断路器将继续打开,休眠时间重新计时。
4.3 服务限流flowlimit
秒杀高并发等操作,严禁全部过来拥挤,排队,一秒钟N个有序进行访问