Erweiterte Trafficverwaltung mit proxylosen gRPC-Diensten konfigurieren

Dieses Dokument enthält Anleitungen zum Konfigurieren von Traffic Director mit den folgenden Routingfeatures:

  • Routenzuordnung
  • Traffic-Teilung
  • Schutzschaltung
  • Fault Injection
  • Maximale Streamdauer

In diesem Dokument geht es hauptsächlich um die Einrichtung einer erweiterten Trafficverwaltung mit proxylosem gRPC in Compute Engine. Für die Verwendung von proxylosem gRPC in Google Kubernetes Engine (GKE) wird die erweiterte Trafficverwaltung ebenfalls unterstützt.

Hinweis

Bevor Sie die erweiterte Trafficverwaltung konfigurieren, lesen Sie die Anforderungen unter Einrichten von Traffic Director mit proxylosen gRPC-Diensten vorbereiten. Sie können die erweiterte Trafficverwaltung nur konfigurieren, wenn alle Anforderungen erfüllt sind.

Konzeptionelle Informationen zu diesen Features finden Sie unter Erweiterte Trafficverwaltung.

gRPC-Wallet-Beispiel

Stellen Sie ein gRPC-Wallet-Beispiel zur Verfügung, um diese Features zu veranschaulichen. Wie im folgenden Diagramm dargestellt, erstellen Sie Back-End-Dienste für wallet-service, stats-service und account-service.

Beispielkonfiguration für das Traffic-Routing von gRPC-Wallet
Beispielkonfiguration für das Traffic-Routing von gRPC-Wallet (zum Vergrößern anklicken)

In diesem Beispiel stellen Sie mehrere Versionen jedes Dienstes bereit, um das Anfragerouting anhand der von Ihnen konfigurierten Regeln zu veranschaulichen. Wenn Sie das Erstellen und Bereitstellen verschiedener Versionen eines Dienstes simulieren möchten, verwenden Sie Server-Flags, um das Verhalten von Binärdateien zu ändern, die Sie nur einmal erstellen.

  • Das Flag --port gibt den Port an, den der Dienst auf der Back-End-VM überwacht.
  • Das Flag --hostname_suffix gibt einen Wert an, der an den Hostnamen der VM angehängt wird, die auf eine Anfrage antwortet. Der resultierende Wert wird als hostname-Metadaten in der Antwort hinzugefügt. So können Sie leichter feststellen, welche Instanz eines Back-End-Dienstes auf die Clientanfrage reagiert hat.
  • Das Flag --premium_only mit dem Wert true gibt an, dass der Dienst eine Premium-Version des Dienstes stats ist.
  • Das Flag --v1_behavior mit dem Wert true gibt an, dass sich die Wallet-Binärdatei als Version V1 verhält.

In der folgenden Tabelle sind die Werte dieser Flags für jeden Back-End-Dienst (Dienst), jede Instanzgruppe und jede Instanz im Wallet-Beispiel aufgeführt.

Back-End-Dienst Instanzgruppe Instanzen Server-Flags
account account 2 --port=50053
--hostname_suffix="account"
stats stats 2 --port=50052
--hostname_suffix="stats"
--account_server="xds:///account.grpcwallet.io"
stats-premium stats-premium 2 --port=50052
--hostname_suffix="stats_premium"
--account_server="xds:///account.grpcwallet.io"
--premium_only=true
wallet-v1 wallet-v1 2 --port=50051
--hostname_suffix="wallet_v1"
--v1_behavior=true
--account_server="xds:///account.grpcwallet.io"
--stats_server="xds:///stats.grpcwallet.io"
wallet-v2 wallet-v2 1 --port=50051
--hostname_suffix "wallet_v2"
--account_server="xds:///account.grpcwallet.io"
--stats_server="xds:///stats.grpcwallet.io"

Anschließend konfigurieren Sie Traffic Director so, dass Anfragen an diese Dienste anhand der Routingregeln aus der folgenden Tabelle von einem Testclient weitergeleitet werden.

Host Übereinstimmungsregeln Routingaktion
wallet.grpcwallet.io Standardeinstellung wallet-v1
Vollständiger Pfad: /grpc.examples.wallet.Wallet/FetchBalance wallet-v1: 40 %
wallet-v2: 60 %
Pfadpräfix: /grpc.examples.wallet.Wallet/ wallet-v2
stats.grpcwallet.io Standardeinstellung stats
Pfadpräfix: "/"
Header: {"membership": "premium"}
stats-premium
account.grpcwallet.io Standard account

Lokale Umgebung vorbereiten

Führen Sie die folgenden Befehle aus, um die Umgebung für diese Beispiele wie erforderlich einzurichten:

  1. Aktualisieren Sie die Binärdatei gcloud, um sicherzustellen, dass Sie die neueste Version haben:

    gcloud components update
    
  2. Laden Sie das Beispiel-Repository herunter:

    sudo apt-get install git -y
    
  3. Legen Sie den Wert für EXAMPLES_VERSION fest und klonen Sie das richtige Repository für das Beispiel:

    export EXAMPLES_VERSION=v1.0.x
    git clone -b "${EXAMPLES_VERSION}" --single-branch --depth=1 \
      https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    

Cloud Router-Instanzen erstellen und konfigurieren

In diesem Abschnitt erstellen Sie in jeder Region Cloud Router-Instanzen und konfigurieren sie für Cloud NAT. Die in diesem Beispiel erstellten VMs haben keine externen IP-Adressen, sie benötigen jedoch Zugriff auf das Internet. Die Konfiguration von Cloud Router mit Cloud NAT bietet den erforderlichen Zugriff.

gcloud

  1. Erstellen Sie die Cloud Router-Instanzen:

    gcloud compute routers create nat-router-us-central1 \
        --network=default \
        --region=us-central1
    
  2. Konfigurieren Sie die Router für Cloud NAT:

    gcloud compute routers nats create nat-config \
        --router-region=us-central1 \
        --router=nat-router-us-central1 \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips
    

gRPC-Systemdiagnose und Firewallregel erstellen

In diesem Abschnitt erstellen Sie eine gRPC-Systemdiagnose und eine Firewallregel, damit gRPC-Systemdiagnoseanfragen Ihr Netzwerk erreichen. Später wird die gRPC-Systemdiagnose mit Back-End-Diensten verknüpft, um die Integrität der Back-Ends in diesen Back-End-Diensten zu prüfen.

gcloud

  1. Erstellen Sie die Systemdiagnose:

    gcloud compute health-checks create grpc grpcwallet-health-check \
        --use-serving-port
    
  2. Erstellen Sie die Firewallregel für die Systemdiagnose:

    gcloud compute firewall-rules create grpcwallet-allow-health-checks \
        --network default --action allow --direction INGRESS \
        --source-ranges 35.191.0.0/16,130.211.0.0/22 \
        --target-tags allow-health-checks \
        --rules tcp:50051-50053
    

Instanzvorlage erstellen

In diesem Abschnitt erstellen Sie eine Instanzvorlage, um den gRPC-Dienst account bereitzustellen, der über Port 50053 verfügbar gemacht wird.

gcloud

  • Erstellen Sie die Instanzvorlage:

    gcloud compute instance-templates create grpcwallet-account-template \
       --scopes=https://www.googleapis.com/auth/cloud-platform \
       --tags=allow-health-checks \
       --network-interface=no-address \
       --image-family=debian-10 \
       --image-project=debian-cloud \
       --metadata-from-file=startup-script=<(echo "#! /bin/bash
    set -ex
    cd /root
    export HOME=/root
    sudo apt-get update -y
    sudo apt-get install -y golang git
    git clone -b ${EXAMPLES_VERSION} --single-branch --depth=1 https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    cd traffic-director-grpc-examples/go/account_server/
    go build .
    sudo systemd-run ./account_server --port 50053 --hostname_suffix account")
    

Verwaltete Instanzgruppe erstellen

Verwaltete Instanzgruppen (MIGs) verwenden bei Bedarf Autoscaling, um neue Back-End-VMs zu erstellen. In diesem Abschnitt erstellen Sie eine MIG mit der Instanzvorlage, die Sie im vorherigen Abschnitt erstellt haben.

gcloud

  • Erstellen Sie die Instanzgruppe:

    gcloud compute instance-groups managed create grpcwallet-account-mig-us-central1 \
       --zone=us-central1-a \
       --size=2 \
       --template=grpcwallet-account-template
    

Benannten Port konfigurieren

In diesem Abschnitt konfigurieren Sie den benannten Port für den gRPC-Dienst. Der benannte Port ist der Port, den der gRPC-Dienst auf Anfragen überwacht. In diesem Beispiel lautet der benannte Port Port 50053.

gcloud

  • Erstellen Sie den benannten Port:

    gcloud compute instance-groups set-named-ports grpcwallet-account-mig-us-central1 \
       --named-ports=grpcwallet-account-port:50053 \
       --zone=us-central1-a
    

Back-End-Dienst erstellen

In diesem Abschnitt erstellen Sie einen globalen Back-End-Dienst mit dem Load-Balancing-Schema INTERNAL_SELF_MANAGED und dem Protokoll GRPC. Anschließend verknüpfen Sie die Systemdiagnose und die Instanzgruppe mit dem Back-End-Dienst. In diesem Beispiel verwenden Sie die MIG, die Sie unter Verwaltete Instanzgruppe erstellen erstellt haben. Diese MIG führt den gRPC-Dienst account aus. Der Port im Flag --port-name ist der benannte Port, den Sie unter Benannten Port konfigurieren erstellt haben.

gcloud

  1. Erstellen Sie den Back-End-Dienst und verknüpfen Sie die Systemdiagnose mit dem neuen Back-End-Dienst.

    gcloud compute backend-services create grpcwallet-account-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --protocol=GRPC \
        --port-name=grpcwallet-account-port \
        --health-checks=grpcwallet-health-check
    
  2. Fügen Sie die verwaltete Instanzgruppe als Back-End hinzu:

    gcloud compute backend-services add-backend grpcwallet-account-service \
        --instance-group=grpcwallet-account-mig-us-central1 \
        --instance-group-zone=us-central1-a \
        --global
    

Die Schritte zum Erstellen der im gRPC-Wallet-Beispiel verwendeten verbleibenden Back-End-Dienste sind den obigen Schritten ähnlich. Sie erstellen die verbleibenden Dienste mit einem Shell-Skript. Das Skript stellt die folgenden Back-End-Dienste bereit:

  • stats
  • stats-premium
  • wallet-v1
  • wallet-v2

Führen Sie das Shell-Skript aus, mit dem die zusätzlichen Back-End-Dienste erstellt werden:

traffic-director-grpc-examples/scripts/create_service.sh go stats 50052 stats '--account_server="xds:///account.grpcwallet.io"'

traffic-director-grpc-examples/scripts/create_service.sh go stats 50052 stats-premium '--account_server="xds:///account.grpcwallet.io" --premium_only=true'

traffic-director-grpc-examples/scripts/create_service.sh java wallet 50051 wallet-v1 '--account_server="xds:///account.grpcwallet.io" --stats_server="xds:///stats.grpcwallet.io" --v1_behavior=true'

traffic-director-grpc-examples/scripts/create_service.sh java wallet 50051 wallet-v2 '--account_server="xds:///account.grpcwallet.io" --stats_server="xds:///stats.grpcwallet.io"'

Routingregeln erstellen

In diesem Abschnitt erstellen Sie eine URL-Zuordnung, die die virtuellen Hostnamen der Dienste in diesem Beispiel und die verknüpften Routingregeln angibt. Weitere Informationen finden Sie unter Routingregelzuordnungen.

In der URL-Zuordnung geben die hostRules die virtuellen Hostnamen der Dienste im Beispiel an. Das sind die Namen, die ein Client im Kanal-URI verwendet, um eine Verbindung zu einem bestimmten Dienst herzustellen. Um beispielsweise eine Anfrage an den Dienst account zu senden, verwendet ein Client xds:///account.grpcwallet.io im Kanal-URI. Konfigurieren Sie in den hostRules einen hosts-Eintrag mit dem Wert account.grpcwallet.io.

Der mit einem hosts-Eintrag verknüpfte pathMatcher gibt den Namen eines pathMatcher an, der alle Routingregeln für diesen virtuellen Host enthält. Eine pathMatcher-Konfiguration besteht aus übereinstimmenden Regeln und den entsprechenden Aktionsregeln. Das Beispiel führt zu folgender Konfiguration:

  • Wenn eine Anfrage an account.grpcwallet.io gesendet wird, senden Sie die Anfrage an den Back-End-Dienst grpcwallet-account-service.
  • Wenn eine Anfrage an stats.grpcwallet.io gesendet wird:
    • Wenn die Anfrage den Header membership mit dem Wert premium enthält, senden Sie die Anfrage an den Back-End-Dienst grpcwallet-stats-premium-service.
    • Andernfalls senden Sie die Anfrage an den Standard-Back-End-Dienst grpcwallet-stats-service.
  • Wenn eine Anfrage an wallet.grpcwallet.io gesendet wird:

    • Wenn ServiceName oder MethodName mit /grpc.examples.wallet.Wallet/FetchBalance übereinstimmt, senden Sie 40% dieser Anfragen an den Back-End-Dienst grpcwallet-wallet-v2-service und die verbleibenden Anfragen an den Back-End-Dienst grpcwallet-wallet-v1-service.
    • Wenn der ServiceName mit /grpc.examples.wallet.Wallet/ übereinstimmt, senden Sie die Anfrage unabhängig von der aufgerufenen Methode an den Back-End-Dienst grpcwallet-wallet-v1-service.

gcloud

Erstellen Sie die URL-Zuordnung:

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')

gcloud compute url-maps import grpcwallet-url-map << EOF
defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-account-service
name: grpcwallet-url-map

hostRules:
- hosts:
  - account.grpcwallet.io
  pathMatcher: grpcwallet-account-path-matcher
- hosts:
  - stats.grpcwallet.io
  pathMatcher: grpcwallet-stats-path-matcher
- hosts:
  - wallet.grpcwallet.io
  pathMatcher: grpcwallet-wallet-path-matcher

pathMatchers:
- defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-account-service
  name: grpcwallet-account-path-matcher

- defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-stats-service
  name: grpcwallet-stats-path-matcher
  routeRules:
  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: membership
        exactMatch: premium
    priority: 0
    service: projects/$PROJECT_ID/global/backendServices/grpcwallet-stats-premium-service

- defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v1-service
  name: grpcwallet-wallet-path-matcher
  routeRules:
  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: route
        exactMatch: timeout
    priority: 0
    routeAction:
      weightedBackendServices:
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v2-service
        weight: 100
      maxStreamDuration:
        seconds: 5

  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: route
        exactMatch: fault
    priority: 1
    routeAction:
      weightedBackendServices:
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v2-service
        weight: 100
      faultInjectionPolicy:
        abort:
          httpStatus: 503
          percentage: 50

  - matchRules:
    - fullPathMatch: /grpc.examples.wallet.Wallet/FetchBalance
    priority: 2
    routeAction:
      weightedBackendServices:
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v2-service
        weight: 40
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v1-service
        weight: 60

  - matchRules:
    - prefixMatch: /grpc.examples.wallet.Wallet/
    priority: 3
    routeAction:
      weightedBackendServices:
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v2-service
        weight: 100
EOF

Zielproxy und Weiterleitungsregel erstellen

In diesem Abschnitt erstellen Sie den gRPC-Zielproxy und eine Weiterleitungsregel.

Der gRPC-Zielproxy verweist auf die URL-Zuordnung, die Sie im vorherigen Schritt erstellt haben. Das Flag --validate-for-proxyless aktiviert die Konfigurationsprüfungen, damit Sie nicht versehentlich ein Feature aktivieren, das nicht mit proxylosen gRPC-Bereitstellungen kompatibel ist.

gcloud

  • Erstellen Sie den gRPC-Zielproxy:

    gcloud compute target-grpc-proxies create grpcwallet-proxy \
       --url-map=grpcwallet-url-map \
       --validate-for-proxyless
    

Die Weiterleitungsregel verweist auf den von Ihnen erstellten gRPC-Zielproxy. Das Load-Balancing-Schema ist auf INTERNAL_SELF_MANAGED gesetzt, um anzugeben, dass diese Weiterleitungsregel von Traffic Director verwendet wird. Es muss eine globale Weiterleitungsregel sein. Die IP-Adresse wird auf 0.0.0.0 gesetzt, da ein proxyloser gRPC-Client den hostname:port im Ziel-URI auflöst. Dazu sendet er eine LDS-Anfrage an Traffic Director, anstatt eine DNS-Suche auszuführen. Weitere Informationen finden Sie unter Schema zur Namensauflösung.

Wenn im Ziel-URI kein Port angegeben ist, ist der Standardwert 80. Beispiel: Ein Ziel-URI xds:///foo.myservice:8080 stimmt mit einer Weiterleitungsregel überein, die mit Port 8080 konfiguriert ist. In diesem Beispiel wird die Weiterleitungsregel mit Port 80 konfiguriert.

gcloud

  • Erstellen Sie die Weiterleitungsregel:

    gcloud compute forwarding-rules create grpcwallet-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=0.0.0.0 \
       --address-region=us-central1 \
       --target-grpc-proxy=grpcwallet-proxy \
       --ports=80 \
       --network=default
    

Konfiguration prüfen

Wenn der Konfigurationsvorgang abgeschlossen ist, prüfen Sie, ob die von Ihnen konfigurierten Back-End-Dienste auf der Seite "Traffic Director" in der Google Cloud Console verfügbar sind. Prüfen Sie, ob die Back-End-Dienste und die zugehörigen Back-Ends als fehlerfrei gemeldet werden.

Routingkonfiguration prüfen

In diesem Abschnitt prüfen Sie, ob die Routingkonfiguration richtig funktioniert. Testen Sie die Konfiguration mit dem grpcurl-Tool.

gcloud

  1. Erstellen Sie eine Client-VM, auf der Sie die Clients ausführen, um den Dienst zu testen. Sie können optional das Flag --network-interface=no-address einfügen.

    gcloud compute instances create grpc-wallet-client \
        --zone=us-central1-a \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --metadata-from-file=startup-script=<(echo '#! /bin/bash
    set -e
    export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json
    # Expose bootstrap variable to SSH connections
    echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh
    # Create the bootstrap file
    curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.11.0.tar.gz | tar -xz
    ./td-grpc-bootstrap-0.11.0/td-grpc-bootstrap | sudo tee $GRPC_XDS_BOOTSTRAP')
    
  2. Greifen Sie mit SSH auf die VM zu und führen Sie die folgenden Befehle aus, um die VM vorzubereiten:

    export EXAMPLES_VERSION=v1.0.x
    sudo apt-get update
    sudo apt-get install git -y
    
  3. Führen Sie folgende Befehle aus:

    git clone -b "${EXAMPLES_VERSION}" --single-branch --depth=1 \
       https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.6.1/grpcurl_1.6.1_linux_x86_64.tar.gz | tar -xz
    chmod +x grpcurl
    

Für den Zugriff auf die Dienste ohne Sidecar-Proxy muss der gRPC-Client das Namensauflösungsschema xds verwenden. Dieses Schema teilt der im Client verwendeten gRPC-Bibliothekmit, einen xDS-Server zur Auflösung des Hostnamens zu verwenden. Dazu ist eine Bootstrap-Konfiguration erforderlich.

Das Startskript im vorherigen Abschnitt legt die Umgebungsvariable GRPC_XDS_BOOTSTRAP fest und verwendet ein Hilfsskript, um die Bootstrap-Datei zu erstellen. Die Werte für TRAFFICDIRECTOR_GCP_PROJECT_NUMBER, TRAFFICDIRECTOR_NETWORK_NAME und die Zone in der erstellten Bootstrap-Datei werden vom Metadatenserver abgerufen, der diese Details zu Ihren Compute Engine-VM-Instanzen kennt. Sie können diese Werte mithilfe der Optionen -gcp-project-number und -vpc-network-name manuell im Hilfsskript angeben.

Konfiguration mit dem grpcurl-Tool prüfen

Führen Sie die folgenden Befehle in der SSH-Shell aus, um zu prüfen, ob die Dienste wallet-service, stats-service und account-service ausgeführt werden:

./grpcurl -plaintext xds:///account.grpcwallet.io list
./grpcurl -plaintext -d '{"token": "2bd806c9"}' xds:///account.grpcwallet.io grpc.examples.wallet.account.Account/GetUserInfo
./grpcurl -plaintext -H 'authorization:2bd806c9' -H 'membership:premium' xds:///stats.grpcwallet.io grpc.examples.wallet.stats.Stats/FetchPrice
./grpcurl -plaintext -H 'authorization:2bd806c9' -H 'membership:premium' -d '{"include_balance_per_address": true}' xds:///wallet.grpcwallet.io grpc.examples.wallet.Wallet/FetchBalance

Sie sehen die folgenden Ergebnisse:

grpc.examples.wallet.account.Account
grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection

{
  "name": "Alice",
  "membership": "PREMIUM"
}

{
  "price": "10295"
}

{
  "balance": "5089953"
}

Mit grpc-wallet-Clients prüfen

Prüfen Sie die Konfiguration anhand der folgenden sprachspezifischen Anleitungen. Die Befehle senden mehrere RPCs, teilweise mit zusätzlichen Metadaten, um zu zeigen, dass Anfragen anhand der Zuordnungsregeln aus der URL-Zuordnung an Back-End-Dienste weitergeleitet werden. Der Befehl gibt auch für jede Antwort den Back-End-Hostnamen aus, um zu zeigen, an welchen Back-End-Dienst die Anfrage weitergeleitet wurde.

Java

  1. Führen Sie folgenden Befehl aus, um den Dienst mit einem gRPC-Java-Client zu prüfen:

    sudo apt-get install -y openjdk-11-jdk-headless
    
  2. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/java
    ./gradlew installDist
    
    # This command calls 'FetchBalance' from 'wallet-service' in a loop,
    # to demonstrate that 'FetchBalance' gets responses from 'wallet-v1' (40%)
    # and 'wallet-v2' (60%).
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true
    
    # This command calls the streaming RPC 'WatchBalance' from 'wallet-service'.
    # The RPC path matches the service prefix, so all requests are
    # sent to 'wallet-v2'.
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true
    
    # This command calls 'WatchPrice' from 'stats-service'. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to 'stats-premium' and get faster responses. Alice's requests
    # always go to premium and Bob's go to regular.
    ./build/install/wallet/bin/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Bob
    ./build/install/wallet/bin/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Alice
    

Go

  1. Führen Sie folgenden Befehl aus, um den Dienst mit einem gRPC-Go-Client zu prüfen:

    sudo apt install -y golang
    
  2. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/go/wallet_client
    go build
    
    # This command calls 'FetchBalance' from 'wallet-service' in a loop,
    # to demonstrate that 'FetchBalance' gets responses from 'wallet-v1' (40%)
    # and 'wallet-v2' (60%).
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch
    
    # This command calls the streaming RPC 'WatchBalance' from 'wallet-service'.
    # The RPC path matches the service prefix, so all requests
    # are sent to 'wallet-v2'.
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch
    
    # This command calls 'WatchPrice' from 'stats-service'. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to 'stats-premium' and get faster responses. Alice's requests
    # always go to premium and Bob's go to regular.
    ./wallet_client price --stats_server="xds:///stats.grpcwallet.io" --watch --user=Bob
    ./wallet_client price --stats_server="xds:///stats.grpcwallet.io" --watch --user=Alice
    

C++

  1. Führen Sie folgenden Befehl aus, um den Dienst mit einem gRPC-C++-Client zu prüfen:

    sudo apt-get install -y build-essential
    
  2. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/cpp
    ../tools/bazel build :client
    
    # This command calls 'FetchBalance' from 'wallet-service' in a loop, to demonstrate that
    # 'FetchBalance' gets responses from 'wallet-v1' (40%) and 'wallet-v2' (60%).
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true
    
    # This command calls the streaming RPC 'WatchBalance'  from 'wallet-service'.
    # The RPC path matches the service prefix, so all requests are sent to 'wallet-v2'.
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true
    
    # This command calls 'WatchPrice' from 'stats-service'. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to 'stats-premium' and get faster responses. Alice's requests
    # always go to premium, and Bob's go to regular.
    ../bazel-bin/cpp/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Bob
    ../bazel-bin/cpp/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Alice
    

Zusätzliche erweiterte Optionen konfigurieren

In den folgenden Abschnitten können Sie zusätzliche erweiterte Optionen für das Routing von Traffic konfigurieren.

Schutzschaltung

Mit einer Schutzschaltung können Sie Fehlerschwellenwerte festlegen, damit Clientanfragen Ihre Back-Ends nicht überlasten. Wenn Anfragen ein von Ihnen festgelegtes Limit erreichen, sendet der Client keine weiteren Anfragen mehr und gibt Ihren Back-Ends Zeit, sich wiederherzustellen.

Schutzschaltungen verhindern Fehlerkaskaden. Anstatt ein Back-End zu überlasten, werden Fehler an den Client zurückgegeben. Dadurch kann ein Teil des Traffics verarbeitet werden, während parallel Zeit zum Lösen von Überlastungsproblemen bleibt. Beispielsweise können Zugriffsspitzen durch Erhöhen der Kapazität mithilfe von Autoscaling bewältigt werden.

Wenn Sie den Back-End-Dienst für stats-service erstellen, enthält das Skript create_service.sh die folgenden Zeilen in seiner Konfiguration:

circuitBreakers:
  maxRequests: 1

Diese Einstellung beschränkt Clients auf jeweils eine ausstehende Anfrage an stats-service. Da es nur einen wallet-v2-Dienst gibt, werden bei Ausführung von zwei gleichzeitigen WatchBalance-Vorgängen des Wallet-Clients Fehler bei der zweiten Instanz festgestellt.

Java

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob  2>/dev/null 1>/dev/null &
    
    sleep 10 # Wait a few seconds to allow the watch to begin.
    
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. Die Ausgabe sieht so aus:

    io.grpc.examples.wallet.Client run
    INFO: Will try to run balance
    io.grpc.examples.wallet.Client run
    WARNING: RPC failed: Status{code=INTERNAL, description=RPC to stats server failed: UNAVAILABLE: Cluster max concurrent requests limit exceeded, cause=null}
    
  3. Führen Sie den Befehl kill aus:

    kill %%
    

Go

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/go
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob 2> /dev/null 1> /dev/null &
    
    sleep 10 # Wait a few seconds to allow the watch to begin.
    
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
    
  2. Die Ausgabe sieht so aus:

    server host: error: no hostname
    failed to fetch balance: rpc error: code = Internal desc = RPC to stats server failed:
    UNAVAILABLE: Cluster max concurrent requests limit exceeded
    
  3. Führen Sie den Befehl kill aus:

    kill %%
    

C++

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob 2>/dev/null 1>/dev/null &
    
    sleep 10 # Wait a few seconds to allow the watch to begin.
    
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. Die Ausgabe sieht so aus:

    Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io, stats_server:
    localhost:18882, user: Bob, watch: 1 ,unary_watch: 0, observability_project: , route:
    14: Cluster max concurrent requests limit exceeded
    
  3. Führen Sie den Befehl kill aus:

    kill %%
    

Fault Injection

Fault Injection kann Fehler bei der Bearbeitung von Anfragen einbringen, um Störungen zu simulieren, einschließlich hoher Latenz, Dienstüberlastung, Dienstfehlern und Netzwerkpartitionierung. Diese Funktion ist hilfreich, um die Ausfallsicherheit eines Dienstes gegenüber simulierten Störungen zu testen.

Beim Erstellen der URL-Zuordnung haben Sie die Fehlerinjektion für wallet-service mit dem Header route=fault auf eine Rate von 50% festgelegt.

Verwenden Sie den Code in den folgenden Sprachen, um die Fault Injection zu demonstrieren.

Java

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
    
  2. Die Ausgabe sieht so aus:

    server host: grpcwallet-wallet-v2-mig-us-central1-zznc
    total balance: 10340491
    - address: 148de9c5, balance: 2549839
    - address: 2e7d2c03, balance: 7790652
    io.grpc.examples.wallet.Client run
    WARNING: RPC failed: Status{code=UNAVAILABLE, description=HTTP status code 503, cause=null}
    

Go

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/go
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob --route=fault
    
  2. Die Ausgabe sieht so aus:

     server host: grpcwallet-wallet-v1-mig-us-central1-bm1t_wallet-v1
     user: Bob, total grpc-coin balance: 10452589.
      - address: 2e7d2c03, balance: 7875108.
      - address: 148de9c5, balance: 2577481.
     failed to fetch balance: rpc error: code = Unavailable desc = RPC terminated due to fault injection
    

C++

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
    
  2. Die Ausgabe sieht so aus:

    Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io, stats_server:                 localhost:18882, user: Bob, watch: 0 ,unary_watch: 1, observability_project: , route: fault
    server host: grpcwallet-wallet-v2-mig-us-central1-1lm6
    user: Bob total grpc-coin balance: 10211908
     - address: 148de9c5, balance: 2518132
     - address: 2e7d2c03, balance: 7693776
    14: Fault injected
    

Maximale Streamdauer

Mit der maximalen Streamdauer kann ein maximales Zeitlimit auf alle RPCs angewendet werden. Dadurch wird verhindert, dass Clients, die vergessen haben, eine Frist festzulegen, oder eine übermäßige Frist festlegen, keine Serverressourcen verschwenden.

Wenn Sie die URL-Zuordnung zuvor erstellt haben, legen Sie eine maximale Streamdauer von 5 Sekunden für RPCs an wallet-service mit dem Header route=timeout fest.

Zur Veranschaulichung von Zeitüberschreitungen beenden wir zuerst den wallet-v2-Dienst.

gcloud

gcloud compute instance-groups managed resize \
    --size=0 grpcwallet-wallet-v2-mig-us-central1 \
    --zone=us-central1-a

Ein normaler watch-Befehl würde endlos hängen, da es keinen Back-End-Dienst zur Verarbeitung gibt und die Anwendung keine Frist festlegt.

Java

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. Der Befehl reagiert nicht mehr. Drücken Sie ^C, um den Befehl zu unterbrechen.

Go

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/go
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
    
  2. Der Befehl reagiert nicht mehr. Drücken Sie ^C, um den Befehl zu unterbrechen.

C++

  1. Führen Sie folgende Befehle aus:

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. Der Befehl reagiert nicht mehr. Drücken Sie ^C, um den Befehl zu unterbrechen.

Wenn Sie die Route timeout verwenden, schlägt "watch" aufgrund der Einstellung maxStreamDuration jedoch nach fünf Sekunden fehl:

Java

  1. Führen Sie dazu diesen Befehl aus:

    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
    
  2. Die Ausgabe sieht so aus:

    io.grpc.examples.wallet.Client run
    WARNING: RPC failed: Status{code=DEADLINE_EXCEEDED, description=deadline exceeded after 4.999594070s.         [wait_for_ready, buffered_nanos=5000553401, waiting_for_connection], cause=null}
    

Go

  1. Führen Sie dazu diesen Befehl aus:

    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob --route=timeout
    
  2. Die Ausgabe sieht so aus:

    failed to create stream: rpc error: code = DeadlineExceeded desc = context deadline exceeded.
    

C++

  1. Führen Sie dazu diesen Befehl aus:

    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
    
  2. Die Ausgabe sieht so aus:

    Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io, stats_server:
    localhost:18882, user: Bob, watch: 1 ,unary_watch: 0, observability_project: , route: timeout
    4: Deadline Exceeded
    

Ressourcen bereinigen

Führen Sie zum Bereinigen der Ressourcen den folgenden Befehl in Ihrem lokalen System aus:

traffic-director-grpc-examples/scripts/cleanup.sh

Nächste Schritte