配置断路器策略
ROMA Connect支持通过插件策略的方式,为API提供灵活的扩展能力。断路器是ROMA Connect在后端服务出现性能问题时保护系统的内置机制。当API的后端服务出现连续N次超时或者时延较高的情况下,会触发断路器的降级机制,向API调用方返回固定错误或者将请求转发到指定的降级后端。当后端服务恢复正常后,断路器关闭,请求恢复正常。
插件策略和API本身相互独立,只有为API绑定插件策略后,插件策略才对API生效。为API绑定插件策略时需指定发布环境,插件策略只对指定环境上的API生效。
约束与限制
同一个API在同一个环境中只能绑定一个相同类型的插件策略,已被API绑定的插件策略无法删除。
创建断路器策略
- 登录ROMA Connect控制台,在“实例”页面单击实例上的“查看控制台”,进入实例控制台。
- 在左侧的导航栏选择“服务集成 APIC > API策略”,在“策略管理”页签下单击“创建策略”。
- 在选择策略类型弹窗中选择“插件策略 > 断路器”。
- 在配置策略弹窗中配置插件策略信息。
表1 策略配置 参数
说明
策略名称
填写策略的名称,根据规划自定义。建议您按照一定的命名规则填写策略名称,方便您快速识别和查找。
策略类型
固定为“断路器”。
可见范围
选择策略的可见范围。
- 集成应用:策略归属某个集成应用,仅拥有该集成应用权限的用户可查看和使用该策略。
- 全局:当前实例的所有用户都可查看和使用该策略。
集成应用
仅当“可见范围”选择“集成应用”时需要配置。
选择策略所属的集成应用。若没有可用的集成应用,可单击右侧的“新建集成应用”,创建一个集成应用。
描述
填写策略的描述信息。
策略内容:支持表单模式和脚本模式两种方式,脚本模式配置请参见脚本配置示例。
策略生效范围
选择策略的生效范围。
- 单个API生效:绑定到当前策略的API各自计算断路器触发次数。
- API共享生效:绑定到当前策略的所有API共同计算断路器触发次数。
触发条件配置
断路器类型
选择断路器的触发类型。
- 超时降级:断路器以后端服务超时作为触发条件。
- 匹配条件降级:断路器以“匹配条件”中的设置作为触发条件。
条件模式
选择断路器的触发模式。
- 计数器:在时间窗内满足触发条件的请求次数达到设定阈值,则立即触发断路器。
- 百分比:在时间窗内满足触发条件的请求率达到设定阈值,时间窗结束后触发断路器。
匹配条件
仅当“断路器类型”选择“匹配条件降级”时需配置。
配置断路器的触发条件。
- 响应错误码:后端响应状态码符合设定值,则该后端请求满足触发条件。
- 触发降级响应时延:后端响应时延超过设定值,则该后端请求满足触发条件。
时间窗 (秒)
断路器的触发次数统计时间窗,与“阈值”或“最小百分比”参数配合使用,当时间窗内的触发次数达到设定阈值或百分比,则触发断路器。
阈值
仅当“条件模式”选择“计数器”时需配置。
断路器的触发阈值,与“时间窗 (秒)”参数配合使用。当时间窗内满足触发条件的后端请求次数达到阈值,则触发断路器。
说明:断路器插件是按单个网关组件分开触发,若ROMA Connect存在多个网关组件,则各个网关组件的触发统计分开计数。
若某个网关组件在时间窗内的触发次数超过阈值,则发送到该网关组件上的请求会触发断路器,其他未超过阈值的网关组件依然正常转发请求。
您可以在ROMA Connect实例控制台的“实例信息”页面,在“连接地址”下查看网关组件的IP个数,一个IP表示为一个网关组件。
最小调用次数
仅当“条件模式”选择“百分比”时需配置。
时间窗内触发断路器的API最小调用次数。如果时间窗内API的总调用次数小于该值,则不触发断路器。
最小百分比 (%)
仅当“条件模式”选择“百分比”时需配置。
断路器的触发阈值,与“时间窗 (秒)”参数配合使用。当时间窗内满足触发条件的后端请求百分比达到阈值,则触发断路器。
开启时长 (秒)
断路器开启的持续时间,断路器开启时间达到该值后将关闭。
后端降级策略
后端降级策略开关。
- 开启:触发降级的API将把请求转发到指定后端服务。
- 关闭:触发降级的API不会把请求转发到任何后端服务,直接返回服务不可用的错误信息。
后端策略类型
仅当“后端降级策略”开启时需配置。
断路器开启后,后端请求的转发策略类型。
说明:建议不要设置敏感信息,以防泄露。
- Mock:把配置的响应结果作为后端服务响应固定返回。
- Mock自定义返回码:后端服务响应的状态码。
- Mock返回结果:后端服务响应的Body信息,JSON格式。
- 响应头参数:后端服务响应的Header参数。
- HTTP&HTTPS:把后端服务请求转发给指定后端服务。
- 负载通道:是否使用负载通道访问后端服务。若选择“使用”,您需要提前创建负载通道。
- 后端URL:配置要转发的后端服务请求地址。
- 后端超时(ms):后端服务请求的超时时间,默认为5000ms。
- FunctionGraph:把后端服务请求转发给指定函数。
- Passthrough:把后端服务请求转发给API的原后端服务。
降级参数配置
降级参数配置开关。开启后可为断路器自定义规则,API请求优先匹配自定义规则中的触发条件和降级策略,仅当未匹配到自定义规则时才执行上方配置的默认触发条件和降级策略。
- 若匹配到自定义规则,则执行规则内配置的触发条件和降级策略。若匹配到的自定义规则内未配置触发条件或降级策略,则执行上方配置的默认触发条件或降级策略。
- 若未匹配到自定义规则,则执行上方配置的默认触发条件和降级策略。
定义参数
定义用于规则匹配的参数。单击“添加参数”,添加用于规则匹配的参数。
说明:建议不要设置敏感信息,以防泄露。
- 参数位置:参数在API请求中的位置。
- path:API请求的URI,已默认配置。
- method:API请求方法,已默认配置。
- header:API请求Header参数的第一个值。
- query:API请求Query参数的第一个值。
- system:系统参数。
- 参数:用作规则匹配的参数名。
定义规则
自定义断路器的匹配规则。单击“添加规则”,可添加规则,系统根据从上到下的顺序匹配规则。
- 定义规则:单击“”编辑匹配条件表达式。若表达式数量大于等于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 } }] }