Verbindung zu vollständig verwalteten Datenbanken über Cloud Run herstellen

1. Übersicht

In diesem Lab binden Sie serverlose Datenbanken(Spanner und Firestore) in Anwendungen(Go und Node.js) ein, die in Cloud Run ausgeführt werden. Die Cymbal Eats-Anwendung umfasst mehrere Dienste, die in Cloud Run ausgeführt werden. In den folgenden Schritten konfigurieren Sie Dienste für die Verwendung der relationalen Cloud Spanner-Datenbank und Cloud Firestore, einer NoSQL-Dokumentdatenbank. Wenn Sie serverlose Produkte für die Datenstufe und die Anwendungslaufzeit verwenden, können Sie die Infrastrukturverwaltung abstrahieren und sich auf das Erstellen Ihrer Anwendung konzentrieren, anstatt sich über den Aufwand Gedanken zu machen.

2. Lerninhalte

In diesem Lab lernen Sie Folgendes:

  • Spanner einbinden
  • Verwaltete Spanner-Dienste aktivieren
  • In Code einbinden
  • Code bereitstellen, der eine Verbindung zu Spanner herstellt
  • Firestore einbinden
  • Verwaltete Firestore-Dienste aktivieren
  • In Code einbinden
  • Code bereitstellen, der eine Verbindung zu Firestore herstellt

3. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf deine Projekt-ID verweisen, die üblicherweise als PROJECT_ID bezeichnet wird. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID generieren. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts erhalten.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab ist kostengünstig. Sie können die von Ihnen erstellten Ressourcen oder das Projekt löschen, um Ressourcen herunterzufahren, um zu vermeiden, dass über diese Anleitung hinaus Kosten anfallen. Neue Google Cloud-Nutzer haben Anspruch auf das kostenlose Testprogramm mit 300$Guthaben.

Umgebung einrichten

  1. Variable für Projekt-ID erstellen
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. Spanner, Cloud Run, Cloud Build und Artifact Registry APIs aktivieren
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. Repository klonen
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Verzeichnis aufrufen
cd cymbal-eats/inventory-service/spanner

4. Spanner-Instanz erstellen und konfigurieren

Spanner ist die relationale Back-End-Datenbank für Inventardienste. In den folgenden Schritten erstellen Sie eine Spanner-Instanz, eine Datenbank und ein Schema.

Instanz erstellen

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

Beispielausgabe

Creating instance...done.   
  1. Prüfen, ob die Spanner-Instanz richtig konfiguriert ist
gcloud spanner instances list

Beispielausgabe

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

Datenbank und Schema erstellen

Erstellen Sie eine neue Datenbank und verwenden Sie die Datendefinitionssprache (DDL) von Google-Standard-SQL, um das Datenbankschema zu erstellen.

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

Beispielausgabe

Creating database...done.

Datenbankstatus und -schema überprüfen

  1. Status der Datenbank ansehen
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Beispielausgabe

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. Schema der Datenbank ansehen
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Beispielausgabe

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

5. Spanner einbinden

In diesem Abschnitt erfahren Sie, wie Sie Spanner in Ihre Anwendung einbinden. Darüber hinaus bietet SQL Spanner Clientbibliotheken, JDBC-Treiber, R2DBC-Treiber, REST APIs und RPC APIs, mit denen Sie Spanner in jede Anwendung einbinden können.

Im nächsten Abschnitt verwenden Sie die Go-Clientbibliothek, um Daten in Spanner zu installieren, zu authentifizieren und zu ändern.

Clientbibliothek installieren

Die Cloud Spanner-Clientbibliothek erleichtert die Einbindung in Cloud Spanner, da die Anmeldedaten für Ihr Dienstkonto automatisch mithilfe der Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC) ermittelt werden

Authentifizierung einrichten

Die Google Cloud CLI und Google Cloud-Clientbibliotheken erkennen automatisch, wenn sie in Google Cloud ausgeführt werden, und verwenden das Laufzeitdienstkonto der aktuellen Cloud Run-Version. Diese Strategie wird als Standardanmeldedaten für Anwendungen bezeichnet und ermöglicht die Portabilität von Code über mehrere Umgebungen hinweg.

Es empfiehlt sich jedoch, eine dedizierte Identität zu erstellen, indem Sie ihr ein vom Nutzer verwaltetes Dienstkonto anstelle des Standarddienstkontos zuweisen.

  1. Dem Dienstkonto die Rolle „Spanner-Datenbankadministrator“ gewähren
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Beispielausgabe

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

Clientbibliotheken verwenden

Die Spanner-Clientbibliotheken abstrahieren die Komplexität der Einbindung in Spanner und sind in vielen gängigen Programmiersprachen verfügbar.

Spanner-Client erstellen

Der Spanner-Client ist ein Client zum Lesen und Schreiben von Daten in einer Cloud Spanner-Datenbank. Ein Client kann sicher gleichzeitig verwendet werden, mit Ausnahme seiner Close-Methode.

Mit dem Snippet unten wird ein Spanner-Client erstellt

main.go

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

Sie können sich einen Client wie eine Datenbankverbindung vorstellen: Alle Interaktionen mit Cloud Spanner müssen über einen Client verlaufen. In der Regel erstellen Sie einen Client, wenn Ihre Anwendung gestartet wird. Anschließend verwenden Sie diesen Client zum Lesen, Schreiben und Ausführen von Transaktionen. Jeder Client verwendet Ressourcen in Cloud Spanner.

Daten ändern

Es gibt mehrere Möglichkeiten, Daten in eine Spanner-Datenbank einzufügen, zu aktualisieren und zu löschen. Nachfolgend sind die verfügbaren Methoden aufgeführt.

In diesem Lab verwenden Sie Mutationen, um Daten in Spanner zu ändern.

Mutationen in Spanner

Eine Mutation ist ein Container für Mutationsvorgänge. Eine Mutation stellt eine Folge von Einfügungs-, Aktualisierungs- und Löschvorgängen dar, die Cloud Spanner in kleinstmöglichen Schritten auf verschiedene Zeilen und Tabellen in einer Cloud Spanner-Datenbank anwendet.

main.go

m := []*spanner.Mutation{}

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

Mit dem Code-Snippet wird eine neue Zeile in die Tabelle mit dem Inventarverlauf eingefügt.

Bereitstellen und testen

Nachdem Sie Spanner konfiguriert und die wichtigsten Codeelemente überprüft haben, können Sie die Anwendung in Cloud Run bereitstellen.

Anwendung in Cloud Run bereitstellen

Mit Cloud Run können Sie Code mit einem einzigen Befehl automatisch erstellen, per Push übertragen und bereitstellen. Im folgenden Befehl rufen Sie den Befehl deploy für den Dienst run auf und übergeben die Variablen, die von der laufenden Anwendung verwendet werden, z. B. SPANNER_CONNECTION_STRING, die Sie zuvor erstellt haben.

  1. Klicken Sie auf „Terminal öffnen“.
  2. Inventardienst in Cloud Run bereitstellen
gcloud run deploy inventory-service \
    --source . \
    --region $REGION \
    --update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
    --allow-unauthenticated \
    --project=$PROJECT_ID \
    --quiet

Beispielausgabe

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. Dienst-URL speichern
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

Cloud Run-Anwendung testen

Element einfügen

  1. Geben Sie in Cloud Shell den folgenden Befehl ein.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Beispielausgabe

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

Element abfragen

  1. Inventardienst abfragen
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Beispielantwort

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. Spanner-Konzepte

Cloud Spanner fragt seine Datenbanken mit deklarativen SQL-Anweisungen ab. SQL-Anweisungen geben an, was die Nutzenden wollen, ohne zu beschreiben, wie die Ergebnisse erzielt werden.

  1. Geben Sie im Terminal diesen Befehl ein, um den zuvor erstellten Eintrag in der Tabelle abzufragen.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Beispielausgabe

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Abfrageausführungspläne

Ein Abfrageausführungsplan besteht aus einer Reihe von Schritten, die Spanner verwendet, um Ergebnisse zu erhalten. Es gibt mehrere Möglichkeiten, die Ergebnisse einer bestimmten SQL-Anweisung zu erhalten. Abfrageausführungspläne sind in der Console und den Clientbibliotheken verfügbar. So erfahren Sie, wie Spanner SQL-Abfragen verarbeitet:

  1. Öffnen Sie in der Console die Seite mit den Cloud Spanner-Instanzen.
  2. Cloud Spanner-Instanzen aufrufen
  3. Klicken Sie auf den Namen der Cloud Spanner-Instanz. Wählen Sie im Abschnitt „Datenbanken“ die Datenbank aus, die Sie abfragen möchten.
  4. Klicken Sie auf Abfrage.
  5. Geben Sie die folgende Abfrage in den Abfrageeditor ein
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Klicken Sie auf AUSFÜHREN
  2. Klicken Sie auf ERLÄUTERUNG

Die Cloud Console zeigt einen visuellen Ausführungsplan für Ihre Abfrage an.

149f8bae468f8b34.png

Abfrageoptimierung

Die Cloud Spanner-Abfrageoptimierung vergleicht alternative Ausführungspläne und wählt den effizientesten aus. Im Laufe der Zeit wird sich die Abfrageoptimierung weiterentwickeln, indem sie die Auswahlmöglichkeiten im Plan für die Abfrageausführung erweitert und die Genauigkeit der Schätzungen verbessert, die auf diesen Entscheidungen beruhen. Dies führt zu effizienteren Plänen zur Abfrageausführung.

Cloud Spanner führt Aktualisierungen der Optimierung als neue Version der Abfrageoptimierung ein. Standardmäßig verwendet jede Datenbank frühestens 30 Tage nach der Veröffentlichung dieser Version die neueste Version des Optimierungstools.

Um die Version zu sehen, die beim Ausführen einer Abfrage in gcloud Spanner verwendet wird, setzen Sie das Flag –query-mode auf PROFILE.

  1. Geben Sie den folgenden Befehl ein, um die Optimierungsversion aufzurufen
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Beispielausgabe

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:

Optimierungsversion aktualisieren

Die neueste Version zum Zeitpunkt dieses Labs ist Version 4. Als Nächstes aktualisieren Sie die Spanner-Tabelle, um Version 4 für die Abfrageoptimierung zu verwenden.

  1. Optimierungstool aktualisieren
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

Beispielausgabe

Schema updating...done. 
  1. Geben Sie den folgenden Befehl ein, um die Aktualisierung der Optimierungsversion aufzurufen
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Beispielausgabe

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

Version der Abfrageoptimierung im Metrics Explorer visualisieren

Sie können den Metrics Explorer in der Cloud Console verwenden, um die Anzahl der Abfragen für Ihre Datenbankinstanz zu visualisieren. Sie können sehen, welche Optimierungsversion in jeder Datenbank verwendet wird.

  1. Rufen Sie in der Cloud Console Monitoring auf und wählen Sie im linken Menü Metrics Explorer aus.
  2. Wählen Sie im Feld Resource type (Ressourcentyp) die Cloud Spanner-Instanz aus.
  3. Wählen Sie im Feld Messwert die Option „Anzahl der Abfragen“ und dann „Übernehmen“ aus.
  4. Wählen Sie im Feld Gruppieren nach die Option „database“, „optimize_version“ und „status“ aus.

581b859c25790b21.png

7. Firestore-Datenbank erstellen und konfigurieren

Firestore ist eine NoSQL-Dokumentdatenbank, die auf Autoscaling, hohe Leistung und einfache Anwendungsentwicklung ausgelegt ist. Obwohl die Firestore-Oberfläche viele Merkmale aufweist, die herkömmliche Datenbanken mit sich bringen, beschreibt eine NoSQL-Datenbank die Beziehungen zwischen Datenobjekten auf andere Weise.

In der folgenden Aufgabe erfahren Sie, wie Sie eine Cloud Run-Anwendung für den Bestelldienst erstellen, die von Firestore unterstützt wird. Der Sortierdienst ruft den im vorherigen Abschnitt erstellten Inventardienst auf, um die Spanner-Datenbank abzufragen, bevor der Auftrag gestartet wird. Mit diesem Dienst wird sichergestellt, dass genügend Inventar vorhanden ist und der Auftrag ausgeführt werden kann.

6843abaf4263e112.png

8. Firestore-Konzepte

Datenmodell

Eine Firestore-Datenbank besteht aus Sammlungen und Dokumenten.

b60acd63d4793a6c.png

Dokumente

Jedes Dokument enthält eine Reihe von Schlüssel/Wert-Paaren. Firestore ist für das Speichern großer Sammlungen kleiner Dokumente optimiert.

5571cb2f261d2dbe.png

Sammlungen

Sie müssen alle Dokumente in Sammlungen speichern. Dokumente können Untersammlungen und verschachtelte Objekte enthalten, einschließlich einfacher Felder wie Strings oder komplexe Objekte wie Listen.

5811378cb721e5ec.png

Firestore-Datenbank erstellen

  1. Firestore-Datenbank erstellen
gcloud firestore databases create --location=$REGION

Beispielausgabe

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

9. Firestore in Ihre Anwendung einbinden

In diesem Abschnitt aktualisieren Sie das Dienstkonto, fügen Dienstkonten für den Firestore-Zugriff hinzu, überprüfen und stellen die Firestore-Sicherheitsregeln und prüfen, wie Daten in Firestore geändert werden.

Authentifizierung einrichten

  1. Datastore-Nutzerrolle dem Dienstkonto zuweisen
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Beispielausgabe

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

Firestore-Sicherheitsregeln

Sicherheitsregeln ermöglichen Zugriffssteuerung und Datenvalidierung ein effektives und dennoch unkompliziertes Format.

  1. Verzeichnis „order-service/starter-code“ aufrufen
cd ~/cymbal-eats/order-service
  1. Datei „firestore.rules“ im Cloud-Editor öffnen
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
    }
  }
}

Warnung: Es hat sich bewährt, den Zugriff auf Firestore-Speicher zu beschränken. Für dieses Lab sind alle Lesevorgänge zulässig. Dies ist keine empfohlene Produktionskonfiguration.

Verwaltete Firestore-Dienste aktivieren

  1. Klicken Sie auf „Terminal öffnen“.
  2. Erstellen Sie eine .firebaserc-Datei mit der aktuellen Projekt-ID. Die Einstellungen für Bereitstellungsziele werden in der .firebaserc-Datei in Ihrem Projektverzeichnis gespeichert.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Firebase-Binärprogramm herunterladen
curl -sL https://firebase.tools | upgrade=true bash

Beispielausgabe

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. Firestore-Regeln bereitstellen
firebase deploy 

Beispielausgabe

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

Daten ändern

Sammlungen und Dokumente werden implizit in Firestore erstellt. Sie müssen einem Dokument innerhalb einer Sammlung einfach Daten zuordnen. Wenn die Sammlung oder das Dokument nicht vorhanden ist, wird sie/es von Firestore erstellt.

Daten zu Firestore hinzufügen

Es gibt mehrere Möglichkeiten, Daten in Cloud Firestore zu schreiben:

  • Legen Sie die Daten eines Dokuments innerhalb einer Sammlung fest, indem Sie explizit eine Dokument-ID angeben.
  • Sie fügen einer Sammlung ein neues Dokument hinzu. In diesem Fall generiert Cloud Firestore automatisch die Dokument-ID.
  • Erstellen Sie ein leeres Dokument mit einer automatisch generierten ID und weisen Sie ihm später Daten zu.

Im nächsten Abschnitt erfahren Sie, wie Sie ein Dokument mit der set-Methode erstellen.

Dokument festlegen

Verwenden Sie die Methode set(), um ein Dokument zu erstellen. Bei der Methode set() müssen Sie eine ID für das zu erstellende Dokument angeben.

Sehen Sie sich das folgende Code-Snippet an.

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'
  });

Mit diesem Code wird ein Dokument mit der nutzergenerierten Dokument-ID 123 erstellt. Wenn Firestore in Ihrem Namen eine ID generieren soll, verwenden Sie die Methode add() oder create().

Dokumente aktualisieren

Mit der Aktualisierungsmethode update() können Sie einige Dokumentfelder aktualisieren, ohne das gesamte Dokument zu überschreiben.

Im folgenden Snippet aktualisiert der Code die Reihenfolge 123

index.js

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

Dokumente löschen

In Firestore können Sie Sammlungen, Dokumente oder bestimmte Felder aus einem Dokument löschen. Verwenden Sie zum Löschen eines Dokuments die Methode delete().

Das folgende Snippet löscht Bestellung 123.

index.js

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

10. Bereitstellen und testen

In diesem Abschnitt stellen Sie die Anwendung in Cloud Run bereit und testen die Methoden zum Erstellen, Aktualisieren und Löschen.

Anwendung in Cloud Run bereitstellen

  1. Speichern Sie die URL in der Variablen INVENTORY_SERVICE_URL zur Integration mit dem Inventardienst
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Bestelldienst bereitstellen
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

Beispielausgabe

[...]
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

Cloud Run-Anwendung testen

Dokument erstellen

  1. URL der Bestelldienstanwendung zu Testzwecken in einer Variablen speichern
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Bestellanfrage erstellen und neue Bestellung in der Firestore-Datenbank veröffentlichen
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
        }
    ]
}'

Beispielausgabe

{"orderNumber":46429}

Bestellnummer zur späteren Verwendung speichern

export ORDER_NUMBER=<value_from_output>

Ergebnisse ansehen

Ergebnisse in Firestore ansehen

  1. Rufen Sie die Firestore-Konsole auf.
  2. Klicken Sie auf „Daten“.

465ceca6198b2b88.png

Dokument aktualisieren

Die eingereichte Bestellung enthielt keine Bestellmenge.

  1. Datensatz aktualisieren und Schlüssel/Wert-Paar für die Menge hinzufügen
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Beispielausgabe

{"status":"success"}

Ergebnisse ansehen

Ergebnisse in Firestore ansehen

  1. Rufen Sie die Firestore-Konsole auf.
  2. Klicken Sie auf „Daten“.

cfcf78d200e15b84.png

Dokument löschen

  1. Element 46429 aus der Firestore-Bestellungssammlung löschen
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Ergebnisse ansehen

  1. Rufen Sie die Firestore-Konsole auf.
  2. Klicken Sie auf „Daten“.

73e14d69211d1539.png

11. Glückwunsch!

Sie haben das Lab abgeschlossen.

Nächste Schritte:

Weitere Codelabs von Cymbal Eats:

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen, das die Ressourcen enthält, oder das Projekt beibehalten und die einzelnen Ressourcen löschen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.