服务限流可以对方法的参数进行过滤,以实现对某个特定的参数进行限流。
配置接口方法类型的限流对象
接口方法类型的限流对象的参数配置包括以下内容:
参数 | 说明 |
限流对象名 | 包括要限流的接口与方法名:
例如上图中的配置表示限流对象为
|
键值 | 限流参数及属性名称,用 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。
示例如下:
方式二:左侧键值计算结果是个普通字符串,右侧比较值中也填写一个字符串。
示例如下:
上述两种方式的效果一样,推荐用第一种方式。第一种方式支持更多的运算符,例如 &&、||、>、<=
等,表达能力更丰富。
配置样例
使用 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 做范围匹配:
用于比较一个参数是否在一个白名单或黑名单范围内的场景。
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
限流对象配置样例:其中,instanceId
是请求 URL 中的参数的键值,00001
是参数中的属性值。