Skip to content

circuit breaker provider

chengyouling edited this page Jan 21, 2025 · 3 revisions

服务端熔断

服务端熔断主要目的是为了保证服务的高可用,避免因为一个服务不可用导致整个系统的崩溃,从而引发雪崩。

Spring Cloud Huawei的服务端熔断可以用下图表示:

            请求
consumer ------REST----X---> provider
               <-------X---
         ------REST----X---> provider
               <-------X---
         ---------熔断开关打开----------
         ------REST----Y---> provider
               <-----熔断返回---
         ------REST----Y---> provider
               <-----熔断返回---

服务端熔断支持API粒度设置,某个接口第三方交互较多且时常有超时异常时,我们可以针对特定的API设置熔断策略;当某个服务配置较低时,我们也可以针对服务设置全路径熔断。

配置服务端熔断策略

servicecomb:
  matchGroup:
    AllOperation: |
      matches:
        - apiPath:
            prefix: "/"
  circuitBreaker:
    AllOperation: |
      minimumNumberOfCalls: 10
      slidingWindowSize: 10
      slidingWindowType: COUNT_BASED
      failureRateThreshold: 20

上述配置对所有客户端启用了服务端熔断策略。 该策略采用COUNT_BASED滑动窗口策略,窗口大小为10个请求,到达 10个请求的时候,开始计算错误率,如果错误率达到20%,就会对后续请求进行熔断。默认的滑动窗口策略是 TIME_BASED。

可以针对不同的微服务设置差异化的熔断策略:

servicecomb:
  matchGroup:
    ConsumerAllOperation: |
      matches:
        - apiPath:
            prefix: "/"
          serviceName: consumer
  circuitBreaker:
    ConsumerAllOperation: |
      minimumNumberOfCalls: 10
      slidingWindowSize: 10
      slidingWindowType: COUNT_BASED
      failureRateThreshold: 20

上述配置的熔断策略应用于consumer调用provider的情况。其他客户端调用的时候,不会生效。

可以针对不同的API设置差异化的熔断策略:

servicecomb:
  matchGroup:
    ConsumerApiOperation: |
      matches:
        - apiPath:
            prefix: "/api"
  circuitBreaker:
    ConsumerApiOperation: |
      minimumNumberOfCalls: 10
      slidingWindowSize: 10
      slidingWindowType: COUNT_BASED
      failureRateThreshold: 20

上述配置的熔断策略应用于所有客户端调用服务端/api前缀接口情况。其他接口调用的时候,不会生效。

Spring Cloud Gateway

可以在 Spring Cloud Gateway 使用客户端熔断策略。

服务端熔断其他参数及其默认值

servicecomb:
  circuitBreaker:
    PrivderAllOperation: |
      # 最小统计请求数,当请求大于等于当前minimumNumberOfCalls时,统计滑动窗口中的失败率、慢请求率,默认值100
      minimumNumberOfCalls: 100
      # 如果slidingWindowType为TIME_BASED时,slidingWindowSize为对应的滑动时间,单位秒,默认值100
      slidingWindowSize: 100
      # 滑动窗口类型,COUNT_BASED请求数滑动窗,TIME_BASED时间滑动窗,默认为TIME_BASED
      slidingWindowType: TIME_BASED
      # 请求错误率阀值,当滑动窗口中错误率大于等于failureRateThreshold设置的值时,熔断打开,默认值50
      failureRateThreshold: 50
      # 慢请求率阀值,当滑动窗口中慢请求率大于等于slowCallRateThreshold设置的值时,熔断打开,默认值100
      slowCallRateThreshold: 100
      # 熔断时间,当熔断开关打开后,waitDurationInOpenState设置的时间内的请求直接错误返回,单位毫秒,默认值60000
      waitDurationInOpenState: 60000
      # 慢请求消耗时间阀值,当一个请求从接收到响应的时间大于此时间时,统计为慢请求,默认值60000
      slowCallDurationThreshold: 60000
      # 熔断统计错误码,只有请求响应码满足设定值时才会进行错误率统计,默认值502、503
      recordFailureStatus:
        - 502
        - 503
      # 熔断开关半开时,允许permittedNumberOfCallsInHalfOpenState个请求通过
      permittedNumberOfCallsInHalfOpenState: 10
      # 强制关闭策略开关,为true时,所有请求不执行熔断策略,默认值为false
      forceClosed: false
      # 强制开启策略开关,为true时,所有能匹配上matches的请求直接错误返回,默认值为false
      forceOpen: false

错误检查方式

可以配置 recordFailureStatus 来指定错误, 也可以通过自定义 AbstractInstanceIsolationExtension 覆盖默认的 SpringCloudInstanceIsolationExtension 来定制错误异常检查机制。 默认的错误类型主要包括 代表网络错误的异常,比如ConnectionException等。

注意事项

版本要求:1.11.4-2021.0.x/1.11.4-2022.0.x及以上版本。

集成Spring Cloud Huawei以后,默认集成了服务端熔断模块 spring-cloud-starter-huawei-governance, 只需要通过配置开启具体的服务端熔断策略。

服务端熔断是针对某个接口、某个指定服务的业务,即如果这个接口业务错误率超过限制,那么访问这个接口的请求将直接熔断返回,其他接口正常访问;如果是指定服务全局业务错误率超过限制,那么指定服务的所有请求熔断返回。

Clone this wiki locally