
# 熔断
熔断规则借鉴了Resilience4j的思想，作用在服务端，其原理为：
达到指定failureRateThreshold错误率或者slowCallRateThreshold慢请求率时进行熔断，返回响应码429，慢请求通过SlowCallDurationThreshold定义。minimumNumberOfCalls是达到熔断要求的最低请求数量门槛，例如，若minimumNumberOfCalls是10，为计算失败率，则最少要记录10个调用。若只记录了9个调用，即使9个都失败，CircuitBreaker也不会打开。slidingWindowType指定滑动窗口类型，默认可选count/time， 分别是基于请求数量窗口和基于时间窗口。若滑动窗口为count，则最近slidingWindowSize次的调用会被记录和统计。若滑动窗口为time，则最近slidingWindowSize秒中的调用会被记录和统计。slidingWindowSize指定窗口大小，根据滑动窗口类型，单位可能是请求数量或者秒。
- Java Chassis的熔断作用于微服务消费者，需要微服务应用集成熔断模块，启用bizkeeper-consumer处理链。
  配置示例如下：
  ```
  servicecomb:
    handler:
      chain:
        Consumer:
          default: bizkeeper-consumer
  ```
  在POM中添加如下依赖：
  ```
  <dependency>
    <groupId>org.apache.servicecomb</groupId>
    <artifactId>handler-bizkeeper</artifactId>
    <version>${project.version}</version>
  </dependency>
  ```
  详细说明请参考[流量特征治理](https://servicecomb.apache.org/references/java-chassis/2.x/zh_CN/references-handlers/governance.html)。
  ![](https://support.huaweicloud.com/devg-cse/public_sys-resources/note_3.0-zh-cn.png)
  此处以微服务开发框架Java Chassis 2.x版本为例介绍。3.x版本配置详情请参考[流量特征治理](https://servicecomb.apache.org/references/java-chassis/zh_CN/references-handlers/rule-governance.html)。
  
- Spring Cloud Huawei通过Aspect拦截RequestMappingHandlerAdapter实现了熔断，集成Spring Cloud Huawei以后，默认集成了客户端熔断模块spring-cloud-starter-huawei-governance， 只需要通过配置开启具体的客户端熔断策略。 配置示例如下：
  ```
  servicecomb:
    matchGroup:
      AllOperation: |
        matches:
          - apiPath:
              prefix: "/"
    instanceIsolation:     
      AllOperation: |      
        minimumNumberOfCalls: 10      
        slidingWindowSize: 10      
        slidingWindowType: COUNT_BASED      
        failureRateThreshold: 20
        recordFailureStatus:
          - 502
          - 503
  ```
  默认策略是在异常错误码为502、503情况下生效，1.11.4-2021.0.x/1.11.4-2022.0.x版本开始支持响应头header的特殊场景生效。
  响应头header设置key默认为"X-HTTP-STATUS-CODE"，也支持自定义设置，只需要在客户端配置如下配置：
  ```
  spring:
    cloud:
      servicecomb:
        governance:
          response:
            header:
              status:
                key: 'X-HTTP-ERROR-STATUS-CODE'
  ```
  同样响应头header中设置的响应码也支持自定义，但是需要在容错策略中增加对应的错误码，例如设置X-HTTP-STATUS-CODE=511，那么错误码中增加511错误码，配置如下：
  ```
  servicecomb:
    matchGroup:
      AllOperation: |
        matches:
          - apiPath:
              prefix: "/"
    instanceIsolation:     
      AllOperation: |      
        minimumNumberOfCalls: 10      
        slidingWindowSize: 10      
        slidingWindowType: COUNT_BASED      
        failureRateThreshold: 20
        recordFailureStatus:
          - 502
          - 503
          - 511
  ```
  上述配置对所有实例启用了客户端熔断策略。 该策略采用COUNT_BASED滑动窗口策略，窗口大小为10个请求，到达10个请求的时候，开始计算错误率，如果错误率达到20%，就会对后续请求进行熔断。默认的滑动窗口策略是TIME_BASED。策略执行顺序为优先判断响应码，如果异常响应码满足策略设置，容错开启；响应码不满足后，再判断header设置的响应编码是否满足条件。
  
 
