Подключение к полностью управляемым базам данных из Cloud Run

1. Обзор

В этой лабораторной работе вы интегрируете бессерверные базы данных (Spanner и Firestore) с приложениями (Go и Node.js), работающими в Cloud Run. Приложение Cymbal Eats включает в себя несколько сервисов, работающих в Cloud Run. На следующих шагах вы настроите сервисы для использования реляционной базы данных Cloud Spanner и Cloud Firestore , документоориентированной базы данных NoSQL. Использование бессерверных продуктов для уровня данных и среды выполнения приложения позволяет абстрагироваться от управления инфраструктурой, сосредоточившись на разработке приложения, а не на проблемах с накладными расходами.

2. Чему вы научитесь

В этой лабораторной работе вы научитесь выполнять следующие действия:

  • Встроенный гаечный ключ
  • Включить управляемые сервисы Spanner
  • Интегрировать в код
  • Разверните код, подключающийся к Spanner.
  • Интегрировать Firestore
  • Включите управляемые службы Firestore
  • Интегрировать в код
  • Разверните код, подключающийся к Firestore.

3. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Настройка среды

  1. Создайте переменную с идентификатором проекта.
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. Включите API Spanner, Cloud Run, Cloud Build и 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. Клонируйте репозиторий
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Перейдите в каталог
cd cymbal-eats/inventory-service/spanner

4. Создайте и настройте экземпляр Spanner.

Spanner — это реляционная база данных, используемая в качестве бэкэнда для сервисов учета запасов. На следующих этапах вы создадите экземпляр Spanner, базу данных и схему.

Создайте экземпляр

  1. Создайте экземпляр Cloud Spanner.
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

Пример выходных данных

Creating instance...done.   
  1. Проверьте правильность настройки экземпляра Spanner.
gcloud spanner instances list

Пример выходных данных

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

Создайте базу данных и схему.

Создайте новую базу данных и используйте язык определения данных (DDL) стандартного SQL от Google для создания схемы базы данных.

  1. Создайте DDL-файл
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. Создайте базу данных Spanner.
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

Пример выходных данных

Creating database...done.

Проверьте состояние и схему базы данных.

  1. Просмотрите состояние базы данных.
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Пример выходных данных

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. Просмотрите схему базы данных.
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Пример выходных данных

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

5. Интегрирующий гаечный ключ

В этом разделе вы узнаете, как интегрировать Spanner в ваше приложение. Кроме того, SQL Spanner предоставляет клиентские библиотеки , драйверы JDBC , драйверы R2DBC , REST API и RPC API , которые позволяют интегрировать Spanner в любое приложение.

В следующем разделе вы будете использовать клиентскую библиотеку Go для установки, аутентификации и изменения данных в Spanner.

Установка клиентской библиотеки

Клиентская библиотека Cloud Spanner упрощает интеграцию с Cloud Spanner, автоматически используя учетные данные приложения по умолчанию (ADC) для поиска учетных данных вашей сервисной учетной записи.

Настройка аутентификации

Библиотеки Google Cloud CLI и Google Cloud Client автоматически определяют, работают ли они в Google Cloud, и используют учетную запись службы среды выполнения текущей версии Cloud Run. Эта стратегия называется «Учетные данные приложения по умолчанию» и обеспечивает переносимость кода между различными средами.

Однако лучше всего создать отдельный идентификатор, назначив ему управляемую пользователем учетную запись службы вместо учетной записи службы по умолчанию.

  1. Предоставьте учетной записи службы роль администратора базы данных Spanner.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Пример выходных данных

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

Использование клиентских библиотек

Клиентские библиотеки Spanner абстрагируют сложности интеграции со Spanner и доступны на многих популярных языках программирования.

Создайте клиент Spanner.

Клиент Spanner предназначен для чтения и записи данных в базу данных Cloud Spanner. Одновременное использование одного клиента безопасно, за исключением метода Close.

Приведённый ниже фрагмент кода создаёт клиент для ввода данных с помощью гаечного ключа.

main.go

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

Клиент можно рассматривать как соединение с базой данных: все ваши взаимодействия с Cloud Spanner должны проходить через клиент. Обычно вы создаете клиент при запуске приложения, а затем повторно используете этот клиент для чтения, записи и выполнения транзакций. Каждый клиент использует ресурсы в Cloud Spanner.

Изменить данные

Существует несколько способов вставки, обновления и удаления данных из базы данных Spanner. Ниже перечислены доступные методы.

В этой лабораторной работе вы будете использовать мутации для изменения данных в Spanner.

Мутации в Spanner

Мутация — это контейнер для операций изменения. Мутация представляет собой последовательность вставок, обновлений и удалений, которые Cloud Spanner атомарно применяет к различным строкам и таблицам в базе данных Cloud Spanner.

main.go

m := []*spanner.Mutation{}

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

Данный фрагмент кода вставляет новую строку в таблицу истории запасов.

Развертывание и тестирование

Теперь, когда Spanner настроен и вы проверили ключевые элементы кода, разверните приложение в Cloud Run.

Разверните приложение в Cloud Run.

Cloud Run может автоматически собирать, отправлять и развертывать ваш код одной командой. В следующей команде вы вызовете команду deploy в службе run , передав переменные, используемые запущенным приложением, такие как SPANNER_CONNECTION_STRING, которые вы создали ранее.

  1. Нажмите «Открыть терминал»
  2. Разверните службу инвентаризации в 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

Пример выходных данных

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. Сохраните URL-адрес сервиса
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

Протестируйте приложение Cloud Run.

Вставить элемент

  1. В Cloudshell введите следующую команду.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Пример выходных данных

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

Запросить информацию о товаре

  1. Запрос к службе инвентаризации
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Пример ответа

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. Понятия, связанные с гаечным ключом

Cloud Spanner выполняет запросы к своим базам данных с помощью декларативных SQL-запросов. SQL-запросы указывают, что именно хочет получить пользователь, не описывая, как именно будут получены результаты.

  1. В терминале введите эту команду, чтобы запросить у таблицы ранее созданную запись.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Пример выходных данных

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

планы выполнения запросов

План выполнения запроса — это последовательность шагов, которые Spanner использует для получения результатов. Существует несколько способов получения результатов конкретного SQL-запроса. Планы выполнения запросов доступны в консоли и клиентских библиотеках. Чтобы узнать, как Spanner обрабатывает SQL-запросы:

  1. В консоли откройте страницу экземпляров Cloud Spanner.
  2. Перейдите к экземплярам Cloud Spanner.
  3. Щелкните по имени экземпляра Cloud Spanner. В разделе баз данных выберите базу данных, к которой хотите выполнить запрос.
  4. Нажмите «Запрос».
  5. Введите следующий запрос в редакторе запросов.
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Нажмите ВЫПОЛНИТЬ
  2. Нажмите ПОЯСНЕНИЕ

В консоли Cloud Console отображается визуальный план выполнения вашего запроса.

149f8bae468f8b34.png

Оптимизатор запросов

Оптимизатор запросов Cloud Spanner сравнивает альтернативные планы выполнения и выбирает наиболее эффективный из них. Со временем оптимизатор запросов будет развиваться, расширяя выбор планов выполнения запросов и повышая точность оценок, лежащих в основе этих выборов, что приведет к созданию более эффективных планов выполнения запросов.

Cloud Spanner распространяет обновления оптимизатора запросов в виде новых версий. По умолчанию каждая база данных начинает использовать последнюю версию оптимизатора не ранее чем через 30 дней после ее выпуска.

Чтобы узнать, какая версия использовалась при выполнении запроса в gcloud spanner, установите флаг –query-mode в значение PROFILE.

  1. Введите следующую команду, чтобы просмотреть версию оптимизатора.
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Пример выходных данных

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:

Обновите версию оптимизатора.

На момент выполнения этой лабораторной работы использовалась самая новая версия — 4. Далее вам нужно будет обновить таблицу Spanner, чтобы использовать версию 4 для оптимизатора запросов.

  1. Обновите оптимизатор
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

Пример выходных данных

Schema updating...done. 
  1. Введите следующую команду, чтобы просмотреть обновление версии оптимизатора.
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Пример выходных данных

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

Визуализация версии оптимизатора запросов в обозревателе метрик.

В консоли Cloud Console вы можете использовать Metrics Explorer для визуализации количества запросов к вашему экземпляру базы данных. Вы также можете увидеть, какая версия оптимизатора используется в каждой базе данных.

  1. Перейдите в раздел «Мониторинг» в облачной консоли и выберите «Обозреватель метрик» в левом меню.
  2. В поле «Тип ресурса» выберите «Экземпляр Cloud Spanner».
  3. В поле «Метрика» выберите «Количество запросов» и нажмите «Применить».
  4. В поле «Группировать по» выберите базу данных, версию оптимизатора и статус.

581b859c25790b21.png

7. Создайте и настройте базу данных Firestore.

Firestore — это документоориентированная NoSQL-база данных, созданная для автоматического масштабирования, высокой производительности и упрощения разработки приложений. Хотя интерфейс Firestore обладает многими функциями традиционных баз данных, NoSQL-база данных отличается от них в описании связей между объектами данных.

В следующем задании вы найдете пошаговое руководство по созданию облачного приложения для обработки заказов на базе Firestore. Сервис обработки заказов будет обращаться к сервису управления запасами, созданному в предыдущем разделе, для запроса к базе данных Spanner перед началом обработки заказа. Этот сервис обеспечит наличие достаточного количества товара на складе и возможность выполнения заказа.

6843abaf4263e112.png

8. Firestore Concepts

модель данных

База данных Firestore состоит из коллекций и документов.

b60acd63d4793a6c.png

Документы

Каждый документ содержит набор пар ключ-значение. Firestore оптимизирован для хранения больших коллекций небольших документов.

5571cb2f261d2dbe.png

Коллекции

Все документы необходимо хранить в коллекциях. Документы могут содержать подколлекции и вложенные объекты, включая примитивные поля, такие как строки, или сложные объекты, такие как списки.

5811378cb721e5ec.png

Создайте базу данных Firestore.

  1. Создайте базу данных Firestore.
gcloud firestore databases create --location=$REGION

Пример выходных данных

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

9. Интеграция Firestore в ваше приложение

В этом разделе вы обновите учетную запись службы, добавите учетные записи служб доступа к Firestore, проверите и развернете правила безопасности Firestore, а также ознакомитесь с тем, как изменяются данные в Firestore.

Настройка аутентификации

  1. Предоставьте учетной записи службы роль пользователя «Хранилище данных».
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Пример выходных данных

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

Правила безопасности Firestore

Правила безопасности обеспечивают контроль доступа и проверку данных в выразительном, но простом формате.

  1. Перейдите в каталог order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Откройте файл firestore.rules в облачном редакторе.
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
    }
  }
}

Предупреждение: Рекомендуется ограничить доступ к хранилищу Firestore. Для целей данной лабораторной работы разрешены все операции чтения. Данная конфигурация не рекомендуется для использования в производственной среде.

Включите управляемые службы Firestore

  1. Нажмите «Открыть терминал»
  2. Создайте файл .firebaserc с текущим идентификатором проекта. Настройки целей развертывания хранятся в файле .firebaserc в каталоге вашего проекта.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Скачать бинарный файл firebase
curl -sL https://firebase.tools | upgrade=true bash

Пример выходных данных

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. Разверните правила Firestore.
firebase deploy 

Пример выходных данных

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

Изменить данные

В Firestore коллекции и документы создаются автоматически. Просто присвойте данные документу внутри коллекции. Если коллекция или документ не существуют, Firestore создаст их.

Добавить данные в Firestore

Существует несколько способов записи данных в Cloud Firestore:

  • Задайте данные документа в коллекции, явно указав идентификатор документа.
  • Добавьте новый документ в коллекцию. В этом случае Cloud Firestore автоматически сгенерирует идентификатор документа.
  • Создайте пустой документ с автоматически сгенерированным идентификатором и присвойте ему данные позже.

В следующем разделе мы расскажем вам, как создать документ, используя метод заданий.

Установить документ

Для создания документа используйте метод ` set() . При использовании метода set() ` необходимо указать идентификатор создаваемого документа.

Взгляните на приведенный ниже фрагмент кода.

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

Этот код создаст документ с идентификатором 123, сгенерированным пользователем. Чтобы Firestore сгенерировал идентификатор от вашего имени, используйте методы add() или create() .

Обновить документы

Метод ` update() позволяет обновлять некоторые поля документа без перезаписи всего документа.

В приведенном ниже фрагменте кода обновляется заказ 123.

index.js

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

Удалить документ

В Firestore можно удалять коллекции, документы или отдельные поля из документа. Для удаления документа используйте метод delete() .

Приведённый ниже фрагмент кода удаляет заказ 123.

index.js

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

10. Развертывание и тестирование

В этом разделе вы развернете приложение в Cloud Run и протестируете методы создания, обновления и удаления.

Разверните приложение в Cloud Run.

  1. Сохраните URL-адрес в переменной INVENTORY_SERVICE_URL для интеграции с системой учета запасов.
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Разверните службу обработки заказов.
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

Пример выходных данных

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

Создать документ

  1. Для тестирования сохраните URL-адрес приложения службы обработки заказов в переменную.
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Создайте запрос на заказ и добавьте новый заказ в базу данных 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
        }
    ]
}'

Пример выходных данных

{"orderNumber":46429}

Сохраните номер заказа для дальнейшего использования.

export ORDER_NUMBER=<value_from_output>

Просмотреть результаты

Результаты можно посмотреть в Firestore.

  1. Перейдите в консоль Firestore.
  2. Нажмите на «Данные»

465ceca6198b2b88.png

Обновить документ

В оформленном заказе не было указано количество.

  1. Обновите запись и добавьте пару ключ-значение "количество".
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Пример выходных данных

{"status":"success"}

Просмотреть результаты

Результаты можно посмотреть в Firestore.

  1. Перейдите в консоль Firestore.
  2. Нажмите на «Данные»

cfcf78d200e15b84.png

Удалить документ

  1. Удалите товар 46429 из коллекции заказов Firestore.
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Просмотреть результаты

  1. Перейдите в консоль Firestore.
  2. Нажмите на «Данные»

73e14d69211d1539.png

11. Поздравляем!

Поздравляем, вы завершили лабораторную работу!

Что дальше:

Ознакомьтесь с другими обучающими материалами Cymbal Eats:

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.

Удаление проекта

Самый простой способ избежать выставления счетов — удалить проект, созданный для этого урока.