表达式语言
Mixer 配置使用了一种表达式语言(CEXL) 去描述 match expressions 以及 mapping expressions。CEXL 表达式为有类型的 映射了一组带类型的属性和常量。
语法
CEXL 使用 Go 表达式的一个子集作为语法。CEXL 实现了一组 Go 操作符来限制这部分有限的 Go 表达式。CEXL 同样支持任意的括号。
类型检查
CEXL 变量是属性词汇表中的某个属性,常量是隐式类型,函数是显式类型。
Mixer 验证 CEXL 表达式的语法并在配置验证期间解析为一个类型。选择器必须解析为 boolean 类型且 mapping expressions 必须解析为它所映射的类型。当选择器解析为 boolean 类型失败或 mapping expression 解析为不正确的类型时配置验证将失败。
如果表达式使用了一个在请求处理期间不可用的属性,则表达式将执行失败。如果属性可能缺失,请使用|
运算符提供默认值。
比如,如果表达式 request.auth.principal
属性是缺失的则 request.auth.principal == "user1"
将执行失败。|
(或) 运算符可以处理这个问题: (request.auth.principal | "nobody" ) == "user1"
。
例子
表达式 | 返回类型 | 描述 |
---|---|---|
request.size | 200 | int | request.size 在可用时返回其值,否则返回 200。 |
request.headers["x-forwarded-host"] == "myhost" | boolean | |
(request.headers["x-user-group"] == "admin") || (request.auth.principal == "admin") | boolean | user 是 admin 或属于 admin 组时,结果为 true。 |
(request.auth.principal | "nobody" ) == "user1" | boolean | 如果 request.auth.principal 是 “user1” 则结果是 true,且 request.auth.principal 属性缺失时不会报错。 |
source.labels["app"]=="reviews" && source.labels["version"]=="v3" | boolean | 如果 app label 是 reviews 且 version label 是 v3 则结果是 true,否则是 false。 |