本指南介绍了如何在多租户环境中实现 App Lifecycle Manager 功能标志,而无需修改现有的二进制部署流程。
前提条件
开始之前,请确保您满足以下方面的要求:
- 已完成部署功能标志快速入门。
- 配置为管理 App Lifecycle Manager 资源的
gcloud环境。 - 现有的 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=beta、group=preview、group=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"
后续步骤
- 了解实验和 A/B 测试。
- 不妨了解问题排查。