Mengonfigurasi pengelolaan traffic lanjutan dengan layanan gRPC tanpa proxy

Konfigurasi ini didukung untuk pelanggan Pratinjau, tetapi kami tidak merekomendasikannya untuk pengguna Cloud Service Mesh baru. Untuk mengetahui informasi selengkapnya, lihat Ringkasan pemilihan rute layanan Cloud Service Mesh.

Dokumen ini memberikan petunjuk untuk mengonfigurasi Cloud Service Mesh dengan fitur pengelolaan traffic berikut:

  • Pencocokan rute
  • Pemisahan traffic
  • Pemutusan sirkuit
  • Injeksi kesalahan
  • Durasi streaming maksimum
  • Coba lagi
  • Afinitas sesi
  • Deteksi outlier
  • Load balancing lokalitas

Meskipun dokumen ini berfokus pada penyiapan pengelolaan traffic lanjutan dengan gRPC tanpa proxy di Compute Engine, pengelolaan traffic lanjutan juga didukung saat Anda menggunakan gRPC tanpa proxy di Google Kubernetes Engine (GKE).

Sebelum memulai

Sebelum mengonfigurasi pengelolaan traffic lanjutan, tinjau persyaratan di bagian Persiapan untuk menyiapkan Cloud Service Mesh dengan layanan gRPC tanpa proxy. Anda tidak dapat mengonfigurasi pengelolaan traffic lanjutan kecuali jika semua persyaratan terpenuhi.

Untuk informasi konseptual tentang fitur ini, lihat Pengelolaan traffic lanjutan.

Tentang contoh Wallet gRPC

Untuk mengilustrasikan fitur ini, Anda men-deploy contoh gRPC Wallet. Dalam contoh ini, ada tiga layanan gRPC, grpc.examples.wallet.Wallet, grpc.examples.wallet.stats.Stats, dan grpc.examples.wallet.account.Account, yang di-deploy sebagai tiga aplikasi terpisah.

Seperti yang ditunjukkan dalam diagram berikut, Anda membuat klien gRPC yang memanggil layanan Wallet untuk mendapatkan keseimbangan akun dan memanggil layanan Stats untuk mendapatkan harga koin. Layanan Wallet memanggil layanan Stats dan Account untuk menghitung saldo. Layanan Stats juga memanggil layanan Account untuk mendapatkan informasi pengguna.

Contoh konfigurasi pemilihan rute traffic gRPC Wallet.
Contoh konfigurasi pemilihan rute traffic gRPC Wallet (klik untuk memperbesar)

Pada contoh ini, Anda men-deploy dua versi implementasi Wallet dan Stats untuk menggambarkan pemilihan rute permintaan berdasarkan aturan yang Anda konfigurasi. Untuk menyimulasikan pembuatan dan deployment berbagai versi layanan, Anda harus menggunakan flag server untuk mengubah perilaku biner yang hanya dibuat satu kali.

  • Flag --port menentukan port tempat layanan pada instance VM diproses.
  • Tanda --hostname_suffix menentukan nilai yang ditambahkan ke nama host instance VM yang merespons permintaan. Nilai yang dihasilkan akan ditambahkan sebagai metadata hostname dalam respons. Hal ini membantu Anda mengidentifikasi instance mana dalam grup instance yang merespons permintaan klien.
  • Flag --premium_only dengan nilai true menentukan bahwa layanan ini merupakan versi premium dari layanan stats.
  • Flag --v1_behavior dengan nilai true menentukan bahwa biner dompet berperilaku sebagai versi v1.

Tabel berikut menunjukkan nilai flag ini untuk setiap instance VM yang menjalankan salah satu layanan gRPC, jumlah instance dalam grup instance, dan layanan backend yang mencakup grup instance ini.

Layanan backend Instance group Instance Tanda server
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"

Setelah men-deploy layanan ini, konfigurasi Cloud Service Mesh untuk mengarahkan permintaan ke layanan backend ini dari klien pengujian, berdasarkan aturan perutean dalam tabel berikut. Klien terhubung ke nama host virtual layanan, seperti yang ditunjukkan di kolom Host.

Host Aturan pencocokan Tindakan rute
wallet.grpcwallet.io Awalan jalur: "/"
Ada header: "session_id"
Rute ke wallet-v1-affinity
Awalan jalur: "/"
Header: {"route": "timeout"}
Menetapkan waktu tunggu 5 detik dan
mengarahkan rute ke wallet-v2
Awalan jalur: "/"
Header: {"route": "fault"}
Gagal 50% permintaan dan
merutekan sisanya ke wallet-v2
Awalan jalur: "/"
Header: {"membership": "premium"}
Rutekan ke wallet-v1 dan
coba lagi hingga 3 kali jika gagal
Jalur lengkap: /grpc.examples.wallet.Wallet/FetchBalance Rute ke:
wallet-v1: 70%
wallet-v2: 30%
Default Rute ke wallet-v1
stats.grpcwallet.io Awalan jalur: "/"
Header: {"membership": "premium"}
Rute ke stats-premium
Default Rute ke stats
account.grpcwallet.io Awalan jalur: "/"
Header: {"route": "account-fault"}
Gagal 30% permintaan dan
merutekan sisanya ke account
Default account

Contoh ini menggunakan pembagian traffic 70/30 antara dua layanan yang ada. Jika Anda membagi traffic ke layanan baru yang belum pernah direferensikan oleh peta URL, tambahkan layanan baru ke weightedBackendServices terlebih dahulu dan beri bobot 0. Kemudian, tingkatkan bobot yang ditetapkan untuk layanan tersebut secara bertahap.

Klien pengujian memiliki opsi berikut yang memungkinkan Anda membuat permintaan yang sesuai untuk mendemonstrasikan fitur pengelolaan traffic.

Opsi Deskripsi
--watch=true Metode streaming panggilan untuk melihat saldo/harga
--unary_watch=true Memanggil metode unary berulang kali untuk melihat saldo/harga
--user=Alice Memasukkan header {"membership": "premium"}
--user=Bob Memasukkan header {"membership": "normal"}
--route=value Memasukkan header {"route": "value"}
--affinity=true Memasukkan header {"session_id": "value"}

Menyiapkan lingkungan lokal Anda

Untuk menyiapkan lingkungan lokal untuk contoh ini, jalankan perintah berikut:

  1. Update biner gcloud untuk memastikan Anda memiliki versi terbaru:

    gcloud components update
    
  2. Download repositori contoh:

    sudo apt-get install git -y
    
  3. Clone repositori yang benar untuk contoh:

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

Membuat dan mengonfigurasi instance Cloud Router

Di bagian ini, Anda akan membuat instance Cloud Router di setiap region dan mengonfigurasinya untuk Cloud NAT. VM yang dibuat dalam contoh ini tidak memiliki alamat IP eksternal, tetapi harus memiliki akses ke internet. Mengonfigurasi Cloud Router dengan Cloud NAT akan memberikan akses yang diperlukan.

gcloud

  1. Buat instance Cloud Router:

    gcloud compute routers create nat-router-us-central1 \
        --network=default \
        --region=us-central1
    
  2. Konfigurasikan router untuk 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
    

Membuat aturan firewall dan health check gRPC

Di bagian ini, Anda akan membuat health check gRPC dan aturan firewall untuk mengizinkan permintaan health check gRPC mencapai jaringan Anda. Kemudian, health check gRPC akan dikaitkan dengan layanan backend agar dapat memeriksa kondisi instance backend layanan backend tersebut.

gcloud

  1. Membuat health check:

    gcloud compute health-checks create grpc grpcwallet-health-check \
        --use-serving-port
    
  2. Buat aturan firewall untuk health check:

    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
    

Membuat template instance

Di bagian ini, Anda akan membuat template instance untuk men-deploy layanan gRPC account yang ditampilkan pada port 50053.

gcloud

  • Buat template 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")
    

Membuat grup instance terkelola

Grup instance terkelola (MIG) menggunakan penskalaan otomatis untuk membuat instance VM baru sesuai kebutuhan. Di bagian ini, Anda akan membuat MIG menggunakan template instance yang telah dibuat di bagian sebelumnya.

gcloud

  • Buat grup instance:

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

Mengonfigurasi port bernama

Di bagian ini, Anda akan mengonfigurasi port bernama untuk layanan gRPC. Port yang dinamai adalah port tempat layanan gRPC memproses permintaan. Dalam contoh ini, port yang bernama adalah port 50053.

gcloud

  • Buat port bernama:

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

Membuat layanan backend

Di bagian ini, Anda akan membuat layanan backend global dengan skema load balancing INTERNAL_SELF_MANAGED dan protokol GRPC. Selanjutnya, Anda akan mengaitkan health check dan grup instance dengan layanan backend. Dalam contoh ini, Anda menggunakan MIG yang Anda buat di Membuat grup instance terkelola. MIG ini menjalankan layanan gRPC account. Port di tanda --port-name adalah port bernama yang Anda buat di Mengonfigurasi port bernama.

gcloud

  1. Buat layanan backend, lalu kaitkan health check dengan layanan backend baru:

    gcloud compute backend-services create grpcwallet-account-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --protocol=GRPC \
        --port-name=grpcwallet-account-port \
        --health-checks=grpcwallet-health-check
    
  2. Tambahkan grup instance terkelola sebagai backend:

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

Langkah-langkah untuk membuat layanan backend lainnya yang digunakan dalam contoh gRPC Wallet mirip dengan langkah sebelumnya. Anda membuat layanan yang tersisa dengan menjalankan skrip shell. Skrip ini men-deploy layanan backend berikut:

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

Jalankan skrip shell yang membuat layanan backend tambahan:

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

Membuat aturan pemilihan rute

Di bagian ini, Anda akan membuat peta URL yang digunakan untuk mendemonstrasikan berbagai fitur pengelolaan traffic. Peta URL menentukan nama host virtual layanan dalam contoh ini dan aturan pemilihan rute yang terkait. Untuk informasi selengkapnya, lihat Peta aturan pemilihan rute.

Dalam peta URL, hostRules menentukan nama host virtual layanan dalam contoh. Nama-nama ini digunakan klien dalam URI saluran untuk terhubung ke layanan tertentu. Misalnya, untuk mengirim permintaan ke layanan account, klien menggunakan xds:///account.grpcwallet.io dalam URI saluran. Di hostRules, konfigurasikan entri hosts dengan nilai account.grpcwallet.io.

pathMatcher yang terkait dengan entri hosts menentukan nama pathMatcher yang berisi semua aturan pemilihan rute untuk host virtual tersebut. Konfigurasi pathMatcher terdiri dari aturan pencocokan dan aturan tindakan yang sesuai seperti yang dijelaskan dalam Tentang contoh Wallet gRPC.

gcloud

Buat peta 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

Membuat aturan penerusan dan proxy target

Di bagian ini, Anda akan membuat proxy gRPC target dan aturan penerusan.

Proxy gRPC target merujuk ke peta URL yang Anda buat di langkah sebelumnya. Tanda --validate-for-proxyless mengaktifkan pemeriksaan konfigurasi sehingga Anda tidak secara tidak sengaja mengaktifkan fitur yang tidak kompatibel dengan deployment gRPC tanpa proxy.

gcloud

  • Buat proxy gRPC target:

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

Aturan penerusan merujuk ke proxy gRPC target yang Anda buat. Skema load balancing ditetapkan ke INTERNAL_SELF_MANAGED untuk menunjukkan bahwa aturan penerusan ini digunakan oleh Cloud Service Mesh. Aturan tersebut harus berupa aturan penerusan global. Alamat IP disetel ke 0.0.0.0 karena klien gRPC tanpa proxy menyelesaikan hostname:port dalam URI target dengan mengirimkan permintaan LDS ke Cloud Service Mesh, bukan melakukan pencarian DNS. Untuk informasi selengkapnya, lihat Skema resolusi nama.

Jika port tidak ditentukan dalam URI target, nilai defaultnya adalah 80. Misalnya, URI target xds:///foo.myservice:8080 cocok dengan aturan penerusan yang dikonfigurasi dengan port 8080. Dalam contoh ini, aturan penerusan dikonfigurasi dengan port 80.

gcloud

  • Buat aturan penerusan:

    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
    

Memverifikasi konfigurasi

Setelah proses konfigurasi selesai, pastikan bahwa layanan backend yang Anda konfigurasi tersedia dengan memeriksa halaman Cloud Service Mesh di Konsol Google Cloud. Pastikan layanan backend dan backend terkait dilaporkan responsif. Proses ini mungkin perlu waktu beberapa menit.

Memverifikasi konfigurasi pemilihan rute

Di bagian ini, Anda akan memverifikasi bahwa konfigurasi perutean berfungsi dengan benar. Anda dapat menggunakan alat grpcurl untuk menguji konfigurasi.

gcloud

  1. Buat VM klien tempat Anda menjalankan klien untuk menguji layanan. Anda dapat menyertakan flag --network-interface=no-address secara opsional.

    gcloud compute instances create grpc-wallet-client \
        --zone=us-central1-a \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --metadata-from-file=startup-script=<(echo '#! /bin/bash
    set -e
    export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json
    # Expose bootstrap variable to SSH connections
    echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh
    # Create the bootstrap file
    curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.11.0.tar.gz | tar -xz
    ./td-grpc-bootstrap-0.11.0/td-grpc-bootstrap | sudo tee $GRPC_XDS_BOOTSTRAP')
    
  2. Akses VM menggunakan SSH dan jalankan perintah berikut untuk menyiapkan VM:

    export EXAMPLES_VERSION=v1.1.x
    sudo apt-get update
    sudo apt-get install git -y
    
  3. Jalankan perintah berikut:

    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
    

Untuk mengakses layanan tanpa proxy file bantuan, klien gRPC harus menggunakan skema resolusi nama xds. Skema ini memberi tahu library gRPC yang digunakan di klien untuk menggunakan server xDS guna me-resolve nama host. Untuk melakukan ini, diperlukan konfigurasi bootstrap.

Skrip startup di bagian sebelumnya menetapkan variabel lingkungan GRPC_XDS_BOOTSTRAP dan menggunakan skrip helper untuk menghasilkan file bootstrap. Nilai untuk TRAFFICDIRECTOR_GCP_PROJECT_NUMBER, TRAFFICDIRECTOR_NETWORK_NAME, dan zona dalam file bootstrap yang dihasilkan diperoleh dari server metadata yang mengetahui detail tentang instance VM Compute Engine Anda. Anda dapat memberikan nilai ini ke skrip helper secara manual menggunakan opsi -gcp-project-number dan -vpc-network-name.

Verifikasi konfigurasi menggunakan alat grpcurl

Jalankan perintah berikut di shell SSH untuk memastikan bahwa wallet-service, stats-service, dan account-service berjalan:

./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

Anda akan melihat hasil berikut:

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

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

{
  "price": "10295"
}

{
  "balance": "5089953"
}

Verifikasi dengan grpc-wallet klien

Gunakan petunjuk khusus bahasa berikut untuk memverifikasi konfigurasi. Perintah ini mengirim beberapa RPC, beberapa dengan metadata tambahan, untuk menunjukkan bahwa permintaan diarahkan ke layanan backend berdasarkan aturan pencocokan dari peta URL. Perintah ini juga mencetak nama host instance VM untuk setiap respons guna menunjukkan ke instance VM mana permintaan dirutekan.

Java

  1. Untuk memverifikasi layanan dengan klien Java gRPC, jalankan perintah berikut:

    sudo apt-get install -y openjdk-11-jdk-headless
    
  2. Jalankan perintah berikut:

    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

  1. Untuk memverifikasi layanan dengan klien gRPC Go, instal golang atau ikuti petunjuk resmi:

    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
    
  2. Jalankan perintah berikut:

    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++

  1. Untuk memverifikasi layanan dengan klien gRPC C++, jalankan perintah berikut:

    sudo apt-get install -y build-essential
    
  2. Jalankan perintah berikut:

    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
    

Mengonfigurasi opsi lanjutan lainnya

Anda dapat mengonfigurasi opsi pemilihan rute traffic lanjutan tambahan dengan menggunakan petunjuk di bagian berikut.

Pemutusan sirkuit

Pemutusan sirkuit memungkinkan Anda menetapkan batas kegagalan untuk mencegah permintaan klien membebani layanan backend Anda. Setelah jumlah permintaan yang belum terselesaikan mencapai batas yang Anda tetapkan, klien akan berhenti mengirim permintaan tambahan, sehingga layanan backend Anda memiliki waktu untuk pulih.

Pemutusan sirkuit mencegah kegagalan beruntun dengan menampilkan error kepada klien, bukan membebani layanan backend. Hal ini memungkinkan beberapa traffic disalurkan sekaligus memberikan waktu untuk mengelola situasi overload, seperti menangani lonjakan traffic dengan meningkatkan kapasitas melalui penskalaan otomatis.

Saat Anda membuat layanan backend untuk stats-service, skrip create_service.sh menyertakan baris berikut dalam konfigurasinya:

circuitBreakers:
  maxRequests: 1

Setelan ini membatasi klien pada satu permintaan tertunda ke stats-service pada satu waktu. Karena hanya ada satu layanan wallet-v2, menjalankan dua operasi WatchBalance klien dompet secara serentak akan menunjukkan kegagalan dari instance kedua.

Java

  1. Jalankan perintah berikut:

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

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

    kill %%
    

Go

  1. Jalankan perintah berikut:

    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
    
  2. Outputnya akan terlihat seperti berikut:

    server host: error: no hostname
    failed to fetch balance: rpc error: code = Internal desc = RPC to stats server failed:
    UNAVAILABLE: Cluster max concurrent requests limit exceeded
    
  3. Berikan perintah kill:

    kill %%
    

C++

  1. Jalankan perintah berikut:

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

    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
    
  3. Berikan perintah kill:

    kill %%
    

Injeksi kesalahan

Injeksi kesalahan menyebabkan error saat melayani permintaan untuk menyimulasikan kegagalan, termasuk latensi tinggi, overload layanan, kegagalan layanan, dan partisi jaringan. Fitur ini berguna untuk menguji ketahanan layanan terhadap kesalahan simulasi.

Saat membuat peta URL sebelumnya, Anda menetapkan kebijakan injeksi kesalahan untuk menggagalkan 50% RPC yang dikirim ke wallet.grpcwallet.io dengan header route=fault.

Untuk mendemonstrasikan injeksi kesalahan, gunakan kode dalam bahasa berikut.

Java

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
    
  2. Outputnya akan terlihat seperti berikut:

    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

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob --route=fault
    
  2. Outputnya akan terlihat seperti berikut:

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

C++

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
    
  2. Outputnya akan terlihat seperti berikut:

    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
    

Durasi streaming maksimum

Durasi streaming maksimum memungkinkan waktu tunggu maksimum diterapkan ke semua RPC. Dengan demikian, klien yang lupa menetapkan batas waktu atau yang menetapkan batas waktu yang berlebihan tidak membuang-buang resource server.

Saat membuat peta URL sebelumnya, Anda menetapkan durasi streaming maksimum 5 detik untuk RPC yang dikirim ke wallet.grpcwallet.io dengan header route=timeout.

Untuk mendemonstrasikan waktu tunggu, kita menghentikan layanan wallet-v2 terlebih dahulu.

gcloud

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

Perintah berikut akan macet selamanya, karena tidak ada layanan backend yang menanganinya, dan aplikasi tidak menetapkan batas waktu.

Java

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. Perintah berhenti merespons. Tekan ^C untuk menginterupsi perintah.

Go

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
    
  2. Perintah berhenti merespons. Tekan ^C untuk menginterupsi perintah.

C++

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. Perintah berhenti merespons. Tekan ^C untuk menginterupsi perintah.

Namun, perintah berikut yang menggunakan rute timeout gagal setelah 5 detik karena setelan maxStreamDuration.

Java

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
    
  2. Outputnya akan terlihat seperti berikut:

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

Go

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob --route=timeout
    
  2. Outputnya akan terlihat seperti berikut:

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

C++

  1. Jalankan perintah berikut:

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
    
  2. Outputnya akan terlihat seperti berikut:

    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
    

Mulai ulang layanan wallet-v2.

gcloud

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

Coba lagi

Percobaan ulang membantu Anda meningkatkan ketersediaan layanan dengan memungkinkan aplikasi gRPC Anda untuk mencoba lagi permintaan keluar sesuai dengan kebijakan percobaan ulang. Dalam kebijakan percobaan ulang, Anda dapat mengonfigurasi kondisi saat permintaan yang gagal harus dicoba ulang dan jumlah maksimum upaya percobaan ulang—misalnya, saat permintaan gagal dengan kode respons tertentu.

Saat membuat peta URL sebelumnya, Anda menetapkan kebijakan percobaan ulang untuk RPC ke metode FetchBalance dengan header membership=premium. Kebijakan ini akan mencoba ulang RPC yang gagal dengan kode status unavailable hingga maksimum 3 kali. Anda juga menetapkan kebijakan injeksi kesalahan untuk RPC ke account.grpcwallet.io dengan header route=account-fault yang menggagalkan 30% RPC dari layanan Wallet ke layanan Account. Akibatnya, 30% RPC dari klien pengujian dengan header membership=normal gagal, sedangkan tingkat kegagalan untuk RPC dengan header membership=premium kurang dari 1%.

Untuk mendemonstrasikan percobaan ulang, gunakan kode dalam bahasa berikut.

Java

Jalankan perintah berikut:

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

Jalankan perintah berikut:

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++

Jalankan perintah berikut:

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

Afinitas sesi

Afinitas sesi memberikan upaya terbaik untuk mengirim permintaan dengan karakteristik tertentu (header HTTP) ke instance yang sama selama instance tersebut responsif dan memiliki kapasitas. Hal ini berguna untuk server aplikasi stateful yang mendapatkan manfaat dari peningkatan performa dan efisiensi saat permintaan dari klien tertentu dikirim ke instance yang sama, bukan, misalnya, distribusi round-robin ke instance yang berbeda.

Saat Anda membuat layanan backend grpcwallet-wallet-v1-affinity-service, dalam skrip create_service.sh, localityLbPolicy ditetapkan ke ROUND_ROBIN. Dalam contoh ini, Anda akan menerapkan konfigurasi berikut untuk mengubah localityLbPolicy menjadi RING_HASH.

sessionAffinity: HEADER_FIELD
localityLbPolicy: RING_HASH
consistentHash:
  httpHeaderName: "session_id"

gcloud

  1. Simpan konfigurasi layanan backend grpcwallet-wallet-v1-affinity-service:

    gcloud compute backend-services export grpcwallet-wallet-v1-affinity-service \
     --destination=bs_config.yaml \
     --global
    
  2. Update layanan 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}"
    

Untuk mendemonstrasikan afinitas sesi, gunakan kode dalam bahasa berikut. Dengan flag --affinity=true, klien menyisipkan header session-id dengan nilai unik untuk setiap pengguna. Hash nilai ini digunakan untuk mengirim permintaan ke instance tertentu dalam grup instance layanan backend grpcwallet-wallet-v1-affinity-service.

Java

Jalankan perintah berikut:

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

Jalankan perintah berikut:

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++

Jalankan perintah berikut:

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

Pulihkan konfigurasi layanan backend grpcwallet-wallet-v1-affinity-service.

gcloud

gcloud compute backend-services import grpcwallet-wallet-v1-affinity-service \
  --source=bs_config.yaml \
  --global

Deteksi outlier

Untuk meningkatkan ketersediaan layanan, konfigurasikan deteksi pencilan. Dengan fitur ini, Anda dapat mengidentifikasi dan mengeluarkan host yang tidak responsif untuk sementara dari kumpulan load balancing. Host yang tidak responsif ini disebut outlier.

gRPC mengevaluasi host berdasarkan tingkat keberhasilan, yakni frekuensi host berhasil menangani permintaan. Rasio ini dipengaruhi oleh kegagalan, seperti error gRPC, error HTTP, waktu tunggu, dan masalah lainnya.

Saat mengonfigurasi deteksi pencilan melalui Cloud Service Mesh, Anda dapat menyesuaikan cara gRPC menilai host dan cara menangani pencilan. Misalnya, Anda dapat menentukan kriteria seperti berikut:

  • Jumlah permintaan yang harus diterima host sebelum gRPC menganalisisnya untuk mengetahui kemungkinan status pencilan.

  • Sejauh mana host dapat menyimpang dari tingkat keberhasilan rata-rata sebelum dianggap sebagai pencilan.

  • Persentase maksimum host yang dapat dikeluarkan pada satu waktu dari kumpulan load balancing.

  • Jumlah waktu saat pencilan dikecualikan dari kumpulan load balancing.

Untuk mengetahui informasi selengkapnya tentang parameter yang tersedia, lihat referensi REST Resource: backendServices. Namun, ada beberapa batasan untuk gRPC, seperti yang dijelaskan di bagian berikut.

Batasan

Kolom berikut tidak didukung untuk klien gRPC:

  • outlierDetection.consecutiveErrors

  • outlierDetection.enforcingConsecutiveErrors

  • outlierDetection.consecutiveGatewayFailure

  • outlierDetection.enforcingConsecutiveGatewayFailure

Siapkan deteksi pencilan

Prosedur berikut menunjukkan cara mengonfigurasi deteksi pencilan untuk layanan yang menggunakan satu grup instance sebagai backend-nya. Prosedur ini menetapkan konfigurasi berikut:

  • Analisis deteksi pencilan berjalan setiap detik. Anda mengonfigurasi perilaku ini menggunakan kolom interval.
  • Pencilan dikeluarkan dari kumpulan load balancing selama 30 detik, sebagai berikut:
    • Jika belum pernah dikeluarkan sebelumnya, host akan dikeluarkan hanya selama 30 detik.
    • Jika host telah dikeluarkan sebelumnya, waktu akan bertambah 30 detik untuk setiap ejeksi sebelumnya. Misalnya, saat dikeluarkan untuk ketiga kali, host akan dikeluarkan selama 90 detik. Anda mengonfigurasi perilaku ini menggunakan kolom baseEjectionTime.
  • Host dianggap tidak sehat jika tingkat keberhasilannya adalah satu deviasi standar di bawah rata-rata selama interval waktu yang dipilih (dalam hal ini, 1 detik). Anda mengonfigurasi standar deviasi maksimum menggunakan kolom successRateStdevFactor.

Untuk mengonfigurasi deteksi pencilan dengan cara ini, gunakan langkah-langkah berikut.

gcloud

  1. Ekspor file konfigurasi layanan backend grpcwallet-wallet-v2-service menggunakan perintah gcloud compute backend-services export:

    gcloud compute backend-services export grpcwallet-wallet-v2-service \
     --destination=bs_config.yaml \
     --global
    
  2. Dalam file bs_config.yaml, perbarui konfigurasi grpcwallet-wallet-v2-service untuk menyertakan kolom deteksi pencilan:

    outlierDetection:
     interval:
       seconds: 1
       nanos: 0
     baseEjectionTime:
       seconds: 30
       nanos: 0
     successRateStdevFactor: 1000
    
  3. Impor file yang telah diupdate menggunakan perintah gcloud compute backend-services import:

    gcloud compute backend-services import grpcwallet-wallet-v2-service \
     --source=bs_config.yaml \
     --global

Load balancing lokalitas

Untuk mengoptimalkan penggunaan resource, konfigurasikan load balancing lokalitas. Fitur ini membantu Anda menghemat resource dengan mendistribusikan permintaan klien secara merata di seluruh backend.

Saat mengonfigurasi load balancing lokalitas, Anda dapat menggunakan opsi yang dijelaskan dalam tabel berikut. Semua opsi mengharuskan Anda mengonfigurasi resource backendServices.

Opsi Tersedia untuk Bidang konfigurasi yang relevan
Menggunakan kebijakan bawaan Semua klien gRPC localityLbPolicy
Menggunakan kebijakan kustom Klien Java yang menggunakan gRPC versi 1.47 atau yang lebih baru, dalam mesh yang hanya menyertakan klien gRPC localityLbPolicies
Menentukan daftar kebijakan pilihan Klien Java yang menggunakan gRPC versi 1.47 atau yang lebih baru, dalam mesh yang hanya menyertakan klien gRPC localityLbPolicies

Anda dapat menggunakan kombinasi apa pun dari opsi sebelumnya. Namun, jika Anda mengonfigurasi localityLbPolicy dan localityLbPolicies, gRPC akan mencoba menggunakan konfigurasi localityLbPolicies Anda terlebih dahulu.

Jika Anda tidak mengonfigurasi load balancing lokalitas, Cloud Service Mesh akan menggunakan kebijakan ROUND_ROBIN.

Untuk informasi tentang ROUND_ROBIN dan kebijakan bawaan lainnya, lihat deskripsi localityLbPolicy di halaman backendServices.

Gunakan kebijakan bawaan

Jika ingin semua klien menggunakan satu kebijakan bawaan, Anda dapat memilihnya dengan mengonfigurasi kolom localityLbPolicy.

Saat mengonfigurasi kolom ini, Anda dapat memilih dari kebijakan berikut:

  • LEAST_REQUEST (khusus klien Java)
  • RING_HASH
  • ROUND_ROBIN

Jika tidak semua klien dapat menggunakan kebijakan yang sama, lihat Menentukan daftar kebijakan pilihan.

gcloud

  1. Ekspor file konfigurasi layanan backend grpcwallet-wallet-v2-service menggunakan perintah gcloud compute backend-services export:

    gcloud compute backend-services export grpcwallet-wallet-v2-service \
    --destination=bs_config.yaml \
    --global
    
  2. Perbarui file bs_config.yaml yang diekspor untuk menyertakan baris berikut:

    localityLbPolicy:
     -- policy
        name: RING_HASH
    
  3. Impor file yang telah diupdate menggunakan perintah gcloud compute backend-services import:

    gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
    

Menggunakan kebijakan kustom

Jika memungkinkan, Anda dapat menggunakan kebijakan load balancing kustom yang telah dibuat dan di-deploy dengan gRPC. Fitur ini tersedia untuk klien Java yang menggunakan gRPC versi 1.47 atau yang lebih baru. Gunakan hanya dalam mesh yang menyertakan semua klien gRPC.

Saat membuat kebijakan khusus, dokumentasi berikut mungkin dapat membantu:

  • Untuk membuat kebijakan kustom lebih canggih, Anda dapat menggunakan API Agregasi Biaya Open Request (ORCA). API ini memungkinkan Anda merekam metrik tentang biaya kueri dan penggunaan server. Penggunaan API ini memerlukan gRPC versi 1.48.1 atau yang lebih baru. Untuk informasi selengkapnya, lihat Contoh ORCA gRPC.

  • Untuk mengetahui informasi tentang cara konfigurasi load balancing kustom dikirimkan ke gRPC oleh xDS, lihat Konfigurasi Load Balancer Kustom gRPC xDS.

Untuk mengonfigurasi Cloud Service Mesh agar menggunakan kebijakan kustom Anda, identifikasi kebijakan menggunakan kolom localityLbPolicies.

Langkah-langkah berikut menunjukkan proses ini. Dalam prosedur ini, Anda akan memperbarui konfigurasi layanan backend grpcwallet-wallet-v2-service agar klien yang terhubung ke layanan tersebut menggunakan kebijakan kustom yang disebut example.ExampleLoadBalancer.

gcloud

  1. Ekspor file konfigurasi layanan backend grpcwallet-wallet-v2-service menggunakan perintah gcloud compute backend-services export:

    gcloud compute backend-services export grpcwallet-wallet-v2-service \
    --destination=bs_config.yaml \
    --global
    
  2. Perbarui file bs_config.yaml yang diekspor agar merujuk ke kebijakan example.ExampleLoadBalancer. Sertakan baris berikut:

    localityLbPolicies:
      - customPolicy:
          name: example.ExampleLoadBalancer
          data: '{ "message": "Hello load-balancing world!" }'
    
  3. Impor file yang telah diupdate menggunakan perintah gcloud compute backend-services import:

    gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
    
  4. Opsional: Uji konfigurasi load balancing:

    Java

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    

    Jika kebijakan load balancing kustom dikonfigurasi dengan benar, Anda akan melihat pesan yang disertakan dalam konfigurasi ("Halo dunia load balancing!").

Tentukan daftar kebijakan pilihan

Jika Anda memiliki beberapa klien yang tidak semuanya mendukung satu kebijakan load balancing, buat daftar kebijakan yang dapat digunakan klien Anda. Dengan opsi ini, jika kebijakan pilihan pertama Anda tidak dapat digunakan oleh klien tertentu, gRPC akan beralih kembali ke kebijakan berikutnya dalam daftar.

Saat Anda membuat daftar kebijakan pilihan, opsi yang valid mencakup kebijakan kustom, ROUND_ROBIN, dan LEAST_REQUEST untuk klien Java. Anda dapat membuat daftar hingga 10 kebijakan.

Fitur ini hanya tersedia untuk klien Java yang menggunakan gRPC versi 1.47 atau yang lebih baru. Gunakan hanya dalam mesh yang menyertakan semua klien gRPC.

gcloud

  1. Ekspor file konfigurasi layanan backend grpcwallet-wallet-v2-service menggunakan perintah gcloud compute backend-services export:
gcloud compute backend-services export grpcwallet-wallet-v2-service \
  --destination=bs_config.yaml \
  --global
  1. Perbarui file bs_config.yaml yang diekspor untuk menyertakan kolom localityLbPolicies. Isi dengan entri yang mewakili kebijakan berikut:

    • Kebijakan khusus (example.InvalidLoadBalancer) yang tidak valid
    • Kebijakan khusus yang valid (example.ExampleLoadBalancer)
    • Kebijakan bawaan yang didukung (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
    
  2. Impor file yang telah diupdate menggunakan perintah gcloud compute backend-services import:

    gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
    
  3. Opsional: Uji konfigurasi load balancing:

    Java

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    

    Sebagai respons, gRPC akan mencoba dan gagal menemukan example.InvalidLoadBalancer. Setelah itu, metode tersebut akan kembali menggunakan example.ExampleLoadBalancer, dan Anda akan melihat pesan yang Anda sertakan dalam konfigurasi ("Halo dunia load balancing!"). Logging gRPC pada klien menyertakan pesan yang menyatakan bahwa example.InvalidLoadBalancer tidak ditemukan.

Membersihkan resource

Untuk membersihkan resource, jalankan perintah berikut dari sistem lokal Anda:

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

Memblokir traffic antarlayanan

Jika Anda ingin memblokir traffic antara Service A dan Service B, dan deployment Anda dilakukan di GKE, siapkan keamanan layanan dan gunakan kebijakan otorisasi untuk memblokir traffic antarlayanan. Untuk mengetahui petunjuk selengkapnya, lihat Keamanan layanan Traffic Director dan petunjuk penyiapan dengan Envoy dan gRPC tanpa proxy.

Langkah selanjutnya