10.1 Mixer适配器扩展

Mixer在应用程序代码和后端基础设施(如配额系统、访问控制系统、日志记录等)之间提供Istio的通用中介层。它是一个属性处理引擎,它使用运维者提供的配置将来自代理的请求属性进行处理,将其映射到一系列的后端系统调用中。适配器使Mixer能够公开单个一致的API,而与使用的后端基础设施无关。在运行时使用的确切适配器集是通过运维人员配置确定的,并且可以轻松扩展到目标新的或自定义后端基础设施。图10-1为Mixer架构框图。

图10-1 Mixer架构

Mixer使用模板将其传入属性构建为适用于适配器的形式。模板描述了处理请求时分配给适配器的数据形式以及适配器必须实现接收此数据的gRPC服务接口。采用Istio的操作符可控制如何构造此模板并将其分派给适配器。

Mixer提供了一套开箱即用的默认模板。我们强烈建议你在实现适配器时使用Mixer的默认模板。如果你有特定需求,你还可以创建自己的模板以及适配器,以使用相关数据。Mixer默认包含一些内置样本gRPC适配器,但用户可能需要实现自己的Mixer才能让Mixer将数据发送到其选择的后端。

模板开发人员、适配器开发人员和运维人员的角色可以概括为:

·模板开发人员定义了一个模板,该模板描述了Mixer调度到适配器的数据,以及适配器必须实现的用于处理该数据的接口。Mixer中支持的模板集确定了运维人员可以配置Mixer以创建和分发到适配器的各种类型的数据。

·适配器开发人员根据适配器必须提供的功能选择想要支持的模板。适配器开发人员的角色是实现所需的一组特定于模板的接口,以处理Mixer在运行时调度的数据。

·运维人员定义应收集哪些数据(实例)、可以发送的数据(处理程序)以及何时发送(规则)。

1.模板概述

要了解适配器如何接收和处理特定于模板的实例,本节首先提供有关适配器开发相关模板的各种工件的详细信息。

正如我们在上一节中看到的,Mixer的构建支持一组模板,每个模板定义一种数据,在处理请求时Mixer调度到适配器,并定义适配器使用该数据的接口。图10-2显示了模板的各种组件。

图10-2 模板中的各种组件

2.模板原型文件

使用带有名为的消息的proto文件定义模板'Template'。Template是一个简单的原型消息,没有相关的代码。适配器使用的所有Go工件都是从模板protos自动生成的。

每个模板还有两个与之关联的附加属性:

·名称:每个模板都有唯一的名称。适配器代码使用模板的名称向Mixer注册,它希望使用与特定模板关联的实例对象。模板名称也在操作符配置中用于向属性映射提供特定于模板的字段,用于创建实例对象。

·模板类型:每个模板都有一个特定的template_variety,可以是检查(Check)、报告(Report)、配额(Quota)或属性生成器(AttributeGenerator)。模板及其种类决定了适配器必须实现的方法的签名,以便使用关联的实例。该template_variety也决定在其核心调音台的行为,在instances对模板应创建并分发到适配器。例如:

·仅在Mixer的检查API调用期间创建和分派检查模板变量实例。

·仅在Mixer的报告API调用期间创建和分派报表模板变量实例。

·在查询配额分配时,仅在Mixer的检查API调用期间创建和分派配额模板变量实例。

·创建属性生成器模板变体实例并将其分派给适配器以进行检查、报告Mixer API调用。这些模板的处理发生在补充属性生成阶段,该阶段在处理任何其他种类的模板之前发生。处理属性生成器模板的适配器称为属性生成适配器。这些适配器负责生成由模板决定的输出数据,运维人员可以使用这些数据来创建新属性。这些新属性与请求中的属性组合在一起,形成操作的总属性集。因此,运维人员现在可以使用这些新属性来配置其他检查、报告和配额种类模板的实例。

3.生成Go代码

处理单个模板以生成五个Go工件:

·InstanceMsg结构:它定义在请求时传递给适配器的数据。Mixer实例根据请求属性和运维人员配置构造该类型的对象。

·OutputMsg结构(仅适用于ATTRIBUTE_GENERATOR模板):这定义了在属性生成阶段(在调用其他检查、报告、配额处理适配器之前)适配器返回的数据。基于操作符配置,Mixer使用该OutputMsg对象构造新属性。

·处理程序服务:定义了Mixer用于InstanceMsg在请求时将创建的对象分派给适配器的gRPC服务RPC接口。适配器必须为它们支持的所有模板实现处理程序服务。

·类型结构:如果InstanceMsg是dynamic(istio.policy.v1beta1.Value)中字段的数据类型,则在请求时间内由运维人员提供的配置来确定保留值的数据类型。类型结构使用ValueType枚举表示动态字段的数据类型,该类型在Go数据类型与其枚举值之间具有1:1映射。