Configurer la gestion avancée du trafic avec des services gRPC sans proxy
Cette configuration est compatible avec les clients Preview, mais nous ne la recommandons pas aux nouveaux utilisateurs de Cloud Service Mesh. Pour en savoir plus, consultez les Présentation du routage du service Cloud Service Mesh
Ce document fournit des instructions pour configurer Cloud Service Mesh avec les fonctionnalités de gestion du trafic suivantes:
- Mise en correspondance des routes
- Répartition du trafic
- Ruptures de circuit
- Injection de pannes
- Durée maximale du flux
- Réessayer
- Affinité de session
- Détection des anomalies
- Équilibrage de charge de zone
Bien que ce document se concentre sur la configuration de la gestion avancée du trafic avec gRPC sans proxy sur Compute Engine, la gestion avancée du trafic est également disponible lorsque vous utilisez gRPC sans proxy sur Google Kubernetes Engine (GKE).
Avant de commencer
Avant de configurer la gestion avancée du trafic, passez en revue les exigences dans Préparez-vous à configurer Cloud Service Mesh avec des services gRPC sans proxy. Vous ne pouvez configurer la gestion avancée du trafic que si toutes les conditions préalables sont remplies.
Pour obtenir des informations conceptuelles sur ces fonctionnalités, consultez la page sur la gestion avancée du trafic.
À propos de l'exemple de portefeuille gRPC
Pour illustrer ces fonctionnalités, vous devez déployer un exemple de portefeuille gRPC. Dans cet exemple, trois services gRPC, grpc.examples.wallet.Wallet
, grpc.examples.wallet.stats.Stats
et grpc.examples.wallet.account.Account
, sont déployés en tant qu'applications distinctes.
Comme le montre le schéma suivant, vous créez un client gRPC qui appelle le service Wallet
, pour obtenir le solde d'un compte, et le service Stats
pour obtenir la valeur d'une cryptomonnaie.
Le service Wallet
appelle les services Stats
et Account
pour calculer le solde. Le service Stats
appelle également le service Account
pour obtenir des informations sur l'utilisateur.
Dans cet exemple, vous déployez deux versions des implémentations de Wallet
et de Stats
pour illustrer le routage des requêtes en fonction des règles que vous configurez. Pour simuler la création et le déploiement de différentes versions d'un service, vous utilisez des options de serveur afin de modifier le comportement des binaires que vous compilez une seule fois.
- L'option
--port
spécifie le port d'écoute du service sur une instance de VM. - L'option
--hostname_suffix
spécifie une valeur ajoutée au nom d'hôte de l'instance de VM qui répond à une requête. La valeur obtenue est ajoutée en tant que métadonnéeshostname
dans la réponse. Cela vous permet d'identifier, au sein d'un groupe d'instances, l'instance qui a répondu à la requête du client. - L'option
--premium_only
avec la valeurtrue
indique que le service est une version premium du servicestats
. - L'option
--v1_behavior
avec la valeurtrue
indique que le binaire du portefeuille se comporte comme une version v1.
Le tableau suivant indique les valeurs de ces options pour chaque instance de VM qui exécute l'un des services gRPC, le nombre d'instances dans un groupe d'instances et les services de backend auxquels ces groupes d'instances appartiennent.
Service backend | Groupe d'instances | Instances | Options de serveur |
---|---|---|---|
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-affinity
|
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"
|
Une fois ces services déployés, configurez Cloud Service Mesh pour acheminer les requêtes vers ces services de backend à partir d'un client de test, en fonction des règles de routage du tableau suivant. Le client se connecte au nom d'hôte virtuel d'un service, comme indiqué dans la colonne Hôte.
Hôte | Règles de correspondance | Action de routage |
---|---|---|
wallet.grpcwallet.io |
Préfixe de chemin d'accès : "/" En-tête présent : "session_id"
|
Routage vers wallet-v1-affinity |
Préfixe de chemin d'accès : "/" En-tête : {"route": "timeout"} |
Définition d'un délai d'expiration de cinq secondes et routage vers wallet-v2
|
|
Préfixe de chemin d'accès : "/" En-tête : {"route": "fault"} |
Échec de 50 % des requêtes et routage du reste vers wallet-v2
|
|
Préfixe de chemin d'accès : "/" En-tête : {"membership": "premium"} |
Routage vers wallet-v1 etjusqu'à trois nouvelles tentatives en cas d'échec |
|
Chemin complet : /grpc.examples.wallet.Wallet/FetchBalance |
Routage vers :wallet-v1 : 70 %wallet-v2 : 30 %
|
|
Par défaut | Routage vers wallet-v1 |
|
stats.grpcwallet.io |
Préfixe de chemin d'accès : "/" En-tête : {"membership": "premium"} |
Routage vers stats-premium |
Par défaut | Routage vers stats |
|
account.grpcwallet.io |
Préfixe de chemin d'accès : "/" En-tête : {"route": "account-fault"} |
Échec de 30 % des requêtes et routage du reste vers account
|
Par défaut | account |
Cet exemple utilise une répartition du trafic à 70/30 entre deux services existants. Si vous répartissez le trafic vers un nouveau service qui n'a pas encore été référencé par le mappage d'URL, ajoutez d'abord le nouveau service à weightedBackendServices
et attribuez-lui une pondération de 0
. Ensuite, augmentez progressivement la pondération attribuée à ce service.
Le client de test dispose des options suivantes qui vous permettent de générer des requêtes appropriées pour démontrer les fonctionnalités de gestion du trafic.
Option | Description |
---|---|
--watch=true |
Appeler des méthodes de streaming pour surveiller le solde/la valeur |
--unary_watch=true |
Appeler des méthodes unaires de manière répétée pour surveiller le solde ou la valeur |
--user=Alice |
Injecter l'en-tête {"membership": "premium"} |
--user=Bob |
Injecter l'en-tête {"membership": "normal"} |
--route=value |
Injecter l'en-tête {"route": "value"} |
--affinity=true |
Injecter l'en-tête {"session_id": "value"} |
Préparer votre environnement local
Pour configurer l'environnement local pour ces exemples, exécutez les commandes suivantes :
Mettez à jour le binaire
gcloud
pour vous assurer que vous disposez de la dernière version :gcloud components update
Téléchargez le dépôt d'exemples :
sudo apt-get install git -y
Clonez le dépôt approprié pour l'exemple :
export EXAMPLES_VERSION=v1.1.x git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \ https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
Créer et configurer des instances Cloud Router
Dans cette section, vous allez créer des instances Cloud Router dans chaque région et les configurer pour Cloud NAT. Les VM créées dans cet exemple n'ont pas d'adresses IP externes, mais elles doivent avoir accès à Internet. La configuration de Cloud Router avec Cloud NAT fournit l'accès requis.
gcloud
Créez les instances Cloud Router. :
gcloud compute routers create nat-router-us-central1 \ --network=default \ --region=us-central1
Configurez les routeurs pour 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
Créer la vérification de l'état et la règle de pare-feu gRPC
Dans cette section, vous allez créer une vérification de l'état gRPC et une règle de pare-feu pour permettre aux requêtes de vérification d'état gRPC d'atteindre votre réseau. La vérification de l'état gRPC sera ensuite associée aux services de backend, afin qu'elle puisse vérifier l'état des instances backend de ces services de backend.
gcloud
Créez la vérification d'état :
gcloud compute health-checks create grpc grpcwallet-health-check \ --use-serving-port
Créez la règle de pare-feu pour la vérification de l'état :
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
Créer le modèle d'instance
Dans cette section, vous créez un modèle d'instance pour déployer le service gRPC account
exposé sur le port 50053
.
gcloud
Créez le modèle d'instance :
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 pushd \$(mktemp -d) sudo apt-get install -y wget git wget https://dl.google.com/go/go1.16.5.linux-amd64.tar.gz sudo tar -C /usr/local -xvf go1.16.5.linux-amd64.tar.gz sudo cp /usr/local/go/bin/go /usr/bin/go popd 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")
Créer le groupe d'instances géré
Les groupes d'instances gérés (MIG) utilisent l'autoscaling pour créer des instances de VM en fonction des besoins. Dans cette section, vous créez un MIG à l'aide du modèle d'instance que vous avez créé à la section précédente.
gcloud
Créez le groupe d'instances :
gcloud compute instance-groups managed create grpcwallet-account-mig-us-central1 \ --zone=us-central1-a \ --size=2 \ --template=grpcwallet-account-template
Configurer le port nommé
Dans cette section, vous configurez le port nommé pour le service gRPC. Le port nommé est le port sur lequel le service gRPC écoute les requêtes. Dans cet exemple, le port nommé est le port 50053
.
gcloud
Créez le port nommé :
gcloud compute instance-groups set-named-ports grpcwallet-account-mig-us-central1 \ --named-ports=grpcwallet-account-port:50053 \ --zone=us-central1-a
Créez le service de backend :
Dans cette section, vous allez créer un service de backend global avec un schéma d'équilibrage de charge INTERNAL_SELF_MANAGED
et le protocole GRPC
.
Vous allez ensuite associer la vérification d'état et le groupe d'instances au service de backend.
Dans cet exemple, vous utilisez le MIG que vous avez créé dans la section Créer le groupe d'instances géré. Ce MIG exécute le service gRPC account
. Le port correspondant à l'option --port-name
est le port nommé que vous avez créé dans Configurer le port nommé.
gcloud
Créez le service de backend et associez la vérification de l'état au nouveau service de backend :
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
Ajoutez le groupe d'instances géré en tant que backend :
gcloud compute backend-services add-backend grpcwallet-account-service \ --instance-group=grpcwallet-account-mig-us-central1 \ --instance-group-zone=us-central1-a \ --global
La procédure de création des services de backend restants utilisés dans l'exemple de portefeuille gRPC est semblable à celle décrite ci-dessus. Pour créer les services restants, exécutez un script shell. Le script déploie les services de backend suivants :
stats
stats-premium
wallet-v1
wallet-v1-affinity
wallet-v2
Exécutez le script shell qui crée les services de backend supplémentaires :
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' # This command creates wallet-v1 and wallet-v1-affinity backend services. 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"'
Créer les règles de routage
Dans cette section, vous allez créer un mappage d'URL qui servira à illustrer diverses fonctionnalités de gestion du trafic. Le mappage d'URL spécifie les noms d'hôte virtuels des services de cet exemple, et les règles de routage associées. Pour plus d'informations, consultez la page sur les cartes des règles de routage.
Dans le mappage d'URL, hostRules
spécifie les noms d'hôte virtuel des services de l'exemple. Il s'agit des noms qu'un client utilise dans l'URI du canal pour se connecter à un service spécifique. Par exemple, pour envoyer une requête au service account
, un client utilise xds:///account.grpcwallet.io
dans l'URI du canal. Dans le fichier hostRules
, configurez une entrée hosts
avec la valeur account.grpcwallet.io
.
Le paramètre pathMatcher
associé à une entrée hosts
spécifie le nom de la ressource pathMatcher
contenant toutes les règles de routage de cet hôte virtuel. Une configuration pathMatcher
se compose de règles de correspondance et de règles d'action correspondantes, comme décrit dans la section À propos de l'exemple de portefeuille gRPC.
gcloud
Créez le mappage d'URL :
export PROJECT_ID=$(gcloud config list --format 'value(core.project)') export BS_PREFIX=projects/$PROJECT_ID/global/backendServices/grpcwallet gcloud compute url-maps import grpcwallet-url-map << EOF name: grpcwallet-url-map defaultService: $BS_PREFIX-account-service 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: - name: grpcwallet-account-path-matcher defaultService: $BS_PREFIX-account-service routeRules: - matchRules: - prefixMatch: / headerMatches: - headerName: route exactMatch: account-fault priority: 0 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-account-service weight: 100 faultInjectionPolicy: abort: httpStatus: 503 percentage: 30 - name: grpcwallet-stats-path-matcher defaultService: $BS_PREFIX-stats-service routeRules: - matchRules: - prefixMatch: / headerMatches: - headerName: membership exactMatch: premium priority: 0 service: $BS_PREFIX-stats-premium-service - name: grpcwallet-wallet-path-matcher defaultService: $BS_PREFIX-wallet-v1-service routeRules: - matchRules: - prefixMatch: / headerMatches: - headerName: session_id presentMatch: true priority: 0 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-wallet-v1-affinity-service weight: 100 - matchRules: - prefixMatch: / headerMatches: - headerName: route exactMatch: timeout priority: 1 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-wallet-v2-service weight: 100 maxStreamDuration: seconds: 5 - matchRules: - prefixMatch: / headerMatches: - headerName: route exactMatch: fault priority: 2 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-wallet-v2-service weight: 100 faultInjectionPolicy: abort: httpStatus: 503 percentage: 50 - matchRules: - prefixMatch: / headerMatches: - headerName: membership exactMatch: premium priority: 3 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-wallet-v1-service weight: 100 retryPolicy: retryConditions: - unavailable numRetries: 3 - matchRules: - fullPathMatch: /grpc.examples.wallet.Wallet/FetchBalance priority: 4 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-wallet-v1-service weight: 70 - backendService: $BS_PREFIX-wallet-v2-service weight: 30 - matchRules: - prefixMatch: /grpc.examples.wallet.Wallet/ priority: 5 routeAction: weightedBackendServices: - backendService: $BS_PREFIX-wallet-v2-service weight: 100 EOF
Créer le proxy cible et la règle de transfert
Dans cette section, vous créez le proxy gRPC cible et une règle de transfert.
Le proxy gRPC cible référence le mappage d'URL que vous avez créé à l'étape précédente.
L'option --validate-for-proxyless
active les vérifications de configuration afin de ne pas activer accidentellement une fonctionnalité qui n'est pas compatible avec les déploiements gRPC sans proxy.
gcloud
Créez le proxy gRPC cible :
gcloud compute target-grpc-proxies create grpcwallet-proxy \ --url-map=grpcwallet-url-map \ --validate-for-proxyless
La règle de transfert fait référence au proxy gRPC cible que vous avez créé. Le schéma d'équilibrage de charge est défini sur INTERNAL_SELF_MANAGED
pour indiquer que cette règle de transfert est utilisée par Cloud Service Mesh. Il doit s'agir d'une règle de transfert globale. L'adresse IP est définie sur 0.0.0.0
, car un client gRPC sans proxy résout le hostname:port
dans l'URI cible en envoyant une requête LDS à Cloud Service Mesh au lieu d'effectuer une résolution DNS. Pour en savoir plus, consultez la section Schéma de résolution des noms.
Lorsqu'il n'y a pas de port spécifié dans l'URI cible, la valeur par défaut est 80
. Par exemple, un URI cible xds:///foo.myservice:8080
correspond à une règle de transfert configurée avec le port 8080
. Dans cet exemple, la règle de transfert est configurée avec le port 80
.
gcloud
Créez la règle de transfert :
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
Vérifier la configuration
Une fois le processus de configuration terminé, vérifiez que les services de backend que vous avez configurés sont disponibles en consultant la page Cloud Service Mesh dans la console Google Cloud. Vérifiez que les services de backend et les backends associés sont signalés comme étant opérationnels. L'actualisation de l'état peut prendre plusieurs minutes.
Vérifier la configuration du routage
Dans cette section, vous vérifiez que la configuration de routage fonctionne correctement.
Utilisez l'outil grpcurl
pour tester la configuration.
gcloud
Créez une VM cliente sur laquelle vous exécutez les clients pour tester le service. Vous pouvez également inclure l'option
--network-interface=no-address
.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.16.0.tar.gz | tar -xz ./td-grpc-bootstrap-0.16.0/td-grpc-bootstrap | sudo tee $GRPC_XDS_BOOTSTRAP')
Accédez à la VM via SSH et exécutez les commandes suivantes pour la préparer :
export EXAMPLES_VERSION=v1.1.x sudo apt-get update sudo apt-get install git -y
Exécutez les commandes suivantes :
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
Pour accéder aux services sans proxy side-car, le client gRPC doit utiliser le schéma de résolution de noms xds
. Ce schéma indique à la bibliothèque gRPC utilisée dans le client qu'elle doit utiliser un serveur xDS pour résoudre le nom d'hôte. Pour ce faire, une configuration d'amorçage est nécessaire.
Le script de démarrage de la section précédente définit la variable d'environnement GRPC_XDS_BOOTSTRAP
et utilise un script d'aide pour générer le fichier d'amorçage. Les valeurs de TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
, TRAFFICDIRECTOR_NETWORK_NAME
et de la zone du fichier d'amorçage généré sont obtenues auprès du serveur de métadonnées qui connaissent ces détails sur vos instances de VM Compute Engine. Vous pouvez fournir manuellement ces valeurs au script d'aide en utilisant les options -gcp-project-number
et -vpc-network-name
.
Vérifier la configuration à l'aide de l'outil grpcurl
Exécutez les commandes suivantes dans l'interface système SSH pour vérifier que les services wallet-service
, stats-service
et account-service
sont en cours d'exécution :
./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
Les résultats suivants s'affichent :
grpc.examples.wallet.account.Account grpc.health.v1.Health grpc.reflection.v1alpha.ServerReflection { "name": "Alice", "membership": "PREMIUM" } { "price": "10295" } { "balance": "5089953" }
Vérifier avec les clients grpc-wallet
Suivez les instructions par langage ci-dessous pour vérifier la configuration. Les commandes envoient plusieurs RPC, certains avec des métadonnées supplémentaires, pour indiquer que les requêtes sont acheminées vers des services de backend en fonction des règles de correspondance du mappage d'URL. La commande imprime également le nom d'hôte de l'instance de VM pour chaque réponse, afin d'afficher l'instance de VM vers laquelle la requête a été acheminée.
Java
Pour vérifier le service avec un client Java gRPC, exécutez la commande suivante :
sudo apt-get install -y openjdk-11-jdk-headless
Exécutez les commandes suivantes :
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' (70%) # and 'wallet-v2' (30%). ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob # 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 --user=Bob # 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
Pour vérifier le service avec un client Go gRPC, installez golang ou suivez les instructions officielles :
sudo apt-get install -y wget wget https://dl.google.com/go/go1.16.5.linux-amd64.tar.gz sudo tar -C /usr/local -xvf go1.16.5.linux-amd64.tar.gz sudo ln -s /usr/local/go/bin/go /usr/bin/go
Exécutez les commandes suivantes :
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' (70%) # and 'wallet-v2' (30%). ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob # 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 --user=Bob # 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++
Pour vérifier le service avec un client gRPC C++, exécutez la commande suivante :
sudo apt-get install -y build-essential
Exécutez les commandes suivantes :
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' (70%) # and 'wallet-v2' (30%). ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob # 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 --user=Bob # 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
Configurer d'autres options avancées
Vous pouvez configurer d'autres options avancées de routage du trafic en suivant les instructions des sections suivantes.
Ruptures de circuit
La rupture de circuit vous permet de définir des seuils de défaillance pour empêcher les requêtes client de surcharger vos services de backend. Une fois que le nombre de requêtes en attente atteint une limite que vous avez définie, le client arrête d'envoyer des requêtes supplémentaires, ce qui laisse le temps à vos services de backend de revenir à l'état normal de fonctionnement.
La rupture de circuit évite les défaillances en cascade en renvoyant une erreur au client plutôt que de surcharger un service de backend. Cela permet de diffuser du trafic tout en gérant la situation de surcharge. Ce fonctionnement est comparable à la gestion d'un pic de trafic via l'augmentation de la capacité (par le biais de l'autoscaling).
Lorsque vous créez le service de backend pour le service stats-service
, le script create_service.sh
inclut les lignes suivantes dans sa configuration :
circuitBreakers: maxRequests: 1
Ce paramètre limite les clients à une requête en attente à la fois sur le service stats-service
. Étant donné qu'il n'y a qu'un seul service wallet-v2
, l'exécution simultanée de deux opérations WatchBalance
de client de portefeuille présente des défaillances en provenance de la deuxième instance.
Java
Exécutez les commandes suivantes :
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
La sortie ressemble à ceci :
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}
Exécutez la commande
kill
:kill %%
Go
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/go/wallet_client ./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
La sortie ressemble à ceci :
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
Exécutez la commande
kill
:kill %%
C++
Exécutez les commandes suivantes :
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
La sortie ressemble à ceci :
Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io, stats_server: localhost:18882, user: Bob, watch: 1 ,unary_watch: 0, observability_project: , route: 13: RPC to stats server failed: UNAVAILABLE: Cluster max concurrent requests limit exceeded
Exécutez la commande
kill
:kill %%
Injection de pannes
L'injection de pannes introduit des erreurs lors du traitement de requêtes afin de simuler des pannes, y compris une latence élevée, une surcharge du service, des défaillances du service et un partitionnement du réseau. Cette fonctionnalité est utile pour tester la résilience d'un service aux pannes simulées.
Lorsque vous avez créé le mappage d'URL précédemment, vous avez défini la règle d'injection de pannes sur 50 % des RPC envoyés à wallet.grpcwallet.io
avec l'en-tête route=fault
.
Pour démontrer l'injection de pannes, utilisez le code dans les langages suivants.
Java
Exécutez les commandes suivantes :
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
La sortie ressemble à ceci :
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=RPC terminated due to fault injection: HTTP status code 503, cause=null}
Go
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob --route=fault
La sortie ressemble à ceci :
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++
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
La sortie ressemble à ceci :
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
Durée maximale du flux
La durée maximale du flux permet d'appliquer un délai maximal à tous les RPC. Vous évitez ainsi les cas où les clients oublient de définir un délai ou définissent un délai excessif, ce qui consomme inutilement les ressources du serveur.
Lorsque vous avez créé le mappage d'URL ci-dessus, vous avez défini une durée maximale de flux de cinq secondes pour les RPC envoyés à wallet.grpcwallet.io
avec l'en-tête route=timeout
.
Pour démontrer l'expiration de délai, nous devons d'abord arrêter le service wallet-v2
.
gcloud
gcloud compute instance-groups managed resize \ --size=0 grpcwallet-wallet-v2-mig-us-central1 \ --zone=us-central1-a
La commande suivante serait bloquée indéfiniment, car il n'existe aucun service de backend à même de la gérer et l'application ne définit aucun délai.
Java
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
La commande cesse de répondre. Appuyez sur ^C pour interrompre la commande.
Go
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
La commande cesse de répondre. Appuyez sur ^C pour interrompre la commande.
C++
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
La commande cesse de répondre. Appuyez sur ^C pour interrompre la commande.
Cependant, la commande suivante qui utilise la route timeout
échoue après cinq secondes en raison du paramètre maxStreamDuration
.
Java
Exécutez la commande suivante :
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
La sortie ressemble à ceci :
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
Exécutez la commande suivante :
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob --route=timeout
La sortie ressemble à ceci :
failed to create stream: rpc error: code = DeadlineExceeded desc = context deadline exceeded.
C++
Exécutez la commande suivante :
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
La sortie ressemble à ceci :
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
Redémarrez le service wallet-v2
.
gcloud
gcloud compute instance-groups managed resize \ --size=1 grpcwallet-wallet-v2-mig-us-central1 \ --zone=us-central1-a
Réessayer
Les nouvelles tentatives vous aident à améliorer la disponibilité des services en permettant à vos applications gRPC de relancer les requêtes sortantes en fonction d'une stratégie de nouvelle tentative. Dans une stratégie de nouvelle tentative, vous pouvez configurer les conditions dans lesquelles une requête échouée doit être relancée et le nombre maximal de nouvelles tentatives, par exemple lorsqu'une requête échoue avec un code de réponse particulier.
Lorsque vous avez créé le mappage d'URL précédemment, vous avez défini une stratégie de nouvelle tentative pour les RPC sur la méthode FetchBalance
avec l'en-tête membership=premium
. Cette stratégie relance jusqu'à trois fois les RPC qui échouent avec le code d'état unavailable
. Vous avez également défini une règle d'injection de pannes pour les RPC sur account.grpcwallet.io
avec l'en-tête route=account-fault
, qui fait échouer 30 % des RPC du service Wallet
vers le service Account
. Par conséquent, 30 % des RPC du client de test avec l'en-tête membership=normal
vont échouer, alors que le taux d'échec pour les RPC avec l'en-tête membership=premium
est inférieur à 1 %.
Pour illustrer les nouvelles tentatives, utilisez le code dans les langages suivants.
Java
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/java # 30% of the requests fail because Bob is a normal user. ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=account-fault # Less than 1% of the requests fail because Alice is a premium user. ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --route=account-fault
Go
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/go/wallet_client # 30% of the requests fail because Bob is a normal user. ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=account-fault # Less than 1% of the requests fail because Alice is a premium user. ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --route=account-fault
C++
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/cpp # 30% of the requests fail because Bob is a normal user. ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=account-fault # Less than 1% of the requests fail because Alice is a premium user. ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --route=account-fault
Affinité de session
L'affinité de session consiste en une tentative la plus optimale possible d'envoi de requêtes ayant des caractéristiques particulières (en-têtes HTTP) à la même instance, tant que celle-ci est opérationnelle et qu'elle dispose d'une capacité suffisante. Cela s'avère utile pour les serveurs d'applications avec état qui bénéficient de performances et d'une efficacité améliorées lorsque les requêtes d'un client particulier sont envoyées à la même instance, plutôt que d'effectuer par exemple une distribution round-robin vers différentes instances.
Lorsque vous avez créé le service de backend grpcwallet-wallet-v1-affinity-service
, dans le script create_service.sh
, localityLbPolicy
a été défini sur ROUND_ROBIN
. Dans cet exemple, vous allez appliquer la configuration suivante pour définir localityLbPolicy
sur RING_HASH
.
sessionAffinity: HEADER_FIELD localityLbPolicy: RING_HASH consistentHash: httpHeaderName: "session_id"
gcloud
Enregistrez la configuration du service de backend
grpcwallet-wallet-v1-affinity-service
:gcloud compute backend-services export grpcwallet-wallet-v1-affinity-service \ --destination=bs_config.yaml \ --global
Mettez à jour le service de backend
grpcwallet-wallet-v1-affinity-service
:project_id="$(gcloud config list --format 'value(core.project)')" backend_config=" backends: - balancingMode: UTILIZATION capacityScaler: 1.0 group: projects/${project_id}/zones/us-central1-a/instanceGroups/grpcwallet-wallet-v1-mig-us-central1 connectionDraining: drainingTimeoutSec: 0 healthChecks: - projects/${project_id}/global/healthChecks/grpcwallet-health-check loadBalancingScheme: INTERNAL_SELF_MANAGED name: grpcwallet-wallet-v1-affinity-service portName: grpcwallet-wallet-port protocol: GRPC sessionAffinity: HEADER_FIELD localityLbPolicy: RING_HASH consistentHash: httpHeaderName: session_id" gcloud compute backend-services import grpcwallet-wallet-v1-affinity-service --global <<< "${backend_config}"
Pour démontrer l'affinité de session, utilisez le code dans les langages suivants. Avec l'option --affinity=true
, le client insère un en-tête session-id
avec une valeur unique pour chaque utilisateur. Un hachage de cette valeur est utilisé pour envoyer la requête à une instance particulière du groupe d'instances du service de backend grpcwallet-wallet-v1-affinity-service
.
Java
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/java # Without affinity, requests are sent to both instances. ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice # With affinity, requests are sent to only one instance. ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --affinity=true
Go
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/go/wallet_client # Without affinity, requests are sent to both instances. ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice # With affinity, requests are sent to only one instance. ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --affinity=true
C++
Exécutez les commandes suivantes :
cd ~/traffic-director-grpc-examples/cpp # Without affinity, requests are sent to both instances. ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice # With affinity, requests are sent to only one instance. ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --affinity=true
Restaurez la configuration du service de backend grpcwallet-wallet-v1-affinity-service
.
gcloud
gcloud compute backend-services import grpcwallet-wallet-v1-affinity-service \ --source=bs_config.yaml \ --global
Détection des anomalies
Pour améliorer la disponibilité du service, configurez la détection des anomalies. Cette fonctionnalité vous permet d'identifier et d'éjecter temporairement les hôtes défaillants du pool d'équilibrage de charge. Ces hôtes défaillants sont appelés anomalies.
gRPC évalue les hôtes en fonction du taux de réussite (la fréquence avec laquelle un hôte gère avec succès les requêtes. Le taux est affecté par les échecs tels que les erreurs gRPC, les erreurs HTTP, les délais avant expiration et d'autres problèmes.
Lorsque vous configurez la détection des valeurs aberrantes via Cloud Service Mesh, vous pouvez affiner la façon dont gRPC évalue les hôtes et gère les valeurs aberrantes. Par exemple, vous pouvez spécifier des critères tels que les suivants :
Nombre de requêtes qu'un hôte doit recevoir avant que gRPC ne l'analyse pour déterminer s'il s'agit d'une valeur aberrante.
Extent to which an host can deviate from the mean success rate before it's considered an outlier.
Le pourcentage maximal d'hôtes pouvant être exclus à tout moment du le pool d'équilibrage de charge.
Durée pendant laquelle une anomalie est exclue de l'équilibrage de charge d'un pool d'utilisateurs.
Pour en savoir plus sur les paramètres disponibles, consultez les
REST Resource: backendServices
référence. Il existe toutefois certaines limites pour gRPC, comme décrit dans le
dans la section suivante.
Limites
Les champs suivants ne sont pas acceptés pour les clients gRPC :
outlierDetection.consecutiveErrors
outlierDetection.enforcingConsecutiveErrors
outlierDetection.consecutiveGatewayFailure
outlierDetection.enforcingConsecutiveGatewayFailure
Configurer la détection des anomalies
La procédure suivante montre comment configurer la détection d'anomalies pour un service qui utilise un groupe d'instances comme backend. Cette procédure établit la configuration suivante :
- Une analyse de détection des anomalies s'exécute toutes les secondes. Vous configurez ce comportement à l'aide du champ
interval
. - Les anomalies sont exclues du pool d'équilibrage de charge par incréments de 30
secondes, comme suit:
- Si un hôte n'a jamais été exclu, il ne l'est que pendant 30 secondes secondes.
- Si un hôte a déjà été éjecté, le délai est augmenté de 30 secondes pour chaque éjection précédente. Par exemple, lorsqu'un hôte est éjecté pendant une troisième
il est éjecté pendant 90 secondes.
Vous configurez ce comportement à l'aide du champ
baseEjectionTime
.
- Un hôte est considéré comme non opérationnel si son taux de réussite est inférieur à la moyenne d'une déviation standard pendant l'intervalle de temps sélectionné (dans ce cas, une seconde). Vous configurez l'écart type maximal à l'aide du champ
successRateStdevFactor
.
Pour configurer la détection des anomalies de cette manière, procédez comme suit.
gcloud
Exporter le service de backend
grpcwallet-wallet-v2-service
de configuration Terraform à l'aide de la commande Commandegcloud compute backend-services export
:gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Dans le fichier
bs_config.yaml
, mettez à jour la configurationgrpcwallet-wallet-v2-service
pour inclure les champs de détection des valeurs aberrantes :outlierDetection: interval: seconds: 1 nanos: 0 baseEjectionTime: seconds: 30 nanos: 0 successRateStdevFactor: 1000
Importez le fichier mis à jour à l'aide de la méthode Commande
gcloud compute backend-services import
:gcloud compute backend-services import grpcwallet-wallet-v2-service \ --source=bs_config.yaml \ --global
Équilibrage de charge de la zone
Pour utiliser vos ressources de manière optimale, configurez l'équilibrage de charge de la zone. Cette fonctionnalité vous aide à préserver les ressources en les répartissant équitablement les requêtes client entre vos backends.
Lorsque vous configurez l'équilibrage de charge par localité, vous pouvez utiliser les options décrites dans le tableau suivant. Toutes les options nécessitent de configurer la ressource backendServices
.
Option | Disponible pour | Champ de configuration approprié |
---|---|---|
Utiliser une règle intégrée | Tous les clients gRPC | localityLbPolicy |
Utiliser une règle personnalisée | Les clients Java qui utilisent gRPC version 1.47 ou ultérieure, dans un maillage qui n'inclut que des clients gRPC | localityLbPolicies
|
Définir une liste de règles à privilégier | Clients Java qui utilisent gRPC version 1.47 ou ultérieure, dans un réseau maillé qui n'inclut que des clients gRPC | localityLbPolicies |
Vous pouvez combiner les options précédentes comme vous le souhaitez. Toutefois, si vous configurez à la fois localityLbPolicy
et localityLbPolicies
, gRPC tente d'abord d'utiliser votre configuration localityLbPolicies
.
Si vous ne configurez pas l'équilibrage de charge de localité, Cloud Service Mesh utilise le
Règle ROUND_ROBIN
.
Pour en savoir plus sur ROUND_ROBIN
et les autres règles intégrées, consultez les
description de localityLbPolicy
sur la
backendServices
.
Utiliser une stratégie intégrée
Si vous souhaitez que tous vos clients utilisent une seule règle intégrée, vous pouvez sélectionner
en configurant le champ localityLbPolicy
.
Lorsque vous configurez ce champ, vous avez le choix entre les règles suivantes :
LEAST_REQUEST
(clients Java uniquement)RING_HASH
ROUND_ROBIN
Si tous vos clients ne peuvent pas utiliser la même stratégie, consultez la section Définir une liste de stratégies préférées.
gcloud
Exporter la configuration du service de backend
grpcwallet-wallet-v2-service
à l'aide de la commandegcloud compute backend-services export
commande:gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Mettez à jour le fichier
bs_config.yaml
exporté pour inclure les lignes suivantes :localityLbPolicy: -- policy name: RING_HASH
Importez le fichier mis à jour à l'aide de la commande gcloud compute backend-services import commande:
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
Utiliser une règle personnalisée
Le cas échéant, vous pouvez utiliser une règle d'équilibrage de charge personnalisée que vous avez créée et déployée avec gRPC. Cette fonctionnalité est disponible pour les clients Java qui utilisent gRPC. version 1.47 ou ultérieure. Utilisez-la uniquement dans un maillage qui inclut tous les clients gRPC.
Lorsque vous créez une règle personnalisée, la documentation suivante peut vous être utile :
Pour perfectionner vos règles personnalisées, vous pouvez utiliser la fonction Open Request API ORCA (Cost Aggregation). Ces API vous permettent de capturer des métriques sur le coût des requêtes et l'utilisation des serveurs. L'utilisation de ces API nécessite gRPC version 1.48.1 ou ultérieure. Pour en savoir plus, consultez Exemple de gRPC ORCA.
Pour en savoir plus sur la manière dont les configurations personnalisées d'équilibrage de charge sont envoyé à gRPC par xDS, consultez Configuration de l'équilibreur de charge personnalisé gRPC xDS
Pour configurer Cloud Service Mesh pour qu'il utilise votre stratégie personnalisée, identifiez-la à l'aide du champ localityLbPolicies
.
La procédure suivante illustre ce processus. Dans cette procédure, vous mettez à jour la configuration du service de backend grpcwallet-wallet-v2-service
afin que les clients qui s'y connectent utilisent une règle personnalisée appelée example.ExampleLoadBalancer
.
gcloud
Exportez le fichier de configuration du service de backend
grpcwallet-wallet-v2-service
à l'aide de la commandegcloud compute backend-services export
:gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Mettez à jour le fichier
bs_config.yaml
exporté pour référencer la stratégieexample.ExampleLoadBalancer
. Incluez les lignes suivantes:localityLbPolicies: - customPolicy: name: example.ExampleLoadBalancer data: '{ "message": "Hello load-balancing world!" }'
Importez le fichier mis à jour à l'aide de la commande gcloud compute backend-services import :
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
Facultatif : Testez la configuration de l'équilibrage de charge :
Java
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
Si vous avez correctement configuré la règle d'équilibrage de charge personnalisée, le message inclus dans la configuration ("Bonjour tout le monde de l'équilibrage de charge !").
Définir une liste de règles préférées
Si plusieurs clients ne sont pas tous compatibles avec une seule stratégie d'équilibrage de charge, créez une liste des stratégies que vos clients peuvent utiliser. Avec cette option, si la première règle préférée ne peut pas être utilisée par un client particulier, gRPC utilise la règle suivante de la liste.
Lorsque vous créez une liste de règles préférées, les options valides incluent les éléments suivants :
les règles personnalisées ROUND_ROBIN
et, pour les clients Java, LEAST_REQUEST
. Vous pouvez lister jusqu'à 10 règles.
Cette fonctionnalité n'est disponible que pour les clients Java qui utilisent gRPC version 1.47 ou ultérieure. N'utilisez-le que dans un maillage qui inclut tous les clients gRPC.
gcloud
- Exportez le fichier de configuration du service de backend
grpcwallet-wallet-v2-service
à l'aide de la commandegcloud compute backend-services export
:
gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Mettez à jour le fichier
bs_config.yaml
exporté pour inclure le champlocalityLbPolicies
. Remplissez-le avec des entrées qui représentent les règles suivantes :- Règle personnalisée non valide (
example.InvalidLoadBalancer
) - Une règle personnalisée valide (
example.ExampleLoadBalancer
) - Une règle intégrée compatible (
LEAST_REQUEST
)
localityLbPolicies: - customPolicy: name: example.InvalidLoadBalancer data: '{ "message": "This load-balancing policy doesn't work!" }' - customPolicy: name: example.ExampleLoadBalancer data: '{ "message": "Hello load-balancing world!" }' - policy: name: LEAST_REQUEST
- Règle personnalisée non valide (
Importez le fichier mis à jour à l'aide de la commande gcloud compute backend-services import commande:
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
(Facultatif) Testez la configuration de l'équilibrage de charge :
Java
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
En réponse, gRPC tente de trouver
example.InvalidLoadBalancer
, mais échoue. Ensuite, il revient à l'utilisation deexample.ExampleLoadBalancer
, et le message que vous avez inclus dans la configuration ("Hello load-balancing world!") s'affiche. La journalisation gRPC sur le client comprend un message indiquant queexample.InvalidLoadBalancer
est introuvable.
Nettoyer les ressources
Pour nettoyer les ressources, exécutez la commande suivante à partir de votre système local :
traffic-director-grpc-examples/scripts/cleanup.sh
Bloquer le trafic entre les services
Si vous souhaitez bloquer le trafic entre le service A et le service B, et que votre déploiement se trouve sur GKE, configurez la sécurité du service et utilisez une règle d'autorisation pour bloquer le trafic entre les services. Pour obtenir des instructions complètes, consultez la page Sécurité du service Cloud Service Mesh et les instructions de configuration avec Envoy et gRPC sans proxy.
Étape suivante
- Pour vous aider à résoudre les problèmes de configuration de Cloud Service Mesh, consultez la page Résoudre les problèmes de déploiement qui utilisent gRPC sans proxy.