Configurar la gestión avanzada del tráfico con servicios de gRPC sin proxy
Esta configuración es compatible con los clientes de la versión preliminar, pero no la recomendamos para los nuevos usuarios de Cloud Service Mesh. Para obtener más información, consulta la información general sobre el enrutamiento de servicios de Cloud Service Mesh.
En este documento se proporcionan instrucciones para configurar Cloud Service Mesh con las siguientes funciones de gestión del tráfico:
- Coincidencia de ruta
- División del tráfico
- Interrupción de circuitos
- Inyección de fallos
- Duración máxima de la transmisión
- Reintentar
- Afinidad de sesión
- Detección de valores atípicos
- Balanceo de carga según la localidad
Aunque este documento se centra en la configuración de la gestión avanzada del tráfico con gRPC sin proxy en Compute Engine, también se admite la gestión avanzada del tráfico cuando se usa gRPC sin proxy en Google Kubernetes Engine (GKE).
Antes de empezar
Antes de configurar la gestión avanzada del tráfico, consulta los requisitos en Prepararse para configurar Cloud Service Mesh con servicios de gRPC sin proxy. No puedes configurar la gestión avanzada del tráfico a menos que se cumplan todos los requisitos.
Para obtener información conceptual sobre estas funciones, consulta Gestión avanzada del tráfico.
Acerca del ejemplo de gRPC Wallet
Para ilustrar estas funciones, implementa un ejemplo de Wallet de gRPC. En este ejemplo, hay tres servicios gRPC, grpc.examples.wallet.Wallet
, grpc.examples.wallet.stats.Stats
y grpc.examples.wallet.account.Account
, que se implementan como tres aplicaciones independientes.
Como se muestra en el siguiente diagrama, creas un cliente gRPC que llama al servicio Wallet
para obtener el saldo de una cuenta y llama al servicio Stats
para obtener el precio de una moneda.
El servicio Wallet
llama a los servicios Stats
y Account
para calcular el saldo. El servicio Stats
también llama al servicio Account
para obtener información del usuario.
En el ejemplo, se implementan dos versiones de Wallet
y Stats
para ilustrar el enrutamiento de solicitudes en función de las reglas que configure. Para simular la compilación y la implementación de diferentes versiones de un servicio, se usan marcas de servidor para cambiar el comportamiento de los archivos binarios que se compilan solo una vez.
- La marca
--port
especifica el puerto en el que escucha el servicio de una instancia de VM. - La marca
--hostname_suffix
especifica un valor que se añade al nombre de host de la instancia de VM que responde a una solicitud. El valor resultante se añade como metadatoshostname
en la respuesta. De esta forma, puedes identificar qué instancia de un grupo de instancias ha respondido a la solicitud del cliente. - La marca
--premium_only
con el valortrue
especifica que el servicio es una versión premium del serviciostats
. - La marca
--v1_behavior
con el valortrue
especifica que el archivo binario de la cartera se comporta como una versión 1.
En la siguiente tabla se muestran los valores de estas marcas para cada instancia de VM que ejecuta uno de los servicios gRPC, el número de instancias de un grupo de instancias y los servicios de backend a los que pertenecen estos grupos de instancias.
Servicio de backend | Grupo de instancias | Instancias | Marcas de servidor |
---|---|---|---|
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"
|
Una vez que hayas desplegado estos servicios, configura Cloud Service Mesh para enrutar las solicitudes a estos servicios backend desde un cliente de prueba, según las reglas de enrutamiento de la siguiente tabla. El cliente se conecta al nombre de host virtual de un servicio, como se muestra en la columna Host.
Host | Reglas de coincidencia | Acción de ruta |
---|---|---|
wallet.grpcwallet.io |
Prefijo de ruta: "/" Encabezado presente: "session_id"
|
Ruta para llegar a wallet-v1-affinity |
Prefijo de ruta: "/" Encabezado: {"route": "timeout"}
|
Establece un tiempo de espera de 5 segundos y ruta a wallet-v2
|
|
Prefijo de ruta: "/" Encabezado: {"route": "fault"}
|
Falla el 50% de las solicitudes y ruta el resto a wallet-v2
|
|
Prefijo de ruta: "/" Encabezado: {"membership": "premium"}
|
Dirigir a wallet-v1 yreintentar hasta 3 veces si falla |
|
Ruta completa: /grpc.examples.wallet.Wallet/FetchBalance |
Ruta a:wallet-v1 : 70%wallet-v2 : 30%
|
|
Predeterminado | Ruta para llegar a wallet-v1 |
|
stats.grpcwallet.io |
Prefijo de ruta: "/" Encabezado: {"membership": "premium"}
|
Ruta para llegar a stats-premium |
Predeterminado | Ruta para llegar a stats |
|
account.grpcwallet.io |
Prefijo de ruta: "/" Encabezado: {"route": "account-fault"}
|
Falla el 30% de las solicitudes y dirige el resto a account
|
Predeterminado | account |
En este ejemplo, se usa una división del tráfico del 70/30 entre dos servicios. Si vas a dividir el tráfico a un nuevo servicio al que no se ha hecho referencia en el mapa de URLs anteriormente, primero añade el nuevo servicio a weightedBackendServices
y
dale un peso de 0
. Después, aumenta gradualmente el peso asignado a ese servicio.
El cliente de prueba tiene las siguientes opciones que te permiten generar solicitudes adecuadas para demostrar las funciones de gestión del tráfico.
Opción | Descripción |
---|---|
--watch=true |
Métodos de streaming de llamadas para ver el saldo o el precio |
--unary_watch=true |
Llamar a métodos unarios repetidamente para monitorizar el saldo o el precio |
--user=Alice |
Inyectar encabezado {"membership": "premium"} |
--user=Bob |
Inyectar encabezado {"membership": "normal"} |
--route=value |
Inyectar encabezado {"route": "value"} |
--affinity=true |
Inyectar encabezado {"session_id": "value"} |
Preparar el entorno local
Para configurar el entorno local de estos ejemplos, ejecuta los siguientes comandos:
Actualiza el archivo binario
gcloud
para asegurarte de que tienes la versión más reciente:gcloud components update
Descarga el repositorio de ejemplos:
sudo apt-get install git -y
Clona el repositorio correcto para el ejemplo:
export EXAMPLES_VERSION=v1.1.x git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \ https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
Crear y configurar instancias de Cloud Router
En esta sección, creará instancias de Cloud Router en cada región y las configurará para Cloud NAT. Las VMs creadas en este ejemplo no tienen direcciones IP externas, pero necesitan tener acceso a Internet. Configurar Cloud Router con Cloud NAT proporciona el acceso necesario.
gcloud
Crea las instancias de Cloud Router:
gcloud compute routers create nat-router-us-central1 \ --network=default \ --region=us-central1
Configura los routers para 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
Crear la comprobación del estado de gRPC y la regla de cortafuegos
En esta sección, creará una comprobación del estado de gRPC y una regla de cortafuegos para permitir que las solicitudes de comprobación del estado de gRPC lleguen a su red. Más adelante, la comprobación de estado de gRPC se asocia a los servicios de backend para que pueda comprobar el estado de las instancias de backend de esos servicios.
gcloud
Crea la comprobación del estado:
gcloud compute health-checks create grpc grpcwallet-health-check \ --use-serving-port
Crea la regla de cortafuegos para la comprobación del estado:
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
Crea la plantilla de instancia
En esta sección, crearás una plantilla de instancia para desplegar el servicio account
gRPC
que se expone en el puerto 50053
.
gcloud
Crea la plantilla de instancia:
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")
Crear el grupo de instancias gestionado
Los grupos de instancias gestionados (MIGs) usan el autoescalado para crear nuevas instancias de VM según sea necesario. En esta sección, crearás un MIG usando la plantilla de instancia que creaste en la sección anterior.
gcloud
Crea el grupo de instancias:
gcloud compute instance-groups managed create grpcwallet-account-mig-us-central1 \ --zone=us-central1-a \ --size=2 \ --template=grpcwallet-account-template
Configurar el puerto con nombre
En esta sección, configurarás el puerto con nombre del servicio gRPC. El puerto con nombre es el puerto en el que el servicio gRPC escucha las solicitudes. En este ejemplo, el puerto con nombre es el puerto 50053
.
gcloud
Crea el puerto con nombre:
gcloud compute instance-groups set-named-ports grpcwallet-account-mig-us-central1 \ --named-ports=grpcwallet-account-port:50053 \ --zone=us-central1-a
Crea el servicio de backend
En esta sección, crearás un servicio de backend global con un esquema de balanceo de carga INTERNAL_SELF_MANAGED
y un protocolo GRPC
.
A continuación, asocia la comprobación del estado y el grupo de instancias al servicio de backend.
En este ejemplo, usarás el MIG que has creado en Crear el grupo de instancias gestionado. Este MIG ejecuta el servicio gRPC account
. El puerto de la marca --port-name
es el puerto con nombre que has creado en Configurar el puerto con nombre.
gcloud
Crea el servicio de backend y, a continuación, asocia la comprobación del estado al nuevo servicio 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
Añade el grupo de instancias gestionado como backend:
gcloud compute backend-services add-backend grpcwallet-account-service \ --instance-group=grpcwallet-account-mig-us-central1 \ --instance-group-zone=us-central1-a \ --global
Los pasos para crear los servicios de backend restantes que se usan en el ejemplo de cartera de gRPC son similares a los anteriores. Para crear los servicios restantes, ejecuta un script de shell. La secuencia de comandos implementa los siguientes servicios de backend:
stats
stats-premium
wallet-v1
wallet-v1-affinity
wallet-v2
Ejecuta la secuencia de comandos shell que crea los servicios de backend adicionales:
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"'
Crear las reglas de enrutamiento
En esta sección, creará un mapa de URLs que se usará para mostrar varias funciones de gestión del tráfico. El mapa de URLs especifica los nombres de host virtuales de los servicios de este ejemplo y las reglas de enrutamiento asociadas. Para obtener más información, consulta Mapas de reglas de enrutamiento.
En el mapa de URLs, las hostRules
especifican los nombres de host virtuales de los servicios del ejemplo. Estos son los nombres que usa un cliente en el URI del canal para conectarse a un servicio específico. Por ejemplo, para enviar una solicitud al servicio account
, un cliente usa xds:///account.grpcwallet.io
en el URI del canal. En hostRules
, configure una entrada hosts
con el valor
account.grpcwallet.io
.
El pathMatcher
asociado a una entrada hosts
especifica el nombre de un pathMatcher
que contiene todas las reglas de enrutamiento de ese host virtual. Una configuración de pathMatcher
consta de reglas de coincidencia y reglas de acción correspondientes, tal como se describe en Acerca del ejemplo de gRPC Wallet.
gcloud
Crea la asignación de URLs:
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
Crear el proxy de destino y la regla de reenvío
En esta sección, crearás el proxy gRPC de destino y una regla de reenvío.
El proxy gRPC de destino hace referencia al mapa de URLs que ha creado en el paso anterior.
La marca --validate-for-proxyless
habilita las comprobaciones de configuración para que no habilites por error una función que no sea compatible con las implementaciones de gRPC sin proxy.
gcloud
Crea el proxy gRPC de destino:
gcloud compute target-grpc-proxies create grpcwallet-proxy \ --url-map=grpcwallet-url-map \ --validate-for-proxyless
La regla de reenvío hace referencia al proxy gRPC de destino que has creado. El esquema de balanceo de carga se define como INTERNAL_SELF_MANAGED
para indicar que Cloud Service Mesh usa esta regla de reenvío. Debe ser una regla de reenvío global. La dirección IP se ha definido como 0.0.0.0
porque un cliente gRPC sin proxy resuelve hostname:port
en el URI de destino enviando una solicitud LDS a Cloud Service Mesh en lugar de hacer una búsqueda de DNS. Para obtener más información, consulta el artículo Esquema de resolución de nombres.
Si no se especifica ningún puerto en el URI de destino, el valor predeterminado es 80
. Por ejemplo, un URI de destino xds:///foo.myservice:8080
coincide con una regla de reenvío que se ha configurado con el puerto 8080
. En este ejemplo, la regla de reenvío se ha configurado con el puerto 80
.
gcloud
Crea la regla de reenvío:
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
Verificar la configuración
Cuando se complete el proceso de configuración, comprueba que los servicios backend que has configurado estén disponibles en la página Cloud Service Mesh de la consola Google Cloud . Confirma que los servicios de backend y los backends asociados se indican como correctos. Este proceso puede tardar varios minutos.
Verificar la configuración de enrutamiento
En esta sección, comprobarás que la configuración de enrutamiento funciona correctamente.
Utiliza la herramienta grpcurl
para probar la configuración.
gcloud
Crea una VM cliente en la que ejecutes los clientes para probar el servicio. También puedes incluir la marca
--network-interface=no-address
de forma opcional.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')
Accede a la VM mediante SSH y ejecuta los siguientes comandos para prepararla:
export EXAMPLES_VERSION=v1.1.x sudo apt-get update sudo apt-get install git -y
Ejecuta estos comandos:
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
Para acceder a los servicios sin un proxy sidecar, el cliente de gRPC debe usar el esquema de resolución de nombres xds
. Este esquema indica a la biblioteca gRPC utilizada en el cliente
que use un servidor xDS para resolver el nombre de host. Para ello, se necesita una configuración de arranque.
La secuencia de comandos de inicio de la sección anterior define la variable de entorno GRPC_XDS_BOOTSTRAP
y usa una secuencia de comandos auxiliar para generar el archivo de arranque. Los valores de TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
,
TRAFFICDIRECTOR_NETWORK_NAME
y la zona del archivo de arranque generado se obtienen del servidor de metadatos, que conoce estos detalles sobre tus instancias de VM de Compute Engine. Puedes proporcionar estos valores a la secuencia de comandos auxiliar manualmente mediante las opciones -gcp-project-number
y -vpc-network-name
.
Verificar la configuración con la herramienta grpcurl
Ejecuta los siguientes comandos en el shell SSH para verificar que wallet-service
, stats-service
y account-service
se están ejecutando:
./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
Verás los siguientes resultados:
grpc.examples.wallet.account.Account grpc.health.v1.Health grpc.reflection.v1alpha.ServerReflection { "name": "Alice", "membership": "PREMIUM" } { "price": "10295" } { "balance": "5089953" }
Verificar con clientes de grpc-wallet
Sigue las instrucciones específicas de cada idioma para verificar la configuración. Los comandos envían varias llamadas a procedimientos remotos, algunas con metadatos adicionales, para mostrar que las solicitudes se enrutan a los servicios de backend en función de las reglas coincidentes del mapa de URLs. El comando también imprime el nombre de host de la instancia de VM en cada respuesta para mostrar a qué instancia de VM se ha dirigido la solicitud.
Java
Para verificar el servicio con un cliente Java de gRPC, ejecuta lo siguiente:
sudo apt-get install -y openjdk-11-jdk-headless
Ejecuta estos comandos:
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
Para verificar el servicio con un cliente gRPC Go, instala Go o sigue las instrucciones oficiales:
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
Ejecuta estos comandos:
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++
Para verificar el servicio con un cliente gRPC C++, ejecuta lo siguiente:
sudo apt-get install -y build-essential
Ejecuta estos comandos:
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
Configurar opciones más avanzadas
Puedes configurar opciones avanzadas adicionales de enrutamiento del tráfico siguiendo las instrucciones de las secciones siguientes.
Interrupción de circuitos
La interrupción de circuitos te permite definir umbrales de errores para evitar que las solicitudes de los clientes sobrecarguen tus servicios backend. Cuando el número de solicitudes pendientes alcanza el límite que has definido, el cliente deja de enviar solicitudes adicionales, lo que da tiempo a tus servicios backend para recuperarse.
El interruptor evita que se produzcan fallos en cascada devolviendo un error al cliente en lugar de sobrecargar un servicio de backend. De esta forma, se puede atender parte del tráfico mientras se gestiona la situación de sobrecarga, por ejemplo, gestionando un pico de tráfico aumentando la capacidad mediante el escalado automático.
Cuando crees el servicio de backend para stats-service
, la secuencia de comandos create_service.sh
incluirá las siguientes líneas en su configuración:
circuitBreakers: maxRequests: 1
Este ajuste limita los clientes a una solicitud pendiente a la vez a la stats-service
. Como solo hay un servicio de wallet-v2
, si se ejecutan dos operaciones simultáneas del cliente de cartera WatchBalance
, se producirán errores en la segunda instancia.
Java
Ejecuta estos comandos:
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 salida tiene este aspecto:
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}
Ejecuta el comando
kill
:kill %%
Go
Ejecuta estos comandos:
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 salida tiene este aspecto:
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
Ejecuta el comando
kill
:kill %%
C++
Ejecuta estos comandos:
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 salida tiene este aspecto:
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
Ejecuta el comando
kill
:kill %%
Inyección de fallos
La inyección de errores introduce errores al atender solicitudes para simular fallos, como alta latencia, sobrecarga del servicio, fallos del servicio y partición de la red. Esta función es útil para probar la resiliencia de un servicio ante fallos simulados.
Cuando creaste el mapa de URLs anteriormente, definiste la política de inyección de errores para que fallara el 50% de las llamadas a procedimiento remoto enviadas a wallet.grpcwallet.io
con el encabezado route=fault
.
Para demostrar la inyección de errores, usa el código en los siguientes lenguajes.
Java
Ejecuta estos comandos:
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 salida tiene este aspecto:
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
Ejecuta estos comandos:
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob --route=fault
La salida tiene este aspecto:
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++
Ejecuta estos comandos:
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 salida tiene este aspecto:
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
Duración máxima de la transmisión
La duración máxima de la transmisión permite aplicar un tiempo de espera máximo a todas las llamadas a procedimientos remotos. De esta forma, se evita que los clientes que olvidan definir un plazo o que definen un plazo excesivo desperdicien recursos del servidor.
Cuando creaste el mapa de URLs anteriormente, definiste una duración máxima de la emisión de 5 segundos para las llamadas a procedimiento remoto enviadas a wallet.grpcwallet.io
con el encabezado route=timeout
.
Para mostrar los tiempos de espera, primero detenemos el servicio wallet-v2
.
gcloud
gcloud compute instance-groups managed resize \ --size=0 grpcwallet-wallet-v2-mig-us-central1 \ --zone=us-central1-a
El siguiente comando se quedaría bloqueado para siempre, ya que no hay ningún servicio backend que lo gestione y la aplicación no establece ningún plazo.
Java
Ejecuta estos comandos:
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
El comando deja de responder. Pulsa ^C para interrumpir el comando.
Go
Ejecuta estos comandos:
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
El comando deja de responder. Pulsa ^C para interrumpir el comando.
C++
Ejecuta estos comandos:
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
El comando deja de responder. Pulsa ^C para interrumpir el comando.
Sin embargo, el siguiente comando que usa la ruta timeout
falla después de 5 segundos debido al ajuste maxStreamDuration
.
Java
Ejecuta el siguiente comando:
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 salida tiene este aspecto:
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
Ejecuta el siguiente comando:
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob --route=timeout
La salida tiene este aspecto:
failed to create stream: rpc error: code = DeadlineExceeded desc = context deadline exceeded.
C++
Ejecuta el siguiente comando:
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
La salida tiene este aspecto:
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
Reinicia el servicio wallet-v2
.
gcloud
gcloud compute instance-groups managed resize \ --size=1 grpcwallet-wallet-v2-mig-us-central1 \ --zone=us-central1-a
Reintentar
Los reintentos te ayudan a mejorar la disponibilidad del servicio, ya que permiten que tus aplicaciones gRPC reintenten las solicitudes salientes según una política de reintentos. En una política de reintentos, puedes configurar las condiciones en las que se debe reintentar una solicitud fallida y el número máximo de intentos. Por ejemplo, cuando una solicitud falla con un código de respuesta concreto.
Cuando creaste el mapa de URLs, definiste una política de reintentos para las llamadas a procedimientos remotos (RPCs) en el método FetchBalance
con el encabezado membership=premium
. Esta política vuelve a intentar las llamadas RPC que fallan con el código de estado unavailable
hasta un máximo de 3 veces. También puedes definir una política de inyección de errores para las llamadas RPC a account.grpcwallet.io
con el encabezado route=account-fault
, que provoca un error en el 30% de las llamadas RPC del servicio Wallet
al servicio Account
. Como resultado, el 30% de las llamadas a procedimiento remoto del cliente de prueba con la cabecera
membership=normal
fallan, mientras que la tasa de errores de las llamadas a procedimiento remoto con la cabecera
membership=premium
es inferior al 1%.
Para mostrar cómo se reintenta, usa el código en los siguientes lenguajes.
Java
Ejecuta estos comandos:
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
Ejecuta estos comandos:
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++
Ejecuta estos comandos:
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
Afinidad de sesión
La afinidad de sesión intenta enviar solicitudes con características concretas (encabezados HTTP) a la misma instancia mientras la instancia esté en buen estado y tenga capacidad. Esto resulta útil para los servidores de aplicaciones con estado, que se benefician de un mejor rendimiento y eficiencia cuando las solicitudes de un cliente concreto se envían a la misma instancia en lugar de, por ejemplo, distribuirse de forma rotatoria a diferentes instancias.
Cuando creaste el servicio de backend grpcwallet-wallet-v1-affinity-service
, en la secuencia de comandos create_service.sh
, el localityLbPolicy
se definió como ROUND_ROBIN
. En este ejemplo, aplicarás la siguiente configuración para cambiar localityLbPolicy
a RING_HASH
.
sessionAffinity: HEADER_FIELD localityLbPolicy: RING_HASH consistentHash: httpHeaderName: "session_id"
gcloud
Guarda la configuración del servicio de backend
grpcwallet-wallet-v1-affinity-service
:gcloud compute backend-services export grpcwallet-wallet-v1-affinity-service \ --destination=bs_config.yaml \ --global
Actualiza el servicio 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}"
Para demostrar la afinidad de sesión, usa el código en los siguientes idiomas. Con la marca --affinity=true
, el cliente inserta un encabezado session-id
con un valor único para cada usuario. Se usa un hash de este valor para enviar la solicitud a una instancia concreta del grupo de instancias del servicio de backend grpcwallet-wallet-v1-affinity-service
.
Java
Ejecuta estos comandos:
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
Ejecuta estos comandos:
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++
Ejecuta estos comandos:
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
Restaura la configuración del servicio de backend grpcwallet-wallet-v1-affinity-service
.
gcloud
gcloud compute backend-services import grpcwallet-wallet-v1-affinity-service \ --source=bs_config.yaml \ --global
Detección de valores atípicos
Para mejorar la disponibilidad del servicio, configura la detección de valores atípicos. Esta función te permite identificar y expulsar temporalmente los hosts que no están en buen estado del grupo de balanceo de carga. Estos hosts no saludables se denominan valores atípicos.
gRPC evalúa los hosts en función de la tasa de éxito, es decir, la frecuencia con la que un host gestiona las solicitudes correctamente. La tasa se ve afectada por fallos como errores de gRPC, errores de HTTP, tiempos de espera y otros problemas.
Cuando configuras la detección de valores atípicos a través de Cloud Service Mesh, puedes ajustar cómo evalúa gRPC los hosts y cómo gestiona los valores atípicos. Por ejemplo, puedes especificar criterios como los siguientes:
Número de solicitudes que debe recibir un host antes de que gRPC las analice para determinar si se trata de valores atípicos.
El grado en que un host puede desviarse de la tasa de éxito media antes de que se considere un valor atípico.
Porcentaje máximo de hosts que se pueden expulsar en un momento dado del grupo de balanceo de carga.
El tiempo durante el que se excluye un valor atípico del grupo de balanceo de carga.
Para obtener más información sobre los parámetros disponibles, consulta la referencia de REST Resource: backendServices
. Sin embargo, gRPC tiene algunas limitaciones, tal como se describe en la sección siguiente.
Limitaciones
Los siguientes campos no se admiten en los clientes de gRPC:
outlierDetection.consecutiveErrors
outlierDetection.enforcingConsecutiveErrors
outlierDetection.consecutiveGatewayFailure
outlierDetection.enforcingConsecutiveGatewayFailure
Configurar la detección de valores atípicos
En el siguiente procedimiento se muestra cómo configurar la detección de valores atípicos en un servicio que usa un grupo de instancias como backend. Este procedimiento establece la siguiente configuración:
- El análisis de detección de valores atípicos se ejecuta cada segundo. Para configurar este comportamiento, usa el campo
interval
. - Los valores atípicos se expulsan del grupo de balanceo de carga en incrementos de 30 segundos, de la siguiente manera:
- Si un host no se ha expulsado nunca, solo se expulsará durante 30 segundos.
- Si un anfitrión ya ha sido expulsado, el tiempo aumenta en 30 segundos por cada expulsión anterior. Por ejemplo, si se expulsa a un host por tercera vez, se le expulsará durante 90 segundos.
Para configurar este comportamiento, usa el campo
baseEjectionTime
.
- Un host se considera no apto si su tasa de éxito es una desviación estándar inferior a la media durante el intervalo de tiempo seleccionado (en este caso, 1 segundo). Para configurar la desviación estándar máxima, usa el campo
successRateStdevFactor
.
Para configurar la detección de anomalías de esta forma, sigue estos pasos.
gcloud
Exporta el archivo de configuración del servicio de backend
grpcwallet-wallet-v2-service
con el comandogcloud compute backend-services export
:gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
En el archivo
bs_config.yaml
, actualiza lagrpcwallet-wallet-v2-service
configuración para incluir los campos de detección de valores atípicos:outlierDetection: interval: seconds: 1 nanos: 0 baseEjectionTime: seconds: 30 nanos: 0 successRateStdevFactor: 1000
Importa el archivo actualizado con el comando
gcloud compute backend-services import
:gcloud compute backend-services import grpcwallet-wallet-v2-service \ --source=bs_config.yaml \ --global
Balanceo de carga según la localidad
Para aprovechar al máximo tus recursos, configura el balanceo de carga por localidad. Esta función te ayuda a ahorrar recursos distribuyendo de forma uniforme las solicitudes de los clientes entre tus back-ends.
Cuando configuras el balanceo de carga de localidad, puedes usar las opciones que se describen en la siguiente tabla. Todas las opciones requieren que configure el recurso backendServices
.
Opción | Disponible para | Campo de configuración pertinente |
---|---|---|
Usar una política integrada | Todos los clientes de gRPC | localityLbPolicy |
Usar una política personalizada | Clientes Java que usan gRPC 1.47 o una versión posterior en una malla que solo incluye clientes gRPC | localityLbPolicies
|
Definir una lista de políticas preferidas | Clientes Java que usan gRPC 1.47 o una versión posterior en una malla que solo incluye clientes gRPC | localityLbPolicies |
Puedes usar cualquier combinación de las opciones anteriores. Sin embargo, si configuras tanto localityLbPolicy
como localityLbPolicies
, gRPC intentará usar primero tu configuración de localityLbPolicies
.
Si no configuras el balanceo de carga según la ubicación, Cloud Service Mesh usará la política ROUND_ROBIN
.
Para obtener información sobre ROUND_ROBIN
y otras políticas integradas, consulta la descripción de localityLbPolicy
en la página backendServices
.
Usar una política integrada
Si quieres que todos tus clientes usen una sola política integrada, puedes seleccionarla configurando el campo localityLbPolicy
.
Cuando configures este campo, podrás elegir entre las siguientes políticas:
LEAST_REQUEST
(solo clientes de Java)RING_HASH
ROUND_ROBIN
Si no todos tus clientes pueden usar la misma política, consulta Definir una lista de políticas preferidas.
gcloud
Exporta el archivo de configuración del servicio de backend
grpcwallet-wallet-v2-service
con el comandogcloud compute backend-services export
:gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Actualiza el archivo
bs_config.yaml
exportado para que incluya las siguientes líneas:localityLbPolicy: -- policy name: RING_HASH
Importa el archivo actualizado con el comando gcloud compute backend-services import:
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
Usar una política personalizada
Si es necesario, puedes usar una política de balanceo de carga personalizada que hayas creado e implementado con gRPC. Esta función está disponible para los clientes de Java que usen gRPC versión 1.47 o posterior. Úsalo solo en una malla que incluya a todos los clientes de gRPC.
Al crear una política personalizada, puede consultar la siguiente documentación:
Para que tu política personalizada sea más sofisticada, puedes usar las APIs de agregación de costes de solicitudes abiertas (ORCA). Estas APIs te permiten registrar métricas sobre el coste de las consultas y la utilización del servidor. Para usar estas APIs, se necesita la versión 1.48.1 de gRPC o una posterior. Para obtener más información, consulta el ejemplo de ORCA de gRPC.
Para obtener información sobre cómo se entregan las configuraciones de balanceo de carga personalizadas a gRPC mediante xDS, consulta Configuración de balanceador de carga personalizado de gRPC xDS.
Para configurar Cloud Service Mesh de forma que use tu política personalizada, identifica la política mediante el campo localityLbPolicies
.
En los pasos siguientes se muestra este proceso. En este procedimiento, actualizas la configuración del servicio de backend grpcwallet-wallet-v2-service
para que los clientes que se conecten a él usen una política personalizada llamada example.ExampleLoadBalancer
.
gcloud
Exporta el archivo de configuración del servicio de backend
grpcwallet-wallet-v2-service
con el comandogcloud compute backend-services export
:gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Actualiza el archivo
bs_config.yaml
exportado para hacer referencia a la políticaexample.ExampleLoadBalancer
. Incluya las siguientes líneas:localityLbPolicies: - customPolicy: name: example.ExampleLoadBalancer data: '{ "message": "Hello load-balancing world!" }'
Importa el archivo actualizado con el comando gcloud compute backend-services import:
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
Opcional: Prueba la configuración del balanceo de carga:
Java
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
Si has configurado correctamente la política de balanceo de carga personalizada, verás el mensaje que has incluido en la configuración ("Hello load-balancing world!").
Definir una lista de políticas preferidas
Si tienes varios clientes que no admiten una única política de balanceo de carga, crea una lista de políticas que puedan usar tus clientes. Con esta opción, si un cliente concreto no puede usar la primera política preferida, gRPC recurre a la siguiente política de la lista.
Cuando creas una lista de políticas preferidas, las opciones válidas incluyen políticas personalizadas, ROUND_ROBIN
y, en el caso de los clientes de Java, LEAST_REQUEST
. Puedes incluir hasta 10 políticas.
Esta función solo está disponible para los clientes de Java que usen gRPC versión 1.47 o posterior. Úsalo solo en una malla que incluya a todos los clientes de gRPC.
gcloud
- Exporta el archivo de configuración del servicio de backend
grpcwallet-wallet-v2-service
con el comandogcloud compute backend-services export
:
gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
Actualice el archivo
bs_config.yaml
exportado para incluir el campolocalityLbPolicies
. Rellénelo con entradas que representen las siguientes políticas:- Una política personalizada no válida (
example.InvalidLoadBalancer
) - Una política personalizada válida (
example.ExampleLoadBalancer
) - Una política integrada admitida (
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
- Una política personalizada no válida (
Importa el archivo actualizado con el comando gcloud compute backend-services import:
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
Opcional: Prueba la configuración del balanceo de carga:
Java
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
En respuesta, gRPC intenta encontrar
example.InvalidLoadBalancer
y no lo consigue. Después, vuelve a usarexample.ExampleLoadBalancer
y verás el mensaje que has incluido en la configuración ("Hello load-balancing world!"). El registro de gRPC en el cliente incluye un mensaje que indica que no se ha encontradoexample.InvalidLoadBalancer
.
Limpiar los recursos
Para limpiar los recursos, ejecuta el siguiente comando desde tu sistema local:
traffic-director-grpc-examples/scripts/cleanup.sh
Bloquear el tráfico entre servicios
Si quieres bloquear el tráfico entre el servicio A y el servicio B, y tu implementación está en GKE, configura la seguridad del servicio y usa una política de autorización para bloquear el tráfico entre los servicios. Para obtener instrucciones completas, consulta Seguridad de los servicios de Cloud Service Mesh y las instrucciones de configuración con Envoy y gRPC sin proxy.
Siguientes pasos
- Para ayudarte a resolver problemas de configuración de Cloud Service Mesh, consulta Solucionar problemas de despliegues que utilizan gRPC sin proxy.