配置限流对象方法签名

服务限流可以对方法的参数进行过滤,以实现对某个特定的参数进行限流。

配置接口方法类型的限流对象

接口方法类型的限流对象的参数配置包括以下内容:7 | left

参数

说明

限流对象名

包括要限流的接口与方法名:

  • 接口:支持 RPC 服务接口或配置了 Spring AOP 拦截器的 Bean。

  • 方法:支持带参数或不带参数的方法签名。详情请参见 配置方法签名

例如上图中的配置表示限流对象为 com.alipay.antcloud.dsrconsole.core.service.guardian.facade.GuardianAppFacade.queryAppNames。方法的第一个参数中,instanceId 属性值为 000001 的请求。

ARGS 是服务限流内部定义的一个变量,表示方法的所有参数。ARGS[0] 表示第一个参数。

键值

限流参数及属性名称,用 MEVL 表达式 表示,获取用于比较的键值。

比较关系

等于或不等于。

比较值

用于比较的属性值。

配置方法签名

对于接口方法类的限流规则,如果需要指定限流的具体接口及方法,您必须完成方法签名的配置。在配置方法名时,您可以根据实际情况选择是否在方法签名中添加参数。

  • 方法不添加参数

    如果没有重载方法,或需要对所有重载方法限流,则不需要添加参数。例如限流对象接口中有以下几个同名方法:

    testBreakerScriptCondition(){}
    
    testBreakerScriptCondition(String name,Integer value){}
    
    testBreakerScriptCondition(int a,int[] al){}

    配置限流对象方法为 testBreakerScriptCondition,则对所有同名方法的总流量限流。

  • 方法添加参数

    接口中有多个同名方法时,如果需要对某个具体方法限流,可以添加入参。添加参数时需要注意以下几点:

    • 不要使用形参。

    • 入参类型使用完整的类名。

    • 参数的逗号前后不要有空格。

    • 支持基本类型和基本类型数组。

      例如方法 foo(int a, int[] al),因为 int[] 的类型是 [I,所以对应的方法配置为 foo(int,[I),其他基本类型的数组以此类推。

    下面是添加参数的方法示例:

    • testBreakerScriptCondition(java.lang.String,java.lang.Integer)

    • testBreakerScriptCondition(int,[I)

接口方法中的 MVEL 表达式

配置方式

  • 方式一:左侧键值计算结果是 true 或 false,右侧比较值中也填写 true 或 false。

    示例如下:9 | left

  • 方式二:左侧键值计算结果是个普通字符串,右侧比较值中也填写一个字符串。

    示例如下:8 | left

上述两种方式的效果一样,推荐用第一种方式。第一种方式支持更多的运算符,例如 &&、||、>、<= 等,表达能力更丰富。

配置样例

  • 使用 MVEL 表达式获取参数的属性值:

    您可以使用 obj.field 的格式获取参数的属性值,属性必须有 public 的 getter 方法,或本身是 public 的。若没有属性值,只有 public 的 getter 方法也可以。获取到的属性值可以和特定的值比较,例如 ARGS[0].field == 'loull'

  • 使用 MVEL 表达式的基础运算符:

    • !=,例如 ARGS[0].id != 100

    • ==,例如 ARGS[1].uid == 'test'

    • >=,例如 ARGS[0].number >= 200

    • >,例如 ARGS[0].number > 100

    • <=,例如 ARGS[0].number <= 101

    • <,例如 ARGS[0].number < 200

    • + - * /,例如 ARGS[0].num1 + ARGS[1].num2 > ARGS[2].num3

    • && ||,例如 ARGS[0].number > 100 && ARGS[0].number < 200

  • 使用 MVEL 表达式获取 Date 类型:

    例如 ARGS[0].getTime()<123123123

  • 使用 MVEL 表达式获取 Enum 枚举值:

    例如 AccountTypeEnum 类型

    AccountTypeEnum type = AccountTypeEnum.CORPORATE_ACCOUNT;

    匹配名字属性可以配置为 ARGS[0].name == 'CORPORATE_ACCOUNT'

  • 使用 MVEL 表达式获取数组元素:

    例如 ARGS[0][0]=='2017080200077000000022076255' 表示第一个参数是数组,数组的第一个元素是 2017080200077000000022076255

  • 使用 MVEL 表达式操作集合:

    • List 类型

      例如 ARGS[0].get(1)=='test2'

    • Map 类型

      例如 Map<String,Object> dataMap = new HashMap<String, Object>(); dataMap.put("testInteger",new Integer(20)); dataMap.put("testDouble",new Double(30));

      匹配表达式可以表示为 ARGS[0].get('testDouble') == 30.0ARGS[0].testDouble == 30.0

  • 使用关键字 contains 做范围匹配:

    • 是否包含在集合内:['aa', 'bb', 'Xin'].contains([0].last) 或者 [0].namelist contians ('Xi'),其中 [0].namelist 是数组,不是字符串。

    • 是否包含在字符串内:[0].last contains 'in',其中 [0].last 是字符串,判断是否包含 'in'

  • 使用关键字 IN 做范围匹配:

    用于比较一个参数是否在一个白名单或黑名单范围内的场景。IN 表示在名单范围内,则匹配成功,NOT_IN 相反。例如:ARGS[0].id IN 1,2,3,100

    重要

    白名单或黑名单列表的元素不能超过 100 个。

  • 使用 MVEL 表达式执行参数的 public 方法:

    可以调用某个参数的 public 方法,用返回的结果和特定的值比较。例如 [0].publicMethod == 'xxxx'

配置 Web 请求中的限流对象

Web 类型的限流对象的参数配置包括以下内容:

参数

说明

限流对象名

Web 请求中的 URI,不包括域名和参数部分。

键值

Web 请求 URL 中的参数键值,不支持 MVEL 表达式。

比较关系

等于或不等于。

比较值

用于比较的属性值。

说明

Web 类型的限流参数键值不支持 MVEL 表达式。 Web 类型的限流参数键值不支持 ARGS 变量。例如 /queryAllNames?instanceId=00001&name=cloudinc 请求,参数之间没有顺序关系,所以对于 Web 请求的参数过滤不能使用 ARGS 变量。

下图给出了针对请求 URL http://xxx.domain//webapi/guardian/history/search?instanceId=000001 限流对象配置样例:10 | left其中,instanceId 是请求 URL 中的参数的键值,00001 是参数中的属性值。