使用多租户架构的功能标志

本指南介绍了如何在多租户环境中实现 App Lifecycle Manager 功能标志,而无需修改现有的二进制部署流程。

前提条件

开始之前,请确保您满足以下方面的要求:

  1. 已完成部署功能标志快速入门
  2. 配置为管理 App Lifecycle Manager 资源的 gcloud 环境。
  3. 现有的 SaaS 产品。如需详细了解如何创建 SaaS 产品,请参阅创建 SaaS 产品

资源建模

在多租户设置中,我们建议您为服务或应用定义一个单元种类,并为服务或应用的每个实例(表示租户或部署)定义一个单元。

如需在多租户环境中实现功能标志,请定义用于标识租户的通用表达式语言 (CEL) 属性,将应用配置为在运行时注入租户标识符,并使用评估规则来影响特定租户的功能。

在更简单的情况下,您还可以为每位客户手动创建单独的发布版本

1. 创建 SaaS 产品(如果尚未创建)

gcloud beta app-lifecycle-manager saas create "SAAS_NAME" \
    --project="PROJECT_ID" \
    --location="global" \
    --locations=name="LOCATION_1"

2. 创建 UnitKind

gcloud beta app-lifecycle-manager unit-kinds create "tenant-service-kind" \
    --project="PROJECT_ID" \
    --location="global" \
    --saas="SAAS_NAME"

3. 为租户创建单元

创建单元时,请使用标签将租户服务分类为不同的组(例如 group=betagroup=previewgroup=all)。

# Create a unit for Tenant A (Beta group)
gcloud beta app-lifecycle-manager units create "tenant-a-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=beta"

# Create a unit for Tenant B (Standard group)
gcloud beta app-lifecycle-manager units create "tenant-b-service" \
    --unit-kind="tenant-service-kind" \
    --location="LOCATION_1" \
    --labels="group=all"

定义属性和标志

您必须正式定义属性(例如 customerID),以确保评估规则中的类型安全。

1. 创建 customerID 属性

gcloud beta app-lifecycle-manager flags attributes create "customer-id-attr" \
    --key="customerID" \
    --attribute-value-type="STRING" \
    --location=global

2. 创建功能标志

gcloud beta app-lifecycle-manager flags create "enhanced-search" \
    --key="enhanced-search" \
    --flag-value-type=BOOL \
    --unit-kind="tenant-service-kind"

应用集成

将 OpenFeature SDK 集成到您的服务中。您的应用必须在运行时将 customerID 注入到上下文中。

Go 示例:

// Inject customerID into the evaluation context
evalCtx := map[string]any{
    "customerID": currentTenant.ID,
}

// Evaluate the flag
isEnabled, err := client.BooleanValue(
    context.Background(),
    "enhanced-search",
    false,
    evalCtx,
)

配置特定于租户的定位

使用评估规则为特定客户启用某项功能。

gcloud beta app-lifecycle-manager flags update "enhanced-search" \
    --location="global"
    --evaluation-spec='{
      "rules": [{
        "id": "allowlist-for-premium-tenants",
        "condition": "customerID in [\"tenant-xyz-123\", \"tenant-abc-789\"]",
        "target": "Enabled"
      }],
      "defaultTarget": "Disabled",
      "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/customer-id-attr"]
    }'

使用过滤条件手动逐步推出

对于较简单的使用情形,您可以为每个客户标签手动触发单独的发布,从而模拟波次。

1. 创建修订版本并发布

# Create a Revision (Snapshot)
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
    --location=global \
    --flag="enhanced-search"

# Create a Release
gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
    --location=global \
    --unit-kind="tenant-service-kind" \
    --revisions="enhanced-search-rev-1"

2. 触发手动发布

您可以使用 --unit-filter 为每个目标群组触发单独的操作,从而手动编排发布。

# Rollout to Beta group first
gcloud beta app-lifecycle-manager rollouts create "beta-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
    --unit-filter="labels.group == beta"

# After verification, rollout to the rest of the fleet
gcloud beta app-lifecycle-manager rollouts create "full-rollout" \
    --flag-release="release-of-enhanced-search" \
    --rollout-kind="rollout-kind-of-enhanced-search" \
    --location=global \
    --rollout-orchestration-strategy="Google.Cloud.Production" \
    --unit-filter="labels.group == all"

后续步骤