一、场景说明
限流的原理是监控服务流量的 QPS 指标,当达到指定的阈值时进行流量控制,避免被瞬时高峰流量冲垮,从而确保服务的高可用。限流模式有两种:
·单机限流:通过统计单机 QPS 指标,当达到规则指定阈值时对流量进行限制,保障服务实例不被瞬时流量给冲垮。
·分布式限流:通过统计全局 QPS 指标,当达到规则指定阈值时对流量进行限制,保障服务实例不被瞬时流量给冲垮。
二、操作步骤
1. 登录 TSF 控制台。
2. 在左侧导航栏,选择 Polaris(北极星),在实例详情页选择目标引擎实例。
3. 单击左侧导航栏 访问限流,进入熔断规则展示页面,单击新建限流规则,在弹窗中配置好限流规则后,单击提交。
单机限流分布式限流
| 参数 | 是否必填 | 说明 |
| 接口路径 | 否 | 指定限流规则的接口过滤参数,接口名可对应方法名、HTTP、URL 等信息,不填写代表不过滤。接口名称:规则生效所对应的接口名,用于匹配客户端传入的 method 参数,默认为空(全部)。匹配方式:接口字段的匹配方式,支持全匹配、不等于、包含、不包含、正则表达式五种匹配模式。 |
| 请求匹配规则 | 否 | 指定限流规则的请求参数匹配条件,不填代表不过滤,支持以下四种参数类型:自定义参数:自定义 KEY 和 VALUE,具体的请求参数值可通过 SDK 进行传入。请求头(HEADER):针对协议消息头(http header/grpc header)进行过滤。请求参数(QUERY):针对协议请求参数(http query)进行过滤。方法(METHOD):针对协议的 METHOD(http method/grpc method)进行过滤。主调服务:针对微服务调用场景下,主调方的服务名进行过滤。主调 IP:针对主调方机器的 IP 地址进行过滤。主调实例元数据:通过主调实例标签进行过滤。每种类型参数值支持以下几种值匹配模式:全匹配:全值匹配,传入的值与配置的值相同才匹配通过。正则表达式:用户配置正则表达式,通过正则表达式对传入的值进行匹配,正则表达式支持 Google RE2 标准。不等于:取反匹配,传入的值与所配置的值不相等才算匹配成功。包含:多字符串取 OR 匹配,传入的值只要匹配到其中一个字符串,就算匹配成功。字符串之间使用逗号进行分割。值格式为value1,value2,value3,匹配到其中一个就算成功。不包含:多字符串取反匹配,传入的值必须都没有出现在所配置的字符串列表中,才算匹配通过。值格式为 value1,value2,value3,全部不等于才算成功。 |
| 限流指标 | 是 | 1. 限流指标:请求数指定统计周期内的统计阈值,达到阈值则进行限流。可以配置多个限流阈值,多个限流阈值可同时生效,任意触发了一个即可限流。统计窗口时长:限流阈值的统计时长,单位秒,默认为1秒。请求数阈值:达到限流条件的请求数阈值。默认为1。2. 限流指标:并发数(仅支持单机模式)指定并发数阈值,达到阈值则进行限流。 |
| 合并计算阈值 | 否 | 当限流指标为请求数时,如果目标请求匹配到多个接口及参数,则将匹配到的所有请求汇合,合并计算阈值。 |
| 限流效果 | 是 | 快速失败:直接拒绝。匀速排队:根据设置的最大排队时长依次通过。 |
| 失败处理策略 | 否 | 仅分布式限流需要选择。退化至单击限流;当出现通信失败或者 Token Server 不可用时,限流方案退化到单机限流的模式。直接通过:当出现通信失败或者Token Server不可用时,不做额外处理,直接通过。 |
| 失败后返回 Http 脚本 | 否 | 填写普通文本或 JSON 格式的 http 返回值。 |
| 参数 | 是否必填 | 说明 |
| 接口名称 | 否 | 指定限流规则的接口过滤参数,接口名可对应方法名、HTTP U等信息,不填写代表不过滤。接口:规则生效所对应的接口名,用于匹配客户端传入的 method 参数,默认为空(全部)。匹配方式:接口字段的匹配方式,支持全匹配、不等于、包含、不包含、正则表达式五种匹配模式。 |
| 请求匹配规则 | 否 | 指定限流规则的请求参数匹配条件,不填代表不过滤,支持以下四种参数类型:自定义参数:自定义KEY和VALUE,具体的请求参数值可通过SDK进行传入。请求头(HEADER):针对协议消息头(http header/grpc header)进行过滤。请求参数(QUERY):针对协议请求参数(http query)进行过滤。方法(METHOD):针对协议的METHOD(http method/grpc method)进行过滤。主调服务:针对微服务调用场景下,主调方的服务名进行过滤。主调 IP:针对主调方机器的IP地址进行过滤。每种类型参数值支持以下几种值匹配模式:全匹配:全值匹配,传入的值与配置的值相同才匹配通过。正则表达式:用户配置正则表达式,通过正则表达式对传入的值进行匹配,正则表达式支持Google RE2标准。不等于:取反匹配,传入的值与所配置的值不相等才算匹配成功。包含:多字符串取OR匹配,传入的值只要匹配到其中一个字符串,就算匹配成功。字符串之间使用逗号进行分割。值格式为’value1,value2,value3‘,匹配到其中一个就算成功。不包含:多字符串取反匹配,传入的值必须都没有出现在所配置的字符串列表中,才算匹配通过。值格式为‘value1,value2,value3’,全部不等于才算成功。 |
| 限流阈值 | 是 | 指定统计周期内的统计阈值,达到阈值则进行限流。可以配置多个限流阈值,多个限流阈值可同时生效,任意触发了一个即可限流。统计窗口时长:限流阈值的统计时长,单位秒,默认为1秒。请求数阈值:达到限流条件的请求数阈值。默认为1。 |
| 合并计算阈值 | 否 | 如果目标请求匹配到多个接口及参数,则将匹配到的所有请求汇合,合并计算阈值,具体规则查看 |
| 失败处理策略 | 是 | 分布式限流需要依赖token server,如果出现token server不可访问,则客户端可以根据配置的规则进行降级,保证用户请求最大限度不受影响。退化成单机限流:默认策略,直接退化成单机计算配额的方式进行限流,单机配额=(全局配额/节点数)。直接通过:不执行限流,所有请求都直接放通。 |
| 是否启用 | 否 | 启用后,限流规则将立即生效。 |
三、针对服务进行限流
在 RateLimitServiceJava 服务下新建限流规则,指定 QPS 为10,限流效果选择直接拒绝。
四、针对接口 + 标签进行细粒度限流
在 RateLimitServiceJava 服务下新建限流规则,指定 QPS 为10,方法名为/echo,针对 HTTP 请求中的 HEADER user=foo 进行限流,限流效果选择直接拒绝。
五、针对接口 + 标签进行热点参数限流
热点参数限流规则配置需要满足2个条件,否则无法生效:
·存在非全匹配规则:“接口名称”、“请求匹配规则”配置中至少存在一条规则是非全匹配规则,例如“不等于”;如果全是全匹配规则,那该限流只是普通限流。
·不启用“合并计算阈值”。
热点参数限流是一种针对高并发请求中某些热点参数的限流策略;如上述规则的限流效果图如下:
在 RateLimitServiceJava 服务下新建限流规则,指定 QPS 为10,方法名为/echo,针对 HTTP 请求中的 header user 的每一个参数值进行单独限流,限流效果选择直接拒绝。
六、使用匀速排队
在 RateLimitServiceJava 服务下新建限流规则,指定 QPS 为10,限流效果选择匀速排队。