Łączenie z w pełni zarządzanymi bazami danych z Cloud Run

1. Przegląd

W tym module zintegrujesz bezserwerowe bazy danych(Spanner i Firestore) z aplikacjami(Go i Node.js) działającymi w Cloud Run. Aplikacja Cymbal Eats obejmuje wiele usług działających w Cloud Run. W kolejnych krokach skonfigurujesz usługi tak, aby korzystały z relacyjnej bazy danych Cloud Spanner i dokumentowej bazy danych NoSQL Cloud Firestore. Korzystanie z usług bezserwerowych w przypadku warstwy danych i środowiska wykonawczego aplikacji pozwala wyeliminować konieczność zarządzania infrastrukturą i skupić się na tworzeniu aplikacji zamiast na kosztach ogólnych.

2. Czego się nauczysz

W tym module nauczysz się:

  • Integracja Spannera
  • Włącz usługi zarządzane Spanner
  • Integracja z kodem
  • Wdrażanie kodu łączącego się ze Spannerem
  • Integracja Firestore
  • Włączanie usług zarządzanych Firestore
  • Integracja z kodem
  • Wdrażanie kodu łączącego się z Firestore

3. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Konfigurowanie środowiska

  1. Tworzenie zmiennej identyfikatora projektu
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. Włączanie interfejsów Spanner API, Cloud Run API, Cloud Build API i Artifact Registry API
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. Klonowanie repozytorium
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Przejdź do katalogu
cd cymbal-eats/inventory-service/spanner

4. Tworzenie i konfigurowanie instancji usługi Spanner

Spanner to relacyjna baza danych backendu usług inwentaryzacyjnych. W kolejnych krokach utworzysz instancję, bazę danych i schemat usługi Spanner.

Utwórz instancję

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

Przykładowe dane wyjściowe

Creating instance...done.   
  1. Sprawdzanie, czy instancja Spanner jest prawidłowo skonfigurowana
gcloud spanner instances list

Przykładowe dane wyjściowe

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

Tworzenie bazy danych i schematu

Utwórz nową bazę danych i użyj języka definiowania danych (DDL) standardowej wersji SQL od Google, aby utworzyć schemat bazy danych.

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

Przykładowe dane wyjściowe

Creating database...done.

Sprawdzanie stanu i schematu bazy danych

  1. Wyświetlanie stanu bazy danych
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Przykładowe dane wyjściowe

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. Wyświetlanie schematu bazy danych
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Przykładowe dane wyjściowe

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

5. Integracja Spannera

W tej sekcji dowiesz się, jak zintegrować Spannera z aplikacją. SQL Spanner udostępnia też biblioteki klienta, sterowniki JDBC, sterowniki R2DBC, interfejsy API REST i interfejsy API RPC, które umożliwiają integrację Spannera z dowolną aplikacją.

W następnej sekcji użyjesz biblioteki klienta Go, aby zainstalować, uwierzytelnić i zmodyfikować dane w Spannerze.

Instalowanie biblioteki klienta

Biblioteka klienta Cloud Spanner ułatwia integrację z Cloud Spanner, ponieważ automatycznie używa domyślnego uwierzytelniania aplikacji (ADC) do znajdowania danych logowania do konta usługi.

Konfigurowanie uwierzytelniania

Google Cloud CLI i biblioteki klienta Google Cloud automatycznie wykrywają, kiedy są uruchamiane w Google Cloud, i używają konta usługi środowiska wykonawczego bieżącej wersji Cloud Run. Ta strategia nosi nazwę domyślne uwierzytelnianie aplikacji i umożliwia przenoszenie kodu między różnymi środowiskami.

Zamiast domyślnego konta usługi najlepiej jest jednak utworzyć dedykowaną tożsamość, przypisując do niej konto usługi zarządzane przez użytkownika.

  1. Przypisz do konta usługi rolę administratora bazy danych Spanner.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Przykładowe dane wyjściowe

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

Korzystanie z bibliotek klienta

Biblioteki klienta Spanner upraszczają integrację z Spannerem i są dostępne w wielu popularnych językach programowania.

Tworzenie klienta usługi Spanner

Klient Spanner to klient do odczytywania i zapisywania danych w bazie danych Cloud Spanner. Klient może być bezpiecznie używany równocześnie, z wyjątkiem metody Close.

Poniższy fragment kodu tworzy klienta Spanner.

main.go

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

Klient to połączenie z bazą danych. Wszystkie interakcje z Cloud Spanner muszą przechodzić przez klienta. Zwykle tworzysz klienta podczas uruchamiania aplikacji, a potem używasz go ponownie do odczytywania, zapisywania i wykonywania transakcji. Każdy klient korzysta z zasobów w Cloud Spanner.

Modyfikowanie danych

Istnieje kilka sposobów wstawiania, aktualizowania i usuwania danych z bazy danych Spanner. Poniżej znajdziesz listę dostępnych metod.

W tym module nauczysz się używać mutacji do modyfikowania danych w Spannerze.

Mutacje w usłudze Spanner

Mutacja to kontener operacji mutacji. Mutacja to sekwencja wstawień, aktualizacji i usunięć, które Cloud Spanner stosuje atomowo do różnych wierszy i tabel w bazie danych Cloud Spanner.

main.go

m := []*spanner.Mutation{}

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

Fragment kodu wstawia nowy wiersz do tabeli historii asortymentu.

Wdrażanie i testowanie

Po skonfigurowaniu Spannera i zapoznaniu się z kluczowymi elementami kodu możesz wdrożyć aplikację w Cloud Run.

Wdrażanie aplikacji w Cloud Run

Cloud Run może automatycznie kompilować, przesyłać i wdrażać Twój kod za pomocą jednego polecenia. W tym poleceniu wywołasz polecenie deploy w usłudze run, przekazując zmienne używane przez uruchomioną aplikację, takie jak utworzona wcześniej zmienna SPANNER_CONNECTION_STRING.

  1. Kliknij Otwórz terminal.
  2. Wdrażanie usługi inwentaryzacyjnej w 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

Przykładowe dane wyjściowe

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

Testowanie aplikacji Cloud Run

Wstawianie elementu

  1. Wpisz w Cloud Shell to polecenie.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Przykładowe dane wyjściowe

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

Wysyłanie zapytania o produkt

  1. Wysyłanie zapytań do usługi asortymentu
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Przykładowa odpowiedź

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. Koncepcje Spannera

Cloud Spanner wysyła zapytania do baz danych za pomocą deklaratywnych instrukcji SQL. Instrukcje SQL wskazują, czego oczekuje użytkownik, bez opisywania, jak uzyskać wyniki.

  1. W terminalu wpisz to polecenie, aby wysłać zapytanie do tabeli o utworzony wcześniej rekord.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Przykładowe dane wyjściowe

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Plany wykonywania zapytań

Plan wykonywania zapytania to seria kroków, które usługa Spanner wykonuje, aby uzyskać wyniki. Wyniki konkretnej instrukcji SQL można uzyskać na kilka sposobów. Plany wykonywania zapytań są dostępne w konsoli i bibliotekach klienta. Aby sprawdzić, jak Spanner obsługuje zapytania SQL:

  1. W konsoli otwórz stronę instancji Cloud Spanner.
  2. Otwórz instancje Cloud Spanner
  3. Kliknij nazwę instancji Cloud Spanner. W sekcji baz danych wybierz bazę danych, do której chcesz wysłać zapytanie.
  4. Kliknij Zapytanie.
  5. Wpisz w edytorze zapytań to zapytanie:
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Kliknij URUCHOM.
  2. Kliknij WYJAŚNIENIE.

W Cloud Console wyświetli się wizualny plan wykonania zapytania.

149f8bae468f8b34.png

Optymalizator zapytań

Optymalizator zapytań Cloud Spanner porównuje alternatywne plany wykonania i wybiera najbardziej wydajny z nich. Z czasem optymalizator zapytań będzie się rozwijać, poszerzając wybór w planie wykonywania zapytań i zwiększając dokładność szacunków, które wpływają na te wybory, co doprowadzi do bardziej wydajnych planów wykonywania zapytań.

Cloud Spanner wdraża aktualizacje optymalizatora jako nowe wersje optymalizatora zapytań. Domyślnie każda baza danych zaczyna korzystać z najnowszej wersji optymalizatora nie wcześniej niż 30 dni po jej udostępnieniu.

Aby sprawdzić wersję używaną podczas wykonywania zapytania w gcloud spanner, ustaw flagę –query-mode na PROFILE.

  1. Aby wyświetlić wersję optymalizatora, wpisz to polecenie:
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Przykładowe dane wyjściowe

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:

Aktualizowanie wersji optymalizatora

Najnowsza wersja w momencie tworzenia tego laboratorium to wersja 4. Następnie zaktualizujesz tabelę Spanner, aby optymalizator zapytań korzystał z wersji 4.

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

Przykładowe dane wyjściowe

Schema updating...done. 
  1. Aby wyświetlić aktualizację wersji optymalizatora, wpisz to polecenie:
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Przykładowe dane wyjściowe

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

Wyświetlanie wersji optymalizatora zapytań w narzędziu Metrics Explorer

Za pomocą narzędzia Metrics Explorer w Cloud Console możesz wizualizować liczbę zapytań dotyczących instancji bazy danych. W każdej bazie danych możesz sprawdzić, która wersja optymalizatora jest używana.

  1. W konsoli Cloud otwórz Monitorowanie i w menu po lewej stronie wybierz Metrics Explorer.
  2. W polu Typ zasobu wybierz Instancja Cloud Spanner.
  3. W polu Rodzaj danych wybierz Liczba zapytań i kliknij Zastosuj.
  4. W polu Grupuj według wybierz kolejno: database, optimizer_version i status.

581b859c25790b21.png

7. Tworzenie i konfigurowanie bazy danych Firestore

Firestore to baza danych dokumentów NoSQL zaprojektowana pod kątem automatycznego skalowania, wysokiej wydajności i łatwego tworzenia aplikacji. Interfejs Firestore ma wiele funkcji podobnych do tradycyjnych baz danych, ale baza danych NoSQL różni się od nich sposobem opisywania relacji między obiektami danych.

Z tego zadania dowiesz się, jak utworzyć aplikację Cloud Run do obsługi zamówień, która korzysta z Firestore. Przed rozpoczęciem zamówienia usługa zamawiania wywoła usługę asortymentu utworzoną w poprzedniej sekcji, aby wysłać zapytanie do bazy danych Spanner. Dzięki tej usłudze będziesz mieć pewność, że masz wystarczającą ilość asortymentu i możesz zrealizować zamówienie.

6843abaf4263e112.png

8. Koncepcje Firestore

Model danych

Baza danych Firestore składa się z kolekcji i dokumentów.

b60acd63d4793a6c.png

Dokumenty

Każdy dokument zawiera zestaw par klucz-wartość. Firestore jest zoptymalizowana pod kątem przechowywania dużych zbiorów małych dokumentów.

5571cb2f261d2dbe.png

Kolekcje

Wszystkie dokumenty muszą być przechowywane w kolekcjach. Dokumenty mogą zawierać podkolekcje i zagnieżdżone obiekty, w tym pola podstawowe, takie jak ciągi znaków, lub złożone obiekty, takie jak listy.

5811378cb721e5ec.png

Utwórz bazę danych Firestore

  1. Tworzenie bazy danych Firestore
gcloud firestore databases create --location=$REGION

Przykładowe dane wyjściowe

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

9. Integracja Firestore z aplikacją

W tej sekcji zaktualizujesz konto usługi, dodasz konta usługi z dostępem do Firestore, sprawdzisz i wdrożysz reguły zabezpieczeń Firestore oraz sprawdzisz, jak dane są modyfikowane w Firestore.

Konfigurowanie uwierzytelniania

  1. Przyznawanie kontu usługi roli użytkownika Datastore
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Przykładowe dane wyjściowe

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

Reguły zabezpieczeń Firestore

Reguły zabezpieczeń zapewniają kontrolę dostępu i weryfikację danych w prostym, ale wyrazistym formacie.

  1. Przejdź do katalogu order-service/starter-code.
cd ~/cymbal-eats/order-service
  1. Otwórz plik firestore.rules w edytorze Cloud
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
    }
  }
}

Ostrzeżenie: zalecamy ograniczenie dostępu do pamięci Firestore. Na potrzeby tego modułu dozwolone są wszystkie odczyty. Nie jest to zalecana konfiguracja produkcyjna.

Włączanie usług zarządzanych Firestore

  1. Kliknij Otwórz terminal.
  2. Utwórz plik .firebaserc z bieżącym identyfikatorem projektu. Ustawienia miejsc docelowych wdrażania są przechowywane w pliku .firebaserc w katalogu projektu.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Pobieranie pliku binarnego Firebase
curl -sL https://firebase.tools | upgrade=true bash

Przykładowe dane wyjściowe

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. wdrażanie reguł Firestore;
firebase deploy 

Przykładowe dane wyjściowe

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

Modyfikowanie danych

Kolekcje i dokumenty są tworzone w Firestore niejawnie. Wystarczy przypisać dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Firestore go utworzy.

Dodawanie danych do Firestore

Dane można zapisywać w Cloud Firestore na kilka sposobów:

  • Ustaw dane dokumentu w kolekcji, wyraźnie określając identyfikator dokumentu.
  • Dodaj nowy dokument do kolekcji. W takim przypadku Cloud Firestore automatycznie generuje identyfikator dokumentu.
  • Utwórz pusty dokument z automatycznie wygenerowanym identyfikatorem i przypisz do niego dane później.

W następnej sekcji dowiesz się, jak utworzyć dokument za pomocą wybranej metody.

Ustawianie dokumentu

Utwórz dokument za pomocą metody set(). W przypadku metody set() musisz określić identyfikator dokumentu, który chcesz utworzyć.

Zapoznaj się z fragmentem kodu poniżej.

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

Ten kod utworzy dokument z identyfikatorem dokumentu wygenerowanym przez użytkownika 123. Aby Firestore wygenerował identyfikator w Twoim imieniu, użyj metody add() lub create().

Aktualizowanie dokumentów

Metoda aktualizacji update() umożliwia aktualizowanie niektórych pól dokumentu bez zastępowania całego dokumentu.

We fragmencie poniżej kod aktualizuje zamówienie 123.

index.js

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

Usuwanie dokumentów

W Firestore możesz usuwać kolekcje, dokumenty lub określone pola z dokumentu. Aby usunąć dokument, użyj metody delete().

Poniższy fragment kodu usuwa zamówienie 123.

index.js

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

10. Wdrażanie i testowanie

W tej sekcji wdrożysz aplikację w Cloud Run i przetestujesz metody tworzenia, aktualizowania i usuwania.

Wdrażanie aplikacji w Cloud Run

  1. Zapisz adres URL w zmiennej INVENTORY_SERVICE_URL, aby zintegrować go z usługą Inventory Service.
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Wdróż usługę zamówień
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

Przykładowe dane wyjściowe

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

Testowanie aplikacji Cloud Run

Utwórz dokument

  1. Przechowywanie adresu URL aplikacji usługi zamówień w zmiennej na potrzeby testowania
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Tworzenie prośby o zamówienie i publikowanie nowego zamówienia w bazie danych 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
        }
    ]
}'

Przykładowe dane wyjściowe

{"orderNumber":46429}

Zapisz numer zamówienia do późniejszego wykorzystania

export ORDER_NUMBER=<value_from_output>

Pokaż wyniki

Wyświetlanie wyników w Firestore

  1. Otwórz konsolę Firestore.
  2. Kliknij Dane.

465ceca6198b2b88.png

Aktualizowanie dokumentu

Przesłane zamówienie nie zawierało ilości.

  1. Zaktualizuj rekord i dodaj parę klucz-wartość quantity
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Przykładowe dane wyjściowe

{"status":"success"}

Pokaż wyniki

Wyświetlanie wyników w Firestore

  1. Otwórz konsolę Firestore.
  2. Kliknij Dane.

cfcf78d200e15b84.png

Usuwanie dokumentu

  1. Usuń element 46429 z kolekcji zamówień Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Pokaż wyniki

  1. Otwórz konsolę Firestore.
  2. Kliknij Dane.

73e14d69211d1539.png

11. Gratulacje!

Gratulacje! Moduł został ukończony.

Co dalej?

Zapoznaj się z innymi ćwiczeniami z programowania dotyczącymi Cymbal Eats:

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku, możesz usunąć projekt zawierający te zasoby lub zachować projekt i usunąć poszczególne zasoby.

Usuwanie projektu

Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego w tym samouczku.