美文网首页
spring cloud 降级和熔断的区别与说明

spring cloud 降级和熔断的区别与说明

作者: virtual灬zzZ | 来源:发表于2021-10-30 00:07 被阅读0次

    服务熔断

    服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

    服务降级

    服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。

    熔断VS降级

    相同点:

    目标一致 都是从可用性和可靠性出发,为了防止系统崩溃;

    用户体验类似 最终都让用户体验到的是某些功能暂时不可用;

    不同点:

    触发原因不同 服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;

    以上是比较普遍的说法。

    编码注意点

    hystrix日常使用一般都是集成feign使用,我们需要在配置文件中打开hystrix,默认是关闭

    feign:
      hystrix:
        enabled: true
    

    使用circuitBreaker,加上注解 @EnableHystrix 或者 @EnableCircuitBreaker ,前者实际包含了后者了。

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @EnableCircuitBreaker
    public @interface EnableHystrix {
    }
    

    理解总结

    降级,使用hystrix注解,其实hystrix组件里头已经包含了CircuitBreaker熔断器。

    降级 是调用了服务方的, 而 熔断 是 不再调用任何东西,直接给返回结果。

    展开熔断说明:

    该图是熔断的三种状态:关闭、半开、全开。

    • Closed:熔断器关闭状态,调用失败次数积累,到了阈值(或一定比例)则启动熔断机制;

    • Open:熔断器打开状态,此时对下游的调用都内部直接返回错误,不走网络,但设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态;

    • Half-Open:半熔断状态,允许定量的服务请求,如果调用都成功(或一定比例)则认为恢复了,关闭熔断器,否则认为还没好,又回到熔断器打开状态;

    断路器的三个重要参数:快照时间窗、请求总数下限、错误百分比下限。这个参数的作用分别是:
    • 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。

    • 请求总数下限:在快照时间窗内,必须满足请求总数下限才有资格根据熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用此时不足20次,即时所有的请求都超时或其他原因失败,断路器都不会打开。

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

    那么当断路器打开之后会发生什么呢?我们先来说说断路器未打开之前,对于之前那个示例的情况就是每个请求都会在当hystrix超时之后返回fallback,每个请求时间延迟就是近似hystrix的超时时间,如果设置为5秒,那么每个请求就都要延迟5秒才会返回。当熔断器在10秒内发现请求总数超过20,并且错误百分比超过50%,这个时候熔断器打开。打开之后,再有请求调用的时候,将不会调用主逻辑,而是直接调用降级逻辑,这个时候就不会等待5秒之后才返回fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。

    在断路器打开之后,处理逻辑并没有结束,我们的降级逻辑已经被成了主逻辑,那么原来的主逻辑要如何恢复呢?对于这一问题,hystrix也为我们实现了自动恢复功能。当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。

    Circuit Breaker参数(可以在application文件配置)

    由于Hystrix是一个容错框架,因此我们在使用的时候,要达到熔断的目的只需配置一些参数就可以了。但我们要达到真正的效果,就必须要了解这些参数。Circuit Breaker一共包括如下6个参数。

    1. circuitBreaker.enabled
      是否启用熔断器,默认是TURE。
    2. circuitBreaker.forceOpen
      熔断器强制打开,始终保持打开状态。默认值FLASE。
    3. circuitBreaker.forceClosed
      熔断器强制关闭,始终保持关闭状态。默认值FLASE。
    4. circuitBreaker.errorThresholdPercentage
      设定错误百分比,默认值50%,例如一段时间(10s)内有100个请求,其中有55个超时或者异常返回了,那么这段时间内的错误百分比是55%,大于了默认值50%,这种情况下触发熔断器-打开。
    5. circuitBreaker.requestVolumeThreshold
      默认值20.意思是至少有20个请求才进行errorThresholdPercentage错误百分比计算。比如一段时间(10s)内有19个请求全部失败了。错误百分比是100%,但熔断器不会打开,因为requestVolumeThreshold的值是20. 这个参数非常重要,熔断器是否打开首先要满足这个条件,
    6. circuitBreaker.sleepWindowInMilliseconds
      半开试探休眠时间,默认值5000ms。当熔断器开启一段时间之后比如5000ms,会尝试放过去一部分流量进行试探,确定依赖服务是否恢复。

    以上的10s 即 metrics.rollingStats.timeInMilliseconds 的 设置值(默认是10s)

    #参考官方配置 https://docs.spring.io/spring-cloud-openfeign/docs/2.2.5.RELEASE/reference/html/
    feign:
      client:
        config:
          default:
            connectTimeout: 1000
            readTimeout: 5000
      hystrix:
        enabled: true
    
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 10000 # 设置hystrix的超时时间为6000ms
          circuitBreaker:
            #在当10秒的时间内,最近20次调用请求,请求错误率超过50%,则触发熔断5秒,期间快速失败,以下都是默认值
            requestVolumeThreshold: 20
            errorThresholdPercentage: 50
            sleepWindowInMilliseconds: 5000
          #设置统计的时间窗口值的毫秒值,circuit break 的打开会根据1个rolling window的统计来计算。
          #若rolling window被设为10000毫秒,则rolling window会被分成n个buckets,
          #每个bucket包含success,failure,timeout,rejection的次数的统计信息。默认10000。
          metrics:
              rollingStats:
                timeInMilliseconds: 10000
    
    

    注意:关于hystrix在application.properties配置是没提示的,但是HystrixCommandProperties是会获取的。hystrix的参数写法 可以按照参考处链接 按层级关系写。

    参考:

    hystrix和circuitBreaker的资料

    Hystrix 参数详解

    hystrix官方wiki

    相关文章

      网友评论

          本文标题:spring cloud 降级和熔断的区别与说明

          本文链接:https://www.haomeiwen.com/subject/dsiialtx.html