配置API的断路器
断路器是API网关在后端服务出现性能问题时保护系统的内置机制。当API的后端服务出现连续N次超时或者时延较高的情况下,会触发断路器的降级机制,向API调用方返回固定错误或者将请求转发到指定的降级后端。当后端服务恢复正常后,断路器关闭,请求恢复正常。
约束与限制
- 同一个环境中,一个API只能被一个断路器策略绑定,但一个断路器策略可以绑定多个API。
- 策略和API本身相互独立,只有为API绑定策略后,策略才对API生效。为API绑定策略时需指定发布环境,策略只对指定环境上的API生效。
- 策略的绑定、解绑、更新会实时生效,不需要重新发布API。
- API的下线操作不影响策略的绑定关系,再次发布后仍然会带有下线前绑定的策略。
- 如果策略与API有绑定关系,则策略无法执行删除操作。
创建断路器策略
- 进入API网关控制台页面。
- 根据实际业务在左侧导航栏上方选择实例。
- 在左侧导航栏选择“API管理 > API策略”。
- 在“策略管理”页面,单击“创建策略”。
- 在“选择策略类型”弹窗中,选择“插件策略 > 断路器”。
- 在“创建策略”弹窗中,根据下表参数说明,配置策略信息。
    
    表1 断路器参数说明 参数 说明 策略名称 填写策略的名称,根据业务规划自定义。建议您按照一定的命名规则填写策略名称,方便您快速识别和查找。 支持中文、英文、数字、下划线,且只能以英文或中文开头,长度为3~255个字符。 策略类型 固定为“断路器”。 描述 填写策略的描述信息。长度为1~255个字符。 策略内容 策略的配置内容,支持表单配置和脚本配置两种方式。 策略生效范围 断路器类型 选择断路器的触发类型。 - 超时降级:断路器以后端服务超时作为触发条件。
- 匹配条件降级:断路器以“匹配条件”中的设置作为触发条件。
 条件模式 选择断路器的触发模式。 - 计数器:在时间窗内满足触发条件的请求次数达到设定阈值,则立即触发断路器。
- 百分比:在时间窗内满足触发条件的请求率达到设定阈值,时间窗结束后触发断路器。
 匹配条件 仅当“断路器类型”选择“匹配条件降级”时需配置。 配置断路器的触发条件。 - 响应错误码:后端响应状态码符合设定值,则该后端请求满足触发条件。
- 触发降级响应时延:后端响应时延超过设定值,则该后端请求满足触发条件。
 时间窗(秒) 断路器的触发次数统计时间窗,与“阈值”或“最小百分比”参数配合使用,当时间窗内的触发次数达到设定阈值或百分比,则触发断路器。 阈值(次) 仅当“条件模式”选择“计数器”时需配置。 断路器的触发阈值,与“时间窗”参数配合使用。在时间窗内,满足触发条件的后端请求次数达到阈值,则触发断路器。 如果某个网关组件在时间窗内的触发次数超过阈值,则发送到该网关组件上的请求会触发断路器,其他未超过阈值的网关组件依然正常转发请求。 说明:断路器策略是按单个网关组件分开触发,如果API网关存在多个网关组件,则各个网关组件的触发统计分开计数。 您可以在API网关实例控制台的“实例信息”页面,在“出私网IP”下查看网关组件的IP个数,一个IP表示为一个网关组件。 最小调用次数 仅当“条件模式”选择“百分比”时需配置。 时间窗内触发断路器的API最小调用次数。如果时间窗内API的总调用次数小于该值,则不触发断路器。 最小百分比(%) 仅当“条件模式”选择“百分比”时需配置。 断路器的触发阈值,与“时间窗”参数配合使用。当时间窗内的满足触发条件的后端请求百分比达到阈值,则触发断路器。 开启时长(秒) 断路器开启的持续时间,断路器开启时间达到该值后将关闭。 后端降级策略 后端降级策略开关。 - 开启:触发降级的API将把请求转发到指定后端服务。
- 关闭:触发降级的API不会把请求转发到任何后端服务,直接返回服务不可用的错误信息,返回的HTTP状态码为“503”。
 后端策略类型 仅当“后端降级策略”开启时需配置。 断路器开启后,后端请求的转发策略类型。建议不要设置敏感信息,以防泄露。 - Mock:把配置的响应结果作为后端服务响应固定返回。
           - Mock自定义返回码:后端服务响应的状态码。
- Mock返回结果:后端服务响应的Body信息,JSON格式。
- 响应头参数:后端服务响应的Header参数。
 
- HTTP&HTTPS:把后端服务请求转发给指定HTTP&HTTPS后端服务。
           - 负载通道:是否使用负载通道访问后端服务。如果选择“使用”,您需要提前创建负载通道。
- 后端URL:配置要转发的后端服务请求地址。
- 后端超时(ms):后端服务请求的超时时间,默认为5000ms。
 
- FunctionGraph:把后端服务请求转发给指定函数。
- Passthrough:把后端服务请求转发给API的原后端服务。
 降级参数配置 降级参数配置开关。开启后可为断路器自定义规则,API请求优先匹配自定义规则中的触发条件和降级策略,仅当未匹配到自定义规则时才执行上方配置的默认触发条件和降级策略。 - 如果匹配到自定义规则,则执行规则内配置的触发条件和降级策略。如果匹配到的自定义规则内未配置触发条件或降级策略,则执行上方配置的默认触发条件或降级策略。
- 如果未匹配到自定义规则,则执行上方配置的默认触发条件和降级策略。
 定义参数 定义用于规则匹配的参数。建议不要设置敏感信息,以防泄露。 - 参数位置:参数在API请求中的位置。
- 参数:用于做规则匹配的参数名。
 系统默认包含reqPath(请求路径)和method(请求方法)参数。单击“添加参数”,可添加其他匹配参数。 定义规则 自定义断路器的匹配规则。单击“添加规则”,可添加规则,系统根据从上到下的顺序匹配规则,可通过上下移动调整规则优先级。 - 匹配条件:单击“ ”编辑匹配条件表达式。如果表达式数量大于等于3个,可通过“转子层级”对表达式进行分层设置。 ”编辑匹配条件表达式。如果表达式数量大于等于3个,可通过“转子层级”对表达式进行分层设置。- =为等于
- !=为不等于
- pattern为正则表达式
- enum为枚举值,多个参数值之间用英文逗号分隔
 
- 触发条件和后端降级策略配置可参考上方的默认触发条件和降级策略配置。
 例如,开启“降级参数配置”,按顺序添加“rule01”和“rule02”规则,“rule01”关闭“触发条件配置”并且开启“后端降级策略”,“rule02”两者都开启。断路器优先判断“rule01”匹配条件,如果匹配则会按照上方配置的默认触发条件开启断路器(rule01内未配置触发条件),并执行rule01内的后端降级策略。如果不匹配则会继续判断“rule02”,以此类推。 
- 单击“确定”。
    
    如果您需要复制已创建的策略,请在已创建策略的“操作”列中单击“克隆”配置参数即可。克隆策略的名称不能与已创建的策略名称重复。 
- 策略创建后,您还需要为策略绑定API,才能使策略对API生效。
脚本配置示例
{
  "breaker_condition":{
    "breaker_type":"timeout",
    "breaker_mode":"counter",
    "unhealthy_threshold":30,
    "time_window":15,
    "open_breaker_time":15,
    "unhealthy_percentage":51,
    "min_call_threshold":20
  },
  "scope":"share",
  "downgrade_default":{
    "type":"http",
    "passthrough_infos":null,
    "func_info":null,
    "mock_info":null,
    "http_info":{
      "isVpc":false,
      "vpc_channel_id":"",
      "address":"10.10.10.10",
      "scheme":"HTTP",
      "method":"GET",
      "path":"/demo",
      "timeout":5000
    },
    "http_vpc_info":null
  },
  "downgrade_parameters":[
  {
    "name":"reqPath",
    "type":"path",
    "value":"path",
    "disabled":true,
    "focused":true,
    "id":"92002eqbpilg6g"
  },
  {
    "name":"method",
    "type":"method",
    "value":"method",
    "disabled":true,
    "focused":true,
    "id":"tuvxetsdqvcos8"
  }],
  "downgrade_rules":[
  {
    "rule_name":"rule-test1",
    "parameters":[
      "reqPath",
      "method"
    ],
    "match_regex":"[\"reqPath\",\"==\",\"/test\"]",
    "downgrade_backend":{
      "type":"mock",
      "passthrough_infos":null,
      "func_info":null,
      "mock_info":{
        "status_code":200,
        "result_content":"{status: ok}",
        "headers":[]
      },
      "http_info":null,
      "http_vpc_info":null
    },
    "breaker_condition":{
      "breaker_type":"timeout",
      "breaker_mode":"percentage",
      "unhealthy_threshold":30,
      "time_window":15,
      "open_breaker_time":15,
      "unhealthy_percentage":51,
      "min_call_threshold":20
    }
  }]
}
  
   
    