hystrix是什么?
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
降级,超时
我们先来解释一下降级,降级是当我们的某个微服务响应时间过长,或者不可用了,讲白了也就是那个微服务调用不了了,我们不能把错误信息返回出来,或者让他一直卡在那里,所以要在准备一个对应的策略(一个方法)当发生这种问题的时候我们直接调用这个方法来快速返回这个请求,不让他一直卡在那 。
停更维护
https://github.com/Netflix/Hystrix
Hystrix is no longer in active development, and is currently in maintenance mode.
服务降级(fallback)
- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池/信号量打满也会导致降级
解决
- 被调用服务超时了,调用者不能一直卡死等待,必须有服务降级
- 被调用服务down机了,调用者不能一直卡死等待,必须有服务降级。
- 被调用服务OK,调用者自己出故障或有自我要求(自己的等待时间小于服务提供者),自己服务降级。
服务熔断(break)
- 断路器 (保险丝)
- 熔断机制概述:熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长,会产生服务降级。进而熔断该节点微服务调用,快速返回错误响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路
- 在Spring Cloud框架中。熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省值5秒内20次调用失败,就会启动熔断机制,熔断机制的注解是@HystrixCommand
服务降级提倡者:https://martinfowler.com/bliki/CircuitBreaker.html
熔断状态
- 熔断打开:请求不在进行调用当前服务,内部设置时钟一般为MTTR(平均故障时间),当打开时长达到所设时钟则进入半熔断状态
- 熔断关闭:熔断关闭不会对服务进行熔断
- 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则认为当前服务恢复正常,关闭熔断
熔断在什么情况下开始起作用
- 当满足一定的阀值的时候(默认10秒超过20个请求次数)
- 当失败率达到一定的时候(默认10秒内超过50%的请求失败)
- 到达以上阀值,断路器将会开启
- 当开启的时候,所有的请求不会再进行转发
- 一般时间后(默认5秒),这个时候断路器是半开状态,会让其中一个请求进行转发,如果成功,断路器会关闭,如果失败,继续开启,重复4和5
hystrix所有配置参数详解:https://blog.csdn.net/tongtong_use/article/details/78611225
服务限流(flowlimit)
实时化监控
hystrix可以搭建可视化界面
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
启动类上增加
@EnableHystrixDashboard
Spring Cloud F版后需要配置Bean
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet hystrixMetricsStreamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(hystrixMetricsStreamServlet);
servletRegistrationBean.setLoadOnStartup(1);
servletRegistrationBean.addUrlMappings("/hystrix.stream");
servletRegistrationBean.setName("HystrixMetricsStreamServlet");
return servletRegistrationBean;
}
七色、一圈、一线