Panduan ini menjelaskan cara mengonfigurasi dan menjalankan peluncuran fitur bertahap menggunakan flag fitur App Lifecycle Manager. Anda akan mempelajari cara menentukan atribut penargetan, mengonfigurasi alokasi berbasis persentase, dan menjalankan peluncuran progresif dengan aman.
Kita akan menggunakan skenario saat Anda ingin mengaktifkan algoritma enhanced-search hanya untuk 1% traffic Anda, yang diacak berdasarkan atribut userID, sementara 99% sisanya terus menggunakan penelusuran standar.
Prasyarat
Sebelum memulai, pastikan Anda telah menyelesaikan salah satu panduan memulai standar untuk menyediakan infrastruktur dasar atau resource flag fitur mandiri:
- Panduan memulai: Men-deploy flag fitur dengan App Lifecycle Manager
- Panduan memulai: Menggunakan flag fitur Mandiri
Mengintegrasikan flag di aplikasi Anda
Untuk mendukung alokasi berbasis persentase yang didorong oleh data pengguna, aplikasi Anda harus melampirkan nilai atribut (misalnya, userID) ke Konteks Evaluasi OpenFeature saat runtime sebelum memanggil metode evaluasi.
Contoh berikut menunjukkan cara mengambil klien yang diinisialisasi dan mengevaluasi flag dengan konteks penargetan terlampir.
"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. Get client client := openfeature.NewClient("simple-api")
// 2. Create Evaluation Context with user data evalCtx := openfeature.NewEvaluationContext( userID, map[string]interface{}{ "userID": userID, // Ensure userID is passed dynamically }, )
// 3. Evaluate flag (defaults to false if unreachable) isEnhanced, err := client.BooleanValue(context.Background(), "enhanced-search", false, evalCtx) if err != nil { log.Printf("Flag evaluation failed: %v", err) }
// 4. Execute business logic
if 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. Get client var client = OpenFeatureAPI.getInstance().getClient("simple-api");
// 2. Create Evaluation Context with user data var context = new dev.openfeature.sdk.MutableContext(); context.add("userID", userID);
// 3. Evaluate flag boolean isEnhanced = client.getBooleanValue("enhanced-search", false, context);
// 4. Execute business logic
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. Get client
client = openfeature.api.get_client()
2. Create Evaluation Context with user data
eval_ctx = EvaluationContext(
targeting_key=str(user_id),
attributes={
"userID": user_id,
}
)
3. Evaluate flag
is_enhanced = client.get_boolean_value( "enhanced-search", False, eval_ctx )
4. Execute business logic
if is_enhanced: print(f"Executing enhanced search for user {user_id}") else: print(f"Executing standard search for user {user_id}") ```
Mengonfigurasi perilaku flag
Tentukan parameter atribut acak dan kaitkan dengan aturan alokasi berbasis persentase pada resource flag fitur.
Membuat atribut penargetan: Tentukan resource atribut
userIDsecara global untuk mendaftarkannya untuk evaluasi penargetan.gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \ --key="userID" \ --attribute-value-type="STRING" \ --location="global"Menentukan aturan alokasi flag: Buat resource flag fitur untuk menetapkan bobot 1% ke varian
enabledyang diacak padauserID.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"] }' \
Membuat peluncuran konfigurasi flag
Untuk mendistribusikan aturan alokasi bertahap yang baru dibuat dengan aman, lanjutkan melalui fase peluncuran standar yang tidak dapat diubah.
Membuat revisi: Ambil snapshot konfigurasi alokasi 1%.
gcloud beta app-lifecycle-manager flags revisions create "enhanced-search-rev-1" \ --location="global" \ --flag="enhanced-search"Membuat rilis: Kemas revisi untuk deployment terhadap jenis unit Anda.
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"Memulai peluncuran: Tentukan strategi orkestrasi dan deploy konfigurasi.
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"Memantau peluncuran: Pastikan deployment mencapai status
SUCCEEDED.gcloud beta app-lifecycle-manager rollouts describe "rollout-of-enhanced-search" \ --location="global"
Memperbarui penargetan flag
Setelah peluncuran 1% dianggap berhasil dan stabil, perluas audiens persentase peluncuran dengan memperbarui bobot alokasi internal flag (misalnya, menjadi 50%).
Memperbarui spesifikasi flag: Ubah slot alokasi menjadi 50% diaktifkan dan 50% dinonaktifkan.
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"] }'Men-deploy perluasan: Ikuti siklus proses untuk mendistribusikan bobot yang diperbarui ke klien yang terhubung.
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"Operasi ini dapat diulang terus-menerus hingga fitur mencapai deployment 100%.
Menghentikan penggunaan flag
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"] }"
Setelah flag fitur menyelesaikan peluncurannya dan berfungsi sebagai perilaku operasional standar, flag tersebut harus dihentikan penggunaannya dengan aman.
- Menghapus dari aplikasi: Hapus semua logika kondisional evaluasi flag dari codebase aplikasi Anda dan deploy payload yang diperbarui ke produksi.
- Menandai untuk pembersihan: Tetapkan status flag ke
CLEANUPuntuk secara eksplisit menandakan niat untuk menghentikan penyediaannya. - Men-deploy peluncuran akhir: Jalankan peluncuran akhir untuk membuat konfigurasi backend tidak tersedia secara eksplisit, setelah itu Anda dapat menghapus flag dan metadata revisi dengan aman dari bidang pengelolaan.