Funktions-Flags für die Mehrmandantenarchitektur verwenden

In dieser Anleitung wird beschrieben, wie Sie App Lifecycle Manager-Funktions-Flags in einer Mehrmandantenumgebung implementieren, ohne den vorhandenen Prozess für die binäre Bereitstellung zu ändern.

Vorbereitung

Prüfen Sie zuerst, ob Sie Folgendes haben:

  1. Die Schnellstartanleitung Funktions-Flags bereitstellen durchgearbeitet.
  2. Eine gcloud-Umgebung, die für die Verwaltung von App Lifecycle Manager-Ressourcen konfiguriert ist.
  3. Ein vorhandenes SaaS-Angebot. Weitere Informationen zum Erstellen eines SaaS Angebots finden Sie unter SaaS-Angebot erstellen.

Ressourcenmodellierung

Bei einer Mehrmandanteneinrichtung empfehlen wir, eine Einheit für Ihren Dienst oder Ihre Anwendung und eine Einheit für jede Instanz des Dienstes oder der Anwendung zu definieren (die einen Mandanten oder eine Bereitstellung darstellt).

Wenn Sie Funktions-Flags in einer Mehrmandantenumgebung implementieren möchten, definieren Sie Attribute der Common Expression Language (CEL), mit denen Sie Ihre Mandanten identifizieren, konfigurieren Sie Ihre Anwendung so, dass Mandanten-IDs zur Laufzeit eingefügt werden, und verwenden Sie Auswertungsregeln, um Funktionen für bestimmte Mandanten zu beeinflussen.

In einfacheren Fällen können Sie auch separate Rollouts für jeden Kunden manuell erstellen.

1. SaaS-Angebot erstellen (falls noch nicht geschehen)

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

2. UnitKind erstellen

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

3. Einheiten für Mandanten erstellen

Verwenden Sie beim Erstellen von Einheiten Labels , um Mandantendienste in Gruppen zu kategorisieren (z.B. 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"

Attribute und Flags definieren

Sie müssen Attribute wie customerID formell definieren, um die Typsicherheit in Auswertungsregeln zu gewährleisten.

1. Attribut „customerID“ erstellen

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

2. Funktions-Flag erstellen

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

Anwendungseinbindung

Binden Sie das OpenFeature SDK in Ihren Dienst ein. Ihre Anwendung muss die customerID zur Laufzeit in den Kontext einfügen.

Beispiel:

// 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,
)

Mandantenspezifische Ausrichtung konfigurieren

Verwenden Sie Auswertungsregeln, um eine Funktion für bestimmte Kunden zu aktivieren.

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"]
    }'

Manuelles schrittweises Rollout mit Filtern

In einfacheren Anwendungsfällen können Sie Wellen emulieren, indem Sie separate Rollouts für jedes Kundenlabel manuell auslösen.

1. Revision und Release erstellen

# 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. Manuelle Rollouts auslösen

Sie können das Rollout manuell orchestrieren, indem Sie mit --unit-filter separate Vorgänge pro Zielgruppe auslösen.

# 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"

Nächste Schritte