灰度发布可以基于HTTP和HSF创建流控规则,它们的规则参数设置有所不同。

HTTP可以根据Cookie值、HTTP Header值和URL参数值3种不同类型设置参数,按取模(mod 100)后余数的范围或列表(list)作为条件判定流量。相对通用和简单,不再详细介绍。需要说明的是,当参数值中包含非数字时将通过哈希(Hash)算法将非数字转化为数字。所以如果您的参数相对复杂,建议您使用列表方式进行流量判定。

本文档将重点对HSF流控规则中的参数进行说明。

全链路灰度支持用参数表达式来获取参数的某个属性,目前已支持下面的表达式:

表达式 说明 备注
args0 当前参数的值
args0.name 参数的name属性 会翻译成Java语句:arg.getName()
args0.isEnabled() 参数的enabled属性,是一个bool类型。 Java规范里,bool类型的getter格式是isXXX()
args0[0] arg是一个数组,获取数组的第一个值。
args0.get(0) arg是一个List,获取List的第一个值。
args0.get("key") arg是一个Map,获取key对应的值。

假设选择的是第一个参数,EDAS在页面会自动生成args0前缀。

以上的表达式可以组合使用,例如如下的表达式:

args0.persons[0].meta.get("name")先取参数的persons数组的第1个。再取person的meta属性,是一个Map。再取Map中 “name” 这个key的值。

支持的条件

  • =:支持字符串、数字、Boolean和Char的比较。
  • !=:支持字符串、数字、Boolean和Char的比较。
  • >:支持数字的比较。
  • >=:支持数字的比较。
  • <:支持数字的比较。
  • <=:支持数字的比较。

支持的值表达式

HSF参数匹配条件中的值表达式,代表了一个Java中的值。目前,仅支持Java中的基本类型,例如数字、字符、Boolean和Char等。不支持复杂类型和用户自定义类型。

值表达式有以下几种:

Java标准String

使用Java标准String表达式来表示一个字符串,被半角双引号("")包含的一段字符,即以"开始,并以"结束。例如:

  • "tom": 字符串tom
  • "10": 字符串10
  • "abc ": 字符串abc,后面紧跟着一个空格
  • "a": 字符串a
  • "\n": 换行
  • ""abc"": 字符串"abc"
  • "a\bc": 字符串a\bc

该表达式可以表达任意的字符串,语法就是Java里标准的String表达式。

数字类型

如果要表示一个数字类型的值,只需要输入数字本身即可。例如:

  • 100
  • 1.23
  • -3.14
  • 1.23f
说明 1.23在Java里默认是double类型的,如果要表示float类型的1.23,需要用1.23f。这是Java类型系统的精度决定的。

Boolean类型

Boolean类型只有两个值:true和false。

Char类型

Char类型表示一个字符,用半角单引号(‘’)包含,即以(')开始,并以(')结束。如'a'。

Null类型

Null类型表示Java里的Null。直接输入null即可。

字符串字面量

字符串字面量用一种“一字不差”的方式来表达一个字符串。里面的字符不需要进行转义。例如:

字符串字面量 Java String
tom “tom”
“\””
\ “\“
a\b “a\b”

下面的表格列出了所有类型的值对应的值表达式:

值类型 值表达式(在界面中需要填入的内容)
java.lang.String “tom” “tom” 或tom
java.lang.String “true” “true”
java.lang.String “10” “10”
说明 如需表达String类型的10,必须要加上双引号。没有双引号时,会被解析为数字类型的10。
java.lang.String 换行 “\n”
java.lang.String “\’”
java.lang.String “\””
java.lang.String \ “\“
java.lang.String aa’bb “aa’bb”
int 10 10
java.lang.Integer 10 10
byte 10 10
boolean true true
java.lang.Boolean true true
short 10 10
long 100 100
java.lang.Long 100 100
float 1.23f 1.23f
说明 当arg为float类型时,一定要在数字后加上f。1.23f==1.23返回false。
java.lang.Float 1.23f 1.23f
double 1.23 1.23
java.lang.Double 1.23 1.23
char ‘a’ ‘a’
null null null

示例

参数为String

输入框内什么都不用填。表示参数本身。

edas-appmgmt-canary-hsfPara-exam1.png

参数为数组

假设参数类型为String数组。

输入框输入[0]。表示取数组的第一个元素。

参数为List

假设参数为List<String>

输入框输入.get(0)。表示取List的第一个元素。注意不要忘记了点号(.)。

参数为复杂类型

假设某个方法的第一个参数是如下的类型:

public class Person {

    private String name;
    private int age;
    private String[] array;
    private List<String> list;
    private Map<String,String> map;
}           

可以设置如下的规则:

edas-appmgmt-canary-hsfPara-exam4-complex.png