8.2.1 属性及表达式

属性是Istio策略和遥测功能的基本概念。属性是一小部分数据,用于描述特定服务请求的单个属性或请求的环境。例如,属性可以指定特定请求的大小、操作的响应代码,或者来自请求的IP地址等。

每个属性都有一个名称和一个类型,其中类型定义了属性所包含的数据类型。例如,属性可以具有字符串类型,这意味着它具有文本值,或者它可以具有INT64整数类型,如下所示:


request.path: xyz/abc
request.size: 234
request.time: 12:34:56.789 04/17/2017
source.ip: 192.168.0.1
destination.service: example

Mixer本质上是一种属性处理程序,每次请求时Envoy Sidecar都会调用Mixer,并为Mixer提供一组描述请求和请求周围环境的属性集。如图8-4所示,根据其配置和给定的特定属性集,Mixer会生成对各种后端基础设施的调用。

图8-4 Mixer会生成对各种后端基础设施的调用

每个给定的Istio部署有固定的能够理解的属性词汇。这个特定的词汇由当前部署中正在使用的属性生产者的集合来决定。Istio中除了Envoy是首要的属性生产者外,Mixer和服务也会产生属性。

此外,Mixer提供了一种配置表达式语言(Mixer conf iguration expression language,或缩写CEXL),用来指定Mixer遥测策略配置的匹配表达式和映射表达式。CEXL表达式将一组类型化的属性和常量映射到类型化的值。CEXL表达式支持一部分的Go语言表达式,并以之作为CEXL的语法。CEXL表达式自己实现了一部分Go语言的操作符,所以它只支持一部分Go语言操作符。在CEXL表达式里可以任意加上括号。表8-1列出了CEXL表达式支持的功能。

表8-1 CEXL表达式支持的功能

如果表达式尝试读取一个不存在的属性,表达式解析会失败。使用“|”操作符可以为这次读取属性设置一个默认值。

举个例子,如果request.auth.principal值不存在,在解析request.auth.principal=="user1"这个表达式时就会失败。可以用“|”(OR)操作符解决这个问题,如将表达式改为:(request.auth.principal|"nobody")=="user1"。

表8-2列出了表达式的多种不同情况。

表8-2 CEXL表达式的实际应用示例