全部产品
云市场

断路器插件

更新时间:2020-03-02 14:56:29

1. 断路器概述

断路器是API网关在后端出现性能问题时保护系统的内置机制,默认配置下,当某个API的后端在30秒钟内出现1000次超时,系统会触发断路器保护,断路器进入 打开状态,断路时间为90秒,90秒内所有的请求均快速返回Status=503,X-Ca-Error-Code=D503CB错误码,90秒后断路器进入半开状态,允许少量并发请求通过,如果后端恢复正常,则断路器置为关闭状态,请求恢复正常。

当您使用专享实例时,可以通过断路器插件来定制断路器配置,可定制的配置如下

  • 断路器触发条件,可配置超时模式或者错误码模式
  • 配置超时窗口
  • 配置断路器打开状态的超时时间
  • 配置断路器打开后的降级后端

2. 配置规则

断路器插件配置仅在API运行在专享实例时生效,如果您使用的是共享实例,则即使API绑定了断路器插件,也只会使用默认断路器配置

2.1. 按后端超时配置降级策略

可以使用按照后端超时的方式配置降级策略

  1. timeoutThreshold: 15 # 超时的阈值
  2. windowInSeconds: 30 # 超时时间窗口
  3. openTimeoutSeconds: 15 # 断路器开的时间
  4. downgradeBackend: # 降级后的后端配置
  5. type: mock
  6. statusCode: 418

配置字段说明:

  • timeoutThreshold: 超时阈值, 上限为5000,注意如果配置过低,可能导致几次超时就触发断路器
  • windowsInSeconds: 判断时间窗口,合法值为10~90秒,
  • openTimeoutSeconds: 断路器开的持续时间,合法值为15~300秒
  • downgradeBackend: (可选) 当断路器出现降级时,降级后端

2.2. 按后端报错配置降级策略

可以使用按照后端错误码的方式配置降级策略

  1. errorCondition: "$StatusCode == 503" # 错误条件
  2. errorThreshold: 1000 # 错误阈值
  3. windowInSeconds: 30 # 超时窗口时间
  4. openTimeoutSeconds: 15 # 断路器开的时间
  5. downgradeBackend: # 降级后端
  6. type: "HTTP"
  7. address: "http://api.foo.com"
  8. path: "/system-busy.json"
  9. method: GET
  • errorCondition: 错误条件表达式, $StatusCode$LatencySeconds两个变量可以用于对后端的应答码以及耗时(秒)进行判断
    • 如: $StatusCode = 503 or $StatusCode = 504,当后端应答为503或504
    • 如: $LatancySeconds > 30,当超时大于30秒时
  • errorThreshold: 错误出现的阈值
  • windowsInSeconds: 判断时间窗口,合法值为10~90秒,
  • openTimeoutSeconds: 断路器开的持续时间,合法值为15~300秒
  • downgradeBackend: (可选) 当断路器出现降级时,降级后端

3. 降级后端配置

当断路器打开时,可以通过配置downgradeBackend来配置断路器打开后的返回,返回的结构与API网关的Swagger结构一致,详细请参考文档通过导入Swagger创建API,目前支持的后端类型及配置样例如下:

  • HTTP后端
  1. ---
  2. backend:
  3. type: HTTP
  4. address: "http://10.10.100.2:8000"
  5. path: "/users/{userId}"
  6. method: GET
  7. timeout: 7000
  • HTTP后端(VPC)
  1. ---
  2. backend:
  3. type: HTTP-VPC
  4. vpcAccessName: vpcAccess1
  5. path: "/users/{userId}"
  6. method: GET
  7. timeout: 10000
  • 函数计算
  1. ---
  2. backend:
  3. type: FC
  4. fcRegion: cn-shanghai
  5. serviceName: fcService
  6. functionName: fcFunction
  7. arn: "acs:ram::111111111:role/aliyunapigatewayaccessingfcrole"
  • MOCK
  1. ---
  2. backend:
  3. type: MOCK
  4. mockResult: "mock resul sample"
  5. mockStatusCode: 200
  6. mockHeaders:
  7. - name: Content-Type
  8. value: text-plain
  9. - name: Content-Language
  10. value: zhCN

4. 相关错误码

错误代码 Http状态码 Message 描述
D503BB 503 Backend circuit breaker busy API被断路器阻止
D503CB 503 Backend circuit breaker open, ${Reason} API处于熔断/断路器开状态, 请检查后端性能后稍后再试

5. 使用限制

  • 仅专享实例生效
  • 单个表达式的字符数不超过512个字符
  • 插件配置大小限制为16380字符的文本