全部产品

配置限流对象方法签名

更新时间:2020-04-29 10:12:31

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

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

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

参数
说明
限流对象名
包括要限流的接口与方法名:
  • 接口名:支持 RPC 服务接口或配置了 Spring AOP 拦截器的 Bean。
  • 方法名:支持带参数或不带参数的方法签名。有关方法重载的说明参见 方法配置说明
键值
限流参数及属性名称,用 MVEL 表达式 表示,获取用于比较的键值。
比较关系
等于 或 不等于
比较值
用于比较的属性值

下图给出了一个参数配置的样例:

7 | left

  • 上图中的配置表示限流对象为: com.alipay.antcloud.dsrconsole.core.service.guardian.facade.GuardianAppFacade.queryAppNames 方法的第一个参数中 instanceId 属性值为 000001 的请求。
  • ARGS 是服务限流内部定义的一个变量,表示方法的所有参数,ARGS[0] 表示第一个参数。

配置 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 是参数中的属性值。

接口方法中的 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.0,或者 ARGS[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 做范围匹配

    • 用于比较一个参数是否在一个白名单/黑名单范围内的场景。限制:白名单/黑名单列表的元素,不能超过 100 个。

    • IN 表示在名单范围内,则匹配成功,NOT_IN 相反。例如:ARGS[0].id IN 1,2,3,100

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

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