概述

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

图片说明

涉及到断路器的三个重要参数:快照时间窗、请求总数阈值、错误百分比阈值。

  1. 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。

  2. 请求总数阈值:在快照时间窗内,必须满足请求总数阈值才有资格熔断。默认为20,意味着在10s内,如果该Hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。

  3. 错误百分比阈值:当请求总数在快照时间窗内超过了阈值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阈值的情况下,这时候就会将断路器打开。

一段时间后(默认是5s),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败继续开启,继续重复。

断路器开启以后,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。