概述
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
断路器本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控,向调用方返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
重要概念
服务降级 FallBack
不让客户端等待并立刻返回一个友好提示
出现服务降级的情况
- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池、信号量打满也会导致服务降级
服务熔断:类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好的提示。
服务限流:秒杀高并发等操作,严禁一蜂窝的过来拥挤。
代码
1.引入依赖 创建服务提供方
<!--hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2.设置两个请求接口 一个直接出结果 一个等待三秒钟 当大量请求打在第一个时 自己再刷新一下 ,也不会马上出现结果了,如果大量请求打在第二个,服务可能直接崩溃。
Hystrix FallBack
上面方法调用超出或者错误时,执行fallbackmethod
一般服务降级放在客户端。
关于热部署
处理代码中每个方法都有服务降级的代码冗余问题
@DefaultProperties(defaultFallback="")放在类头上
除了个别重要核心业务有专属的服务降级方法,其他通过普通的注解统一跳转到一个处理结果页面。
方法上只需要加@HystrixCommand注解不需要加东西即可
客户端服务降级
创建一个类继承service接口,给service的feign注解加fallback属性指向新创建的继承类 实现降级方法。
熔断机制概述
熔断机制是应对雪崩效应的微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,今儿熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用链路。
在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就回启动熔断机制,熔断机制的注解是@HystrixCommand。
涉及到断路器的三个重要参数:快照时间窗、请求总数阈值、错误百分比阈值。
快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
请求总数阈值:在快照时间窗内,必须满足请求总数阈值才有资格熔断。默认为20,意味着在10s内,如果该Hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
错误百分比阈值:当请求总数在快照时间窗内超过了阈值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阈值的情况下,这时候就会将断路器打开。
一段时间后(默认是5s),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败继续开启,继续重复。
断路器开启以后,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。