Подключение к полностью управляемым базам данных из 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 Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы всегда можете обновить его.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно идентифицируемый как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Альтернативно, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага и он сохраняется на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , которое используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи 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

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

Создайте новую базу данных и используйте стандартный язык определения данных SQL (DDL) 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. Создайте базу данных гаечных ключей
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 , API REST и API RPC , которые позволяют интегрировать Spanner в любое приложение.

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

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

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

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

Google Cloud CLI и клиентские библиотеки Google Cloud автоматически определяют, когда они работают в 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: 

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

План выполнения запроса — это серия шагов, которые Спаннер использует для получения результатов. Может быть несколько способов получить результаты конкретного оператора 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 Table, чтобы использовать версию 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, чтобы визуализировать количество запросов для вашего экземпляра базы данных. Вы можете увидеть, какая версия оптимизатора используется в каждой базе данных.

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

581b859c25790b21.png

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

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

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

6843abaf4263e112.png

8. Концепции пожарного хранилища

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

База данных 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() для создания документа. С помощью метода 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 за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы.

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

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