使用逐步发布功能

本指南介绍了如何使用 App Lifecycle Manager 功能标志配置和执行功能逐步发布。您将了解如何定义定位属性、配置基于百分比的分配,以及安全地执行渐进式发布。

我们将使用一个场景,您希望仅为 1% 的流量启用 enhanced-search 算法,这些流量按 userID 属性随机分配,而其余 99% 的流量继续使用标准搜索。

前提条件

在开始之前,请确保您已完成以下标准快速入门之一,以预配基准架构或独立功能标志资源:

在应用中集成标志

如需支持由用户数据驱动的基于百分比的分配,您的应用必须在运行时将属性值(例如 userID)附加到 OpenFeature 评估上下文,然后再调用评估方法。

以下示例演示了如何检索已初始化的客户端,以及如何评估附加了定位上下文的标志。

```go import ( "context" "fmt" "log"

"github.com/open-feature/go-sdk/pkg/openfeature"

)

// Example userID - in a real application, this would come from the request context. var userID = "example-user-123"

// 1. 获取客户端 client := openfeature.NewClient("simple-api")

// 2. 使用用户数据创建评估上下文 evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )

// 3. 评估标志(如果无法访问,则默认为 false) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) }

// 4. 如果 isEnhanced,则执行业务逻辑 { log.Printf("Enhanced search algorithm for user %s", userID) } else { log.Printf("Standard search algorithm for user %s", userID) } </devsite-tab> <devsite-tab title="Java">java // 1. 获取客户端 var client = OpenFeatureAPI.getInstance().getClient("simple-api");

// 2. 使用用户数据创建评估上下文 var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);

// 3. 评估标志 boolean isEnhanced = client.getBooleanValue("enhanced-search", false, context);

// 4. 执行业务逻辑 if (isEnhanced) { System.out.println("Executing enhanced search algorithm..."); } else { System.out.println("Executing standard search algorithm..."); } </devsite-tab> <devsite-tab title="Python">python import openfeature from openfeature.evaluation_context import EvaluationContext

1. 获取客户端

client = openfeature.api.get_client()

2. 使用用户数据创建评估上下文

eval_ctx = EvaluationContext( targeting_key=str(user_id), attributes={ "userID": user_id,
} )

3. 评估标志

is_enhanced = client.get_boolean_value( "enhanced-search", False, eval_ctx )

4. 执行业务逻辑

if is_enhanced: print(f"Executing enhanced search for user {user_id}") else: print(f"Executing standard search for user {user_id}") ```

配置标志行为

定义随机属性参数,并将其与功能标志资源上的基于百分比的分配规则相关联。

  1. 创建定位属性: 全局定义 userID 属性资源,以将其注册以进行定位评估。

    gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
      --key="userID" \
      --attribute-value-type="STRING" \
      --location="global"
    
  2. 定义标志分配规则: 构建功能标志资源,以将 1% 的权重分配给在 userID 上随机分配的 enabled 变体。

    gcloud beta app-lifecycle-manager flags create "enhanced-search" \
      --key="enhanced-search" \
      --flag-value-type=BOOL \
      --location="global" \
      --unit-kind="demo-test-unitKind" \
      --variants='[ { "id": "Enabled", "booleanValue": true }, { "id": "Disabled", "booleanValue": false } ]' \
      --evaluation-spec='{
        "allocations": [{
          "id": "percentage-rollout",
          "randomizedOn": "userID",
          "slots": [
            {"variant": "enabled", "weight": 1},
            {"variant": "disabled", "weight": 99}
          ]
        }],
        "defaultTarget": "percentage-rollout",
        "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }' \
    

创建标志配置发布

如需安全地分发新创建的逐步分配规则,请按标准不可变发布阶段进行操作。

  1. 创建修订版本: 捕获 1% 分配配置的快照。

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \
       --location="global" \
       --flag="enhanced-search"
    
  2. 创建版本: 将修订版本打包,以便针对您的单元类型进行部署。

    gcloud beta app-lifecycle-manager flags releases create "release-of-enhanced-search" \
       --location="global" \
       --unit-kind="demo-test-unitkind" \
       --flag-revisions="enhanced-search-rev-1"
    
  3. 启动发布: 定义编排策略并部署配置。

    gcloud beta app-lifecycle-manager rollout-kinds create "rollout-kind-of-enhanced-search" \
       --unit-kind="demo-test-unikind" \
       --rollout-orchestration-strategy="Google.Cloud.Simple.AllAtOnce" \
       --location="global"
    
    gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search" \
       --flag-release="release-of-enhanced-search" \
       --rollout-kind="rollout-kind-of-enhanced-search" \
       --location="global"
    
  4. 监控发布: 确认部署达到 SUCCEEDED 状态。

    gcloud beta app-lifecycle-manager rollouts describe "rollout-of-enhanced-search" \
       --location="global"
    

更新标志定位

如果 1% 的发布被视为成功且稳定,请更新标志的内部分配权重(例如更新为 50%),以扩大发布百分比受众群体。

  1. 更新标志规范: 将分配槽位更改为 50% 启用和 50% 停用。

    gcloud beta app-lifecycle-manager flags update "enhanced-search" \
      --evaluation-spec='{
        "allocations": [{
          "id": "percentage-rollout",
          "randomizedOn": "userID",
          "slots": [
            {"variant": "enabled", "weight": 50},
            {"variant": "disabled", "weight": 50}
          ]
        }],
        "defaultTarget": "percentage-rollout",
        "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }'
    
  2. 部署扩展: 按照生命周期将更新后的权重分发给连接的客户端。

    gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-2" \
       --location="global" \
       --flag="enhanced-search"
    
    gcloud beta app-lifecycle-manager flags releases create "enhanced-search-50pct" \
       --location="global" \
       --unit-kind="demo-test-unitkind" \
       --flag-revisions="enhanced-search-rev-2"
    
    gcloud beta app-lifecycle-manager rollouts create "rollout-of-enhanced-search-50pct" \
       --flag-release="enhanced-search-50pct" \
       --rollout-kind="rollout-kind-of-enhanced-search" \
       --location="global"
    

    此操作可以持续重复,直到功能达到 100% 部署。

停用标志

curl --request POST
"https://saasservicemgmt.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/flagReleases?flagReleaseId=obsolete-enhanced-search"
--header "Authorization: Bearer $(gcloud auth application-default print-access-token)"
--header "Content-Type: application/json"
--header "Accept: application/json"
--data "{ "unitKind": "projects/PROJECT_ID/locations/global/unitKinds/UNIT_KIND_ID", "obsoleteFlags": ["projects/PROJECT_ID/locations/global/flags/enhanced-search"] }"

功能标志完成发布并作为标准运营行为后,必须安全地停用。

  1. 从应用中移除:从应用代码库中移除所有标志评估条件逻辑,并将更新后的有效载荷部署到生产环境。
  2. 标记以进行清理: 将标志状态设置为 CLEANUP,以明确表明要取消预配该标志。
  3. 部署最终发布: 执行最终发布,以明确禁止使用后端配置,之后您可以从管理平面安全地删除标志和修订版本元数据。