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

1. Omówienie

W tym module zintegrujesz bezserwerowe bazy danych(Spanner i Firestore) z aplikacjami(Go i Node.js) uruchomionymi w Cloud Run. Aplikacja Cymbal Eats zawiera 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 z Cloud Firestore – bazy danych dokumentów NoSQL. Wykorzystanie usług bezserwerowych do obsługi poziomu danych i środowiska wykonawczego aplikacji pozwala na odizolowanie całego zarządzania infrastrukturą i skupienie się na tworzeniu aplikacji, zamiast martwić się o pracę.

2. Czego się nauczysz

Z tego modułu nauczysz się:

  • Zintegruj usługę Spanner
  • Włącz usługi zarządzane Spannera
  • Integracja z kodem
  • Wdrażanie kodu łączącego się z usługą Spanner
  • Integracja Firestore
  • Włącz usługi zarządzane 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 wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia 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.

Skonfiguruj środowisko

  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 API usług Spanner, Cloud Run, Cloud Build i 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. 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 inwentaryzacji. 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 Spannera 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 standardowego języka definiowania danych (DDL) w standardowej wersji Google SQL, 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 Spannera
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świetl schemat 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 usługi Spanner

W tej sekcji dowiesz się, jak zintegrować usługę Spanner z aplikacją. Dodatkowo SQL Spanner udostępnia biblioteki klienta, sterowniki JDBC, sterowniki R2DBC, interfejsy API typu R2DBC i interfejsy RPC API, które umożliwiają integrację usługi Spanner z dowolną aplikacją.

W następnej sekcji użyjesz biblioteki klienta w języku Go do instalowania, uwierzytelniania i modyfikowania danych w usłudze Spanner.

Instalowanie biblioteki klienta

Biblioteka klienta Cloud Spanner ułatwia integrację z Cloud Spanner dzięki automatycznemu korzystaniu z domyślnych danych uwierzytelniających aplikacji (ADC) do wyszukiwania danych logowania do konta usługi.

Konfigurowanie uwierzytelniania

Interfejs wiersza poleceń Google Cloud i biblioteki klienta Google Cloud automatycznie wykrywają, czy działają w Google Cloud, i używają środowiska wykonawczego konta usługi bieżącej wersji Cloud Run. Ta strategia nosi nazwę domyślnych danych logowania aplikacji i pozwala na przenoszenie kodu w wielu środowiskach.

Najlepiej jednak utworzyć tożsamość dedykowaną przez przypisanie jej do konta usługi zarządzanego przez użytkownika zamiast do domyślnego konta usługi.

  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 Spannera ułatwiają integrację z usługą Spanner i są dostępne w wielu popularnych językach programowania.

Tworzenie klienta usługi Spanner

Klient Spannera jest klientem umożliwiającym odczytywanie i zapisywanie danych w bazie danych Cloud Spanner. Z klienta można korzystać jednocześnie, z wyjątkiem metody Close.

Fragment kodu poniżej tworzy klienta Spannera

main.go

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

Można wyobrazić go sobie jako 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 do odczytywania, zapisywania i realizowania transakcji. Każdy klient używa zasobów w usłudze Cloud Spanner.

Modyfikowanie danych

Dane do bazy danych Spannera można wstawiać, aktualizować i usuwać na kilka sposobów. Poniżej znajdziesz listę dostępnych metod.

W tym module do modyfikowania danych w usłudze Spanner użyjesz mutacji.

Mutacje w usłudze Spanner

Mutacja to kontener na potrzeby operacji mutacji. Mutacja reprezentuje sekwencję wstawienia, 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 zasobów reklamowych.

Wdrażanie i testowanie

Usługa Spanner jest już skonfigurowana i sprawdziłeś(-aś) kluczowe elementy kodu, aby wdrożyć aplikację w Cloud Run.

Wdrażanie aplikacji w Cloud Run

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

  1. Kliknij Otwórz terminal.
  2. Wdrażanie usługi inwentaryzacji 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. Zapisywanie adresu 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. W Cloud Shell wpisz 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

Tworzenie zapytania dotyczącego elementu

  1. Wysyłanie zapytania do usługi inwentaryzacji
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. Pojęcia związane z usługą Spanner

Cloud Spanner wysyła zapytania do swoich baz danych przy użyciu deklaratywnych instrukcji SQL. Instrukcje SQL wskazują, czego oczekuje użytkownik, bez opisywania sposobu uzyskania wyników.

  1. Wpisz w terminalu to polecenie, aby wysłać zapytanie dotyczące utworzonego wcześniej rekordu do tabeli.
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 stosuje do uzyskania wyników. Istnieje kilka sposobów uzyskania wyników konkretnej instrukcji SQL. 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, której ma dotyczyć zapytanie.
  4. Kliknij Zapytanie.
  5. Wpisz to zapytanie w edytorze zapytań
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Kliknij URUCHOM
  2. Kliknij WYJAŚNIENIE

W konsoli Cloud wyświetli się plan wykonania zapytania.

149f8bae468f8b34.png

Optymalizator zapytań

Optymalizator zapytań Cloud Spanner porównuje alternatywne plany wykonania i wybiera najskuteczniejszy z nich. Z czasem optymalizator zapytań będzie ewoluować, poszerzając możliwości wyboru w planie wykonywania zapytań i poprawiając dokładność szacunków uwzględniających te wybory, co prowadzi do wydajniejszych planów wykonywania zapytań.

Cloud Spanner wdraża aktualizacje optymalizatora jako nowe wersje optymalizatora zapytań. Domyślnie każda baza danych zaczyna używać najnowszej wersji optymalizatora nie wcześniej niż 30 dni po wydaniu danej wersji.

Aby wyświetlić wersję używaną przy uruchamianiu zapytania w gcloud, ustaw flagę –query-mode na PROFILE

  1. Wpisz następujące polecenie, aby wyświetlić wersję optymalizatora
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:

Zaktualizuj wersję optymalizatora

Najnowsza wersja w chwili rozpoczęcia tego modułu to 4. Następnie zaktualizujesz tabelę Spanner, aby używała wersji 4 na potrzeby optymalizatora zapytań.

  1. Aktualizacja 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. Wpisz następujące polecenie, aby wyświetlić aktualizację wersji optymalizatora
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
[...]

Wizualizacja wersji optymalizatora zapytań w narzędziu Metrics Explorer

W konsoli Cloud możesz użyć narzędzia Metrics Explorer, aby zwizualizować liczbę zapytań dla instancji bazy danych. Możesz sprawdzić, która wersja optymalizatora jest używana w każdej bazie danych.

  1. W konsoli Cloud przejdź do usługi Monitoring i w menu po lewej stronie wybierz Metrics Explorer.
  2. W polu Typ zasobu wybierz instancję Cloud Spanner.
  3. W polu Dane wybierz Liczba zapytań i kliknij Zastosuj.
  4. W polu Pogrupuj według wybierz bazę danych, wersję optymalizatora i stan.

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. Chociaż interfejs Firestore ma wiele tych samych funkcji co tradycyjne bazy danych, baza danych NoSQL różni się od nich opisem relacji między obiektami danych.

Poniżej znajdziesz instrukcje tworzenia aplikacji Cloud Run usługi porządkowania przy użyciu Firestore. Przed rozpoczęciem zamówienia usługa porządkowania wywołuje usługę zasobów utworzoną w poprzedniej sekcji, aby wysłać zapytanie do bazy danych Spannera. Dzięki tej usłudze masz pewność, że w asortymencie dostępne są wystarczające zasoby reklamowe i że zamówienie będzie mogło zostać zrealizowane.

6843abaf4263e112.png

8. Pojęcia związane z 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ść. Usługa Firestore jest zoptymalizowana pod kątem przechowywania dużych kolekcji małych dokumentów.

5571cb2f261d2dbe.png

Kolekcje

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

5811378cb721e5ec.png

Tworzenie bazy 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 dostępu do Firestore, sprawdzisz i wdrożysz reguły zabezpieczeń Firestore oraz zobaczysz, jak dane są modyfikowane w Firestore.

Konfigurowanie uwierzytelniania

  1. Przypisz rolę użytkownika Datastore do konta usługi
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 ekspresywny, ale prosty format.

  1. Przejdź do katalogu order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Otwórz plik Firestore.rules w edytorze chmury
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: najlepiej jest ograniczyć dostęp do miejsca na dane Firestore. Na potrzeby tego modułu dozwolone są wszystkie odczyty. Nie jest to zalecana konfiguracja produkcyjna.

Włącz usługi zarządzane Firestore

  1. Kliknij Otwórz terminal.
  2. Utwórz plik .firebaserc z bieżącym identyfikatorem projektu. Ustawienia celów wdrożenia są przechowywane w pliku .firebaserc w katalogu projektu.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Pobierz plik binarny 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. Wdróż reguły 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 bezpośrednio w Firestore. Po prostu przypisz dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Firestore ją utworzy.

Dodaj dane do Firestore

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

  • Służy do ustawiania danych dokumentu w kolekcji, jednoznacznego określenia jego identyfikatora.
  • Dodaj nowy dokument do kolekcji. W takim przypadku Cloud Firestore automatycznie wygeneruje identyfikator dokumentu.
  • Utwórz pusty dokument z automatycznie generowanym identyfikatorem i przypisz do niego dane później.

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

Ustaw dokument

Aby utworzyć dokument, użyj metody set(). W przypadku metody set() musisz określić identyfikator tworzonego dokumentu.

Przyjrzyj się poniższym fragmentowi kodu.

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 wygenerowanym przez użytkownika identyfikatorem dokumentu 123. Aby usługa Firestore wygenerowała 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 kodu poniżej kolejność aktualizacji kodu to 123

index.js

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

Usuwanie dokumentów

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

Ten 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 przeprowadzić integrację z usługą Inventory
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Wdrażanie usługi składania 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. Zapisywanie adresu URL aplikacji obsługującej zamówienia w zmiennej do testowania
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Tworzenie żądania zamówienia 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 na później

export ORDER_NUMBER=<value_from_output>

Wyświetl wyniki

Wyświetl wyniki 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ść ilości
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"}

Wyświetl wyniki

Wyświetl wyniki 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}

Wyświetl wyniki

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

73e14d69211d1539.png

11. Gratulacje!

Gratulacje! Moduł ukończony.

Co dalej:

Poznaj inne ćwiczenia z programowania 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.

Usuwam projekt

Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego na potrzeby samouczka.