Connessione a database completamente gestiti da Cloud Run

1. Panoramica

In questo lab integrerai i database serverless(Spanner e Firestore) con le applicazioni(Go e Node.js) in esecuzione in Cloud Run. L'applicazione Cymbal Eats include più servizi eseguiti su Cloud Run. Nei passaggi seguenti, configurerai i servizi per utilizzare il database relazionale Cloud Spanner e Cloud Firestore, un database di documenti NoSQL. L'utilizzo di prodotti serverless per il livello dati e il runtime dell'applicazione ti consente di astrarre tutta la gestione dell'infrastruttura, concentrandoti sulla creazione dell'applicazione anziché sull'overhead.

2. Cosa imparerai a fare

In questo lab imparerai a:

  • Integra Spanner
  • Abilita i servizi gestiti di Spanner
  • Integrazione nel codice
  • Esegui il deployment del codice che si connette a Spanner
  • Integra Firestore
  • Abilita i servizi gestiti di Firestore
  • Integrazione nel codice
  • Esegui il deployment del codice che si connette a Firestore

3. Configurazione e requisiti

Configurazione dell'ambiente autogestito

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarla.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento al tuo ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, potresti generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Configura ambiente

  1. Crea una variabile di ID progetto
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export SPANNER_INSTANCE=inventory-instance
export SPANNER_DB=inventory-db
export REGION=us-east1
export SPANNER_CONNECTION_STRING=projects/$PROJECT_ID/instances/$SPANNER_INSTANCE/databases/$SPANNER_DB
  1. Abilita le API Spanner, Cloud Run, Cloud Build e Artifact Registry
gcloud services enable \
     compute.googleapis.com \
     spanner.googleapis.com \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     artifactregistry.googleapis.com \
     firestore.googleapis.com \
     appengine.googleapis.com \
     artifactregistry.googleapis.com
  1. clona il repository
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Passa alla directory
cd cymbal-eats/inventory-service/spanner

4. Crea e configura un'istanza Spanner

Spanner è il database relazionale di backend dei servizi di inventario. Nei passaggi seguenti creerai un'istanza, un database e uno schema Spanner.

Crea un'istanza

  1. crea un'istanza Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

Output di esempio

Creating instance...done.   
  1. Verificare se l'istanza Spanner è configurata correttamente
gcloud spanner instances list

Output di esempio

NAME: inventory-instance
DISPLAY_NAME: Cymbal Menu Inventory
CONFIG: regional-us-east1
NODE_COUNT: 1
PROCESSING_UNITS: 100
STATE: READY

Crea un database e uno schema

Crea un nuovo database e utilizza il DDL (Data Definition Language) di SQL standard di Google per creare lo schema del database.

  1. Creare un file DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. crea il database Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

Output di esempio

Creating database...done.

Verifica lo stato e lo schema del database

  1. Visualizza lo stato del database
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Output di esempio

createTime: '2022-04-22T15:11:33.559300Z'
databaseDialect: GOOGLE_STANDARD_SQL
earliestVersionTime: '2022-04-22T15:11:33.559300Z'
encryptionInfo:
- encryptionType: GOOGLE_DEFAULT_ENCRYPTION
name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory
state: READY
versionRetentionPeriod: 1h
  1. Visualizza lo schema del database
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Output di esempio

CREATE TABLE InventoryHistory (
  ItemRowID STRING(36) NOT NULL,
  ItemID INT64 NOT NULL,
  InventoryChange INT64,
  TimeStamp TIMESTAMP,
) PRIMARY KEY(ItemRowID);

5. Integrazione di Spanner

In questa sezione imparerai come integrare Spanner nella tua applicazione. Inoltre, SQL Spanner fornisce librerie client, driver JDBC, driver R2DBC, API REST e API RPC, che consentono di integrare Spanner in qualsiasi applicazione.

Nella sezione successiva utilizzerai la libreria client Go per installare, autenticare e modificare i dati in Spanner.

Installare la libreria client

La libreria client di Cloud Spanner semplifica l'integrazione con Cloud Spanner utilizzando automaticamente le credenziali dell'applicazione predefinite (ADC) per trovare le credenziali del tuo account di servizio.

Configura l'autenticazione

Le librerie client di Google Cloud CLI e Google Cloud rilevano automaticamente quando sono in esecuzione su Google Cloud e utilizzano l'account di servizio di runtime della revisione attuale di Cloud Run. Questa strategia si chiama Credenziali predefinite dell'applicazione e consente la portabilità del codice in più ambienti.

Tuttavia, è meglio creare un'identità dedicata assegnando un account di servizio gestito dall'utente anziché l'account di servizio predefinito.

  1. Concedi il ruolo Amministratore database Spanner all'account di servizio
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Output di esempio

Updated IAM policy for project [cymbal-eats-6422-3462].
[...]

Utilizzo delle librerie client

Le librerie client di Spanner astraggono le complessità dell'integrazione con Spanner e sono disponibili in molti linguaggi di programmazione comuni.

Crea un client Spanner

Il client Spanner è un client per la lettura e la scrittura di dati in un database Cloud Spanner. Un client è sicuro da utilizzare contemporaneamente, tranne che per il metodo Close.

Lo snippet seguente crea un client Spanner

main.go

var dataClient *spanner.Client
...
dataClient, err = spanner.NewClient(ctx, databaseName)

Puoi pensare a un client come a una connessione di database: tutte le tue interazioni con Cloud Spanner devono passare attraverso un client. In genere si crea un client all'avvio dell'applicazione, quindi lo riutilizzi per leggere, scrivere ed eseguire transazioni. Ogni client utilizza le risorse in Cloud Spanner.

Modifica dati

Esistono diversi modi per inserire, aggiornare ed eliminare dati da un database Spanner. Di seguito sono elencati i metodi disponibili.

In questo lab utilizzerai le mutazioni per modificare i dati in Spanner.

Mutazioni in Spanner

Una mutazione è un container per le operazioni di mutazione. Una mutazione rappresenta una sequenza di inserimenti, aggiornamenti ed eliminazioni che Cloud Spanner applica a livello atomico a righe e tabelle diverse in un database Cloud Spanner.

main.go

m := []*spanner.Mutation{}

m = append(m, spanner.Insert(
        "inventoryHistory",
         inventoryHistoryColumns,
        []interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))

Lo snippet di codice inserisce una nuova riga nella tabella della cronologia dell'inventario.

Deployment e test

Ora che Spanner è configurato e hai esaminato gli elementi chiave del codice, esegui il deployment dell'applicazione in Cloud Run.

esegui il deployment dell'applicazione in Cloud Run

Cloud Run può creare ed eseguire automaticamente il push e il deployment del tuo codice con un solo comando. Nel comando seguente, chiamerai il comando deploy sul servizio run, passando le variabili utilizzate dall'applicazione in esecuzione, come SPANNER_CONNECTION_STRING che hai creato in precedenza.

  1. Fai clic su Apri terminale
  2. Eseguire il deployment del servizio di inventario in Cloud Run
gcloud run deploy inventory-service \
    --source . \
    --region $REGION \
    --update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
    --allow-unauthenticated \
    --project=$PROJECT_ID \
    --quiet

Output di esempio

Service [inventory-service] revision [inventory-service-00001-sug] has been deployed and is serving 100 percent of traffic.
Service URL: https://inventory-service-ilwytgcbca-uk.a.run.app
  1. Archivia l'URL del servizio
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

testa l'applicazione Cloud Run

Inserisci un elemento

  1. In Cloudshell, inserisci il comando seguente.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Output di esempio

HTTP/2 200
access-control-allow-origin: *
content-type: application/json
x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1
date: Fri, 22 Apr 2022 21:41:38 GMT
server: Google Frontend
content-length: 2

OK

Eseguire una query su un elemento

  1. Eseguire una query sul servizio di inventario
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Esempio di risposta

HTTP/2 200
access-control-allow-origin: *
content-type: text/plain; charset=utf-8
x-cloud-trace-context: b94f921e4c2ae90210472c88eb05ace8;o=1
date: Fri, 22 Apr 2022 21:45:50 GMT
server: Google Frontend
content-length: 166

[{"ItemID":1,"Inventory":5}]

6. Concetti di Spanner

Cloud Spanner esegue query sui propri database utilizzando istruzioni SQL dichiarative. Le istruzioni SQL indicano ciò che l'utente vuole senza descrivere come otterranno i risultati.

  1. Nel terminale, inserisci questo comando per eseguire una query sulla tabella per il record creato in precedenza.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Output di esempio

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Piani di esecuzione delle query

Un piano di esecuzione delle query è una serie di passaggi che Spanner utilizza per ottenere risultati. Esistono diversi modi per acquisire i risultati di una particolare istruzione SQL. I piani di esecuzione delle query sono accessibili nella console e nelle librerie client. Per vedere in che modo Spanner gestisce le query SQL:

  1. Nella console, apri la pagina Istanze Cloud Spanner.
  2. Vai alle istanze Cloud Spanner
  3. Fai clic sul nome dell'istanza Cloud Spanner. Nella sezione Database, seleziona il database su cui eseguire la query.
  4. Fai clic su Query.
  5. Inserisci la seguente query nell'editor query
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Fai clic su ESEGUI
  2. Fai clic su SPIEGAZIONE

La console Cloud mostra un piano di esecuzione visivo per la query.

149f8bae468f8b34.png

Strumento di ottimizzazione delle query

Lo strumento di ottimizzazione delle query di Cloud Spanner confronta piani di esecuzione alternativi e seleziona quello più efficiente. Nel tempo, lo strumento di ottimizzazione delle query si evolverà, ampliando le scelte nel piano di esecuzione delle query e migliorando l'accuratezza delle stime su cui si basano queste scelte, portando a piani di esecuzione delle query più efficienti.

Cloud Spanner implementa gli aggiornamenti dello strumento di ottimizzazione come nuove versioni. Per impostazione predefinita, ogni database inizia a utilizzare la versione più recente dell'ottimizzatore almeno 30 giorni dopo il rilascio della versione.

Per visualizzare la versione utilizzata durante l'esecuzione di una query in gcloud spanner, imposta il flag –query-mode su PROFILE

  1. Inserisci il seguente comando per visualizzare la versione dell'ottimizzatore
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Output di esempio

TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
 RELATIONAL Distributed Union
 (1 execution, 0.11 msecs total latency)
 subquery_cluster_node: 1
    |
    +- RELATIONAL Distributed Union
    |  (1 execution, 0.09 msecs total latency)
    |  call_type: Local, subquery_cluster_node: 2
    |   |
    |   \- RELATIONAL Serialize Result
    |      (1 execution, 0.08 msecs total latency)
    |       |
    |       +- RELATIONAL Scan
    |       |  (1 execution, 0.08 msecs total latency)
    |       |  Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemRowID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  InventoryChange
    |       |   |
    |       |   \- SCALAR Reference
    |       |      Timestamp
    |       |
    |       +- SCALAR Reference
    |       |  $ItemRowID
    |       |
    |       +- SCALAR Reference
    |       |  $ItemID
    |       |
    |       +- SCALAR Reference
    |       |  $InventoryChange
    |       |
    |       \- SCALAR Reference
    |          $Timestamp
    |
    \- SCALAR Constant
       true

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:

Aggiorna la versione dello strumento di ottimizzazione

La versione più recente al momento di questo lab è la 4. Successivamente, aggiornerai la tabella Spanner in modo che utilizzi la versione 4 per l'ottimizzazione delle query.

  1. Aggiorna lo strumento di ottimizzazione
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

Output di esempio

Schema updating...done. 
  1. Inserisci il seguente comando per visualizzare l'aggiornamento della versione dell'ottimizzatore
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Output di esempio

TOTAL_ELAPSED_TIME: 8.57 msecs
CPU_TIME: 8.54 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 4
[...]

Visualizza la versione dello strumento di ottimizzazione delle query in Metrics Explorer

Puoi utilizzare Esplora metriche nella console Cloud per visualizzare il Conteggio delle query per l'istanza del database. Puoi vedere quale versione dell'ottimizzatore viene utilizzata in ciascun database.

  1. Vai a Monitoring nella console Cloud e seleziona Metrics Explorer nel menu a sinistra.
  2. Nel campo Tipo di risorsa, seleziona Istanza Cloud Spanner.
  3. Nel campo Metrica, seleziona Conteggio delle query e Applica.
  4. Nel campo Group By (Raggruppa per), seleziona database, optimized_version e status.

581b859c25790b21.png

7. Crea e configura un database Firestore

Firestore è un database di documenti NoSQL creato per offrire scalabilità automatica, prestazioni elevate e facilità di sviluppo delle applicazioni. Sebbene l'interfaccia Firestore abbia molte delle funzionalità dei database tradizionali, un database NoSQL differisce da queste nella descrizione delle relazioni tra oggetti dati.

La seguente attività ti guiderà nella creazione di un'applicazione Cloud Run per il servizio di ordinazione supportata da Firestore. Il servizio di ordinazione chiama il servizio di inventario creato nella sezione precedente per eseguire una query sul database Spanner prima di iniziare l'ordine. Questo servizio garantirà l'inventario sufficiente e la possibilità di evadere l'ordine.

6843abaf4263e112.png

8. Concetti di Firestore

Modello dei dati

Un database Firestore è composto da raccolte e documenti.

b60acd63d4793a6c.png

Documenti

Ogni documento contiene una serie di coppie chiave-valore. Firestore è ottimizzato per l'archiviazione di grandi raccolte di documenti di piccole dimensioni.

5571cb2f261d2dbe.png

Raccolte

Devi archiviare tutti i documenti in raccolte. I documenti possono contenere sottoraccolte e oggetti nidificati, inclusi campi primitivi come stringhe o oggetti complessi come elenchi.

5811378cb721e5ec.png

Crea un database Firestore

  1. Crea il database Firestore
gcloud firestore databases create --location=$REGION

Output di esempio

Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462

9. Integrazione di Firestore nella tua applicazione

In questa sezione aggiornerai l'account di servizio, aggiungerai account di servizio di accesso a Firestore, esaminerai ed eseguirai il deployment delle regole di sicurezza di Firestore ed esamineremo le modifiche apportate ai dati in Firestore.

Configura l'autenticazione

  1. Concedi il ruolo utente Datastore all'account di servizio
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Output di esempio

Updated IAM policy for project [cymbal-eats-6422-3462].

Regole di sicurezza di Firestore

Le regole di sicurezza offrono un formato espressivo ma diretto, ma al tempo stesso espresso per il controllo degli accessi e la convalida dei dati.

  1. Vai alla directory order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Apri il file firestore.rules in Cloud Editor
cat firestore.rules

firestore.rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { ⇐ All database
    match /{document=**} { ⇐ All documents
      allow read: if true; ⇐ Allow reads
    }
    match /{document=**} {
      allow write: if false; ⇐ Deny writes
    }
  }
}

Avviso: come best practice, limitare l'accesso allo spazio di archiviazione di Firestore. Ai fini di questo lab, sono consentite tutte le operazioni di lettura. Questa configurazione di produzione non è consigliata.

Abilita i servizi gestiti di Firestore

  1. Fai clic su Apri terminale
  2. Crea il file .firebaserc con l'ID progetto attuale. Le impostazioni per le destinazioni di deployment sono archiviate nel file .firebaserc nella directory del progetto.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Scarica il programma binario di Firebase
curl -sL https://firebase.tools | upgrade=true bash

Output di esempio

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. Esegui il deployment delle regole di Firestore.
firebase deploy 

Output di esempio

=== Deploying to 'cymbal-eats-6422-3462'...

i  deploying firestore
i  cloud.firestore: checking firestore.rules for compilation errors...
✔  cloud.firestore: rules file firestore.rules compiled successfully
i  firestore: uploading rules firestore.rules...
✔  firestore: released rules firestore.rules to cloud.firestore

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/cymbal-eats-6422-3462/overview

Modifica dati

Le raccolte e i documenti vengono creati implicitamente in Firestore. È sufficiente assegnare i dati a un documento all'interno di una raccolta. Se la raccolta o il documento non esiste, Firestore lo crea.

Aggiungi dati a Firestore

Esistono diversi modi per scrivere dati in Cloud Firestore:

  • Imposta i dati di un documento all'interno di una raccolta, specificando esplicitamente un identificatore del documento.
  • Aggiungi un nuovo documento a una raccolta. In questo caso, Cloud Firestore genera automaticamente l'identificatore del documento.
  • Crea un documento vuoto con un identificatore generato automaticamente e assegna i dati in un secondo momento.

La sezione successiva ti guiderà nella creazione di un documento utilizzando il metodo "set".

Imposta un documento

Utilizza il metodo set() per creare un documento. Con il metodo set(), devi specificare un ID per il documento da creare.

Dai un'occhiata allo snippet di codice riportato di seguito.

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.set({
    orderNumber: 123,
    name: Anne,
    address: 555 Bright Street,
    city: Mountain View,
    state: CA,
    zip: 94043,
    orderItems: [id: 1],
    status: 'New'
  });

Questo codice creerà un documento che specifica un ID documento generato dall'utente 123. Per fare in modo che Firestore generi un ID per tuo conto, utilizza il metodo add() o create().

Aggiorna un documento

Il metodo di aggiornamento update()consente di aggiornare alcuni campi del documento senza sovrascrivere l'intero documento.

Nello snippet seguente, il codice aggiorna l'ordine 123

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.update(name: "Anna");

Eliminare un documento

In Firestore, puoi eliminare raccolte, documenti o campi specifici da un documento. Per eliminare un documento, utilizza il metodo delete().

Lo snippet seguente elimina l'ordine 123.

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.delete();

10. Deployment e test

In questa sezione eseguirai il deployment dell'applicazione in Cloud Run e testerai i metodi di creazione, aggiornamento ed eliminazione.

esegui il deployment dell'applicazione in Cloud Run

  1. Archivia l'URL nella variabile INVENTORY_SERVICE_URL per l'integrazione con il Servizio di inventario
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Eseguire il deployment del servizio ordini
gcloud run deploy order-service \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated \
  --project=$PROJECT_ID \
  --set-env-vars=INVENTORY_SERVICE_URL=$INVENTORY_SERVICE_URL \
  --quiet

Output di esempio

[...]
Done.
Service [order-service] revision [order-service-00001-qot] has been deployed and is serving 100 percent of traffic.
Service URL: https://order-service-3jbm3exegq-uk.a.run.app

testa l'applicazione Cloud Run

Crea un documento

  1. Archiviare l'URL dell'applicazione del servizio ordini in una variabile per il test
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Crea una richiesta di ordine e pubblica un nuovo ordine nel database Firestore
curl --request POST $ORDER_SERVICE_URL/order \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "Jane Doe",
         "email": "Jane.Doe-cymbaleats@gmail.com",
    "address": "123 Maple",
    "city": "Buffalo",
    "state": "NY",
    "zip": "12346",
    "orderItems": [
        {
            "id": 1
        }
    ]
}'

Output di esempio

{"orderNumber":46429}

Salva il numero dell'ordine per utilizzarlo in un secondo momento

export ORDER_NUMBER=<value_from_output>

Visualizza risultati

Visualizza i risultati in Firestore

  1. Vai alla console di Firestore.
  2. Fai clic su Dati

465ceca6198b2b88.png

Aggiorna un documento

L'ordine inviato non includeva la quantità.

  1. Aggiorna il record e aggiungi una coppia chiave-valore di quantità
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Output di esempio

{"status":"success"}

Visualizza risultati

Visualizza i risultati in Firestore

  1. Vai alla console di Firestore.
  2. Fai clic su Dati

cfcf78d200e15b84.png

Eliminare un documento

  1. Elimina l'elemento 46429 dalla raccolta ordini Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Visualizza risultati

  1. Vai alla console di Firestore.
  2. Fai clic su Dati

73e14d69211d1539.png

11. Complimenti!

Congratulazioni, hai terminato il lab.

Passaggi successivi

Esplora altri codelab di Cymbal Eats:

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è quello di eliminare il progetto che hai creato per il tutorial.