Como se conectar a bancos de dados totalmente gerenciados pelo Cloud Run

1. Visão geral

Neste laboratório, você vai integrar bancos de dados sem servidor(Spanner e Firestore) com aplicativos(Go e Node.js) em execução no Cloud Run. O aplicativo Cymbal Eats inclui vários serviços que são executados no Cloud Run. Nas etapas a seguir, você vai configurar serviços para usar o banco de dados relacional do Cloud Spanner e o Cloud Firestore, um banco de dados de documentos NoSQL. Com o uso de produtos sem servidor para o nível de dados e o ambiente de execução do aplicativo, é possível abstrair todo o gerenciamento de infraestrutura, concentrando-se na criação do aplicativo em vez de se preocupar com sobrecargas.

2. O que você vai aprender

Você vai aprender a:

  • Integrar o Spanner
  • Ativar os serviços gerenciados do Spanner
  • Integrar no código
  • Implantar o código se conectando ao Spanner
  • Integrar o Firestore
  • Ativar os serviços gerenciados do Firestore
  • Integrar no código
  • Implantar o código ao se conectar ao Firestore

3. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Configurar ambiente

  1. Criar uma variável de ID do projeto
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. Ative as APIs Spanner, Cloud Run, Cloud Build e 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. Clonar o repositório
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Navegue até o diretório
cd cymbal-eats/inventory-service/spanner

4. Criar e configurar uma instância do Spanner

O Spanner é o banco de dados relacional de back-end dos serviços de inventário. Você vai criar uma instância, um banco de dados e um esquema do Spanner nas etapas a seguir.

Criar uma instância

  1. Crie uma instância do Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

Exemplo de saída

Creating instance...done.   
  1. Verificar se a instância do Spanner está configurada corretamente
gcloud spanner instances list

Exemplo de saída

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

Criar um banco de dados e um esquema

Crie um banco de dados e use a linguagem de definição de dados (DDL) do SQL padrão do Google para gerar o esquema do banco de dados.

  1. Criar um arquivo DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. Criar o banco de dados do Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

Exemplo de saída

Creating database...done.

Verificar o estado e o esquema do banco de dados

  1. Conferir o estado do banco de dados
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Exemplo de saída

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. Visualizar o esquema do banco de dados
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Exemplo de saída

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

5. Como integrar o Spanner

Nesta seção, você vai aprender a integrar o Spanner ao seu aplicativo. Além disso, o SQL Spanner fornece bibliotecas de cliente, drivers JDBC, drivers R2DBC, APIs REST e APIs RPC, o que permite integrar o Spanner a qualquer aplicativo.

Na próxima seção, você vai usar a biblioteca de cliente Go para instalar, autenticar e modificar dados no Spanner.

Instalar a biblioteca de cliente

A biblioteca de cliente do Cloud Spanner facilita a integração com o Cloud Spanner usando automaticamente o Application Default Credentials (ADC) para encontrar as credenciais da sua conta de serviço.

Configurar a autenticação

A CLI e as bibliotecas de cliente do Google Cloud detectam automaticamente quando estão em execução no Google Cloud e usam a conta de serviço do ambiente de execução da revisão atual do Cloud Run. Essa estratégia é chamada de Application Default Credentials e permite a portabilidade do código em vários ambientes.

No entanto, é melhor criar uma identidade dedicada atribuindo a ela uma conta de serviço gerenciada pelo usuário em vez da conta de serviço padrão.

  1. Conceda o papel de administrador do banco de dados do Spanner à conta de serviço
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Exemplo de saída

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

Como usar bibliotecas de cliente

As bibliotecas de cliente do Spanner abstraem as complexidades da integração com ele e estão disponíveis em muitas linguagens de programação conhecidas.

Criar um cliente do Spanner

O cliente Spanner é um cliente para ler e gravar dados em um banco de dados do Cloud Spanner. É seguro usar um cliente simultaneamente, exceto pelo método Close.

O snippet abaixo cria um cliente spanner

main.go

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

Pense em um cliente como uma conexão de banco de dados: todas as suas interações com o Cloud Spanner precisam passar por um cliente. Normalmente, você cria um cliente quando seu aplicativo é iniciado, e depois o reutiliza para ler, gravar e executar transações. Cada cliente usa recursos no Cloud Spanner.

Modificar dados

Há várias maneiras de inserir, atualizar e excluir dados de um banco de dados do Spanner. Confira uma lista dos métodos disponíveis abaixo.

Neste laboratório, você vai usar mutações para modificar dados no Spanner.

Mutações no Spanner

Mutation é um contêiner para operações de mutação. Uma mutação representa uma sequência de inserções, atualizações e exclusões que o Cloud Spanner aplica atomicamente a diferentes linhas e tabelas em um banco de dados do Cloud Spanner.

main.go

m := []*spanner.Mutation{}

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

O snippet de código insere uma nova linha na tabela de histórico de inventário.

Como implantar e testar

Agora que o Spanner está configurado e você analisou os principais elementos do código, implante o aplicativo no Cloud Run.

implante o aplicativo no Cloud Run

O Cloud Run pode criar, enviar e implantar seu código automaticamente com um único comando. No comando a seguir, você vai chamar o comando deploy no serviço run, transmitindo variáveis usadas pelo aplicativo em execução, como SPANNER_CONNECTION_STRING que você criou anteriormente.

  1. Clique em Abrir terminal
  2. Implante o serviço de inventário no 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

Exemplo de saída

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

testar o aplicativo do Cloud Run

Inserir um item

  1. No cloudshell, digite o seguinte comando.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Exemplo de saída

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

Consultar um item

  1. Consultar o serviço de inventário
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Exemplo de resposta

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. Conceitos do Spanner

O Cloud Spanner consulta os bancos de dados usando instruções SQL declarativas. As instruções SQL indicam o que o usuário quer sem descrever como os resultados serão obtidos.

  1. No terminal, digite este comando para consultar o registro criado anteriormente na tabela.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Exemplo de saída

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Planos de execução de consulta

Um plano de execução de consulta é uma série de etapas que o Spanner usa para conseguir resultados. Pode haver várias maneiras de adquirir os resultados de uma instrução SQL específica. Os planos de execução de consulta podem ser acessados no console e nas bibliotecas de cliente. Para ver como o Spanner lida com consultas SQL:

  1. No console, abra a página de instâncias do Cloud Spanner.
  2. Acessar "Instâncias do Cloud Spanner"
  3. Clique no nome da instância do Cloud Spanner. Na seção de bancos de dados, selecione o banco de dados que você quer consultar.
  4. Clique em Consulta.
  5. Insira esta consulta no editor de consultas
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Clique em EXECUTAR
  2. Clique em EXPLICAÇÃO

O Console do Cloud exibe um plano de execução visual para sua consulta.

149f8bae468f8b34.png

Otimizador de consultas

O otimizador de consultas do Cloud Spanner compara planos de execução alternativos e seleciona o mais eficiente. Com o tempo, o otimizador de consultas evoluirá, ampliando as opções no plano de execução de consulta e melhorando a precisão das estimativas que embasam essas escolhas, levando a planos de execução de consulta mais eficientes.

O Cloud Spanner lança atualizações do otimizador como novas versões do otimizador de consultas. Por padrão, cada banco de dados começa a usar a versão mais recente do otimizador pelo menos 30 dias após o lançamento dessa versão.

Para acessar a versão usada ao executar uma consulta no gcloud spanner, defina a sinalização –query-mode como PROFILE

  1. Digite o seguinte comando para visualizar a versão do otimizador
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Exemplo de saída

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:

Atualizar a versão do otimizador

A versão mais recente disponível no momento deste laboratório é a 4. Em seguida, você vai atualizar a tabela do Spanner para usar a versão 4 no otimizador de consultas.

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

Exemplo de saída

Schema updating...done. 
  1. Digite o seguinte comando para exibir a atualização da versão do otimizador
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Exemplo de saída

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

Visualizar a versão do otimizador de consultas no Metrics Explorer

Use o Metrics Explorer no console do Cloud para conferir a Contagem de consultas da instância do banco de dados. É possível saber qual versão do otimizador está sendo usada em cada banco de dados.

  1. Acesse o Monitoring no console do Cloud e selecione Metrics Explorer no menu à esquerda.
  2. No campo Tipo de recurso, selecione a instância do Cloud Spanner.
  3. No campo Métrica, selecione "Contagem de consultas" e "Aplicar".
  4. No campo Group By, selecione database, optimizer_version e status.

581b859c25790b21.png

7. Criar e configurar um banco de dados do Firestore

O Firestore é um banco de dados de documentos NoSQL criado para oferecer escalonamento automático, alto desempenho e facilidade no desenvolvimento de aplicativos. Embora a interface do Firestore tenha muitos dos mesmos recursos dos bancos de dados tradicionais, um banco de dados NoSQL é diferente deles na descrição de relações entre objetos de dados.

A tarefa a seguir vai orientar você na criação de um serviço de pedidos do aplicativo do Cloud Run com suporte do Firestore. O serviço de pedidos vai chamar o serviço de inventário criado na seção anterior para consultar o banco de dados do Spanner antes de iniciar o pedido. Esse serviço garante que exista um inventário suficiente e que o pedido possa ser preenchido.

6843abaf4263e112.png

8. Conceitos do Firestore

Modelo de dados

Um banco de dados do Firestore é composto por coleções e documentos.

b60acd63d4793a6c.png

Documentos

Cada documento contém um conjunto de pares de chave-valor. O Firestore é otimizado para armazenar grandes coleções de documentos pequenos.

5571cb2f261d2dbe.png

Coleções

É necessário armazenar todos os documentos em coleções. Os documentos podem conter subcoleções e objetos aninhados, incluindo campos primitivos, como strings, ou objetos complexos, como listas.

5811378cb721e5ec.png

Crie um banco de dados Firestore

  1. Criar o banco de dados do Firestore
gcloud firestore databases create --location=$REGION

Exemplo de saída

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

9. Como integrar o Firestore ao aplicativo

Nesta seção, você vai atualizar a conta de serviço, adicionar contas de serviço de acesso ao Firestore, revisar e implantar as regras de segurança do Firestore e analisar como os dados são modificados.

Configurar a autenticação

  1. Conceda o papel de usuário do Datastore à conta de serviço
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Exemplo de saída

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

Regras de Segurança do Firestore

As regras de segurança oferecem controle de acesso e validação de dados com um formato expressivo, porém direto.

  1. Navegue até o diretório order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Abra o arquivo firestore.rules no editor do Cloud.
cat firestore.rules

firestore.rules (em inglês)

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

Aviso:a prática recomendada é limitar o acesso ao armazenamento do Firestore. Para os fins deste laboratório, todas as leituras são permitidas. Essa não é uma configuração de produção recomendada.

Ativar os serviços gerenciados do Firestore

  1. Clique em Abrir terminal
  2. Crie o arquivo .firebaserc com o ID do projeto atual. As configurações dos destinos de implantação são armazenadas no arquivo .firebaserc no diretório do seu projeto.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Baixar o binário do Firebase
curl -sL https://firebase.tools | upgrade=true bash

Exemplo de saída

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

Exemplo de saída

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

Modificar dados

Coleções e documentos são criados implicitamente no Firestore. Basta atribuir dados a um documento dentro de uma coleção. Se a coleção ou o documento não existir, o Firestore o criará.

Adicionar dados ao Firestore

Há várias formas de gravar dados no Cloud Firestore:

  • Defina os dados de um documento dentro de uma coleção, especificando explicitamente um identificador de documento.
  • Adicionar um novo documento a uma coleção. Nesse caso, o Cloud Firestore gera automaticamente o identificador do documento.
  • Crie um documento vazio com um identificador gerado automaticamente e atribua dados a ele depois.

Na próxima seção, vamos mostrar como criar um documento usando o método "set".

Definir um documento

Use o método set() para criar um documento. Com o método set(), é necessário especificar um ID para o documento a ser criado.

Confira o snippet de código abaixo.

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

Este código criará um documento especificando um ID de documento 123 gerado pelo usuário. Para que o Firestore gere um ID em seu nome, use o método add() ou create().

Atualizar documentos

O método de atualização update() permite atualizar alguns campos do documento sem substituir o documento inteiro.

No snippet abaixo, o código atualiza a ordem 123

index.js

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

Excluir um documento

No Firestore, é possível excluir coleções, documentos ou campos específicos de um documento. Para excluir um documento, use o método delete().

O snippet abaixo exclui o pedido 123.

index.js

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

10. Como implantar e testar

Nesta seção, você vai implantar o aplicativo no Cloud Run e testar os métodos de criação, atualização e exclusão.

implante o aplicativo no Cloud Run

  1. Armazene o URL na variável INVENTORY_SERVICE_URL para integrá-lo ao serviço de inventário
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Implante o serviço de pedido
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

Exemplo de saída

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

testar o aplicativo do Cloud Run

Criar um documento

  1. Armazenar o URL do aplicativo do serviço de pedido em uma variável para teste
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Criar uma solicitação de pedido e publicar um novo pedido no banco de dados do 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
        }
    ]
}'

Exemplo de saída

{"orderNumber":46429}

Salvar o número do pedido para uso posterior

export ORDER_NUMBER=<value_from_output>

Ver resultados

Ver os resultados no Firestore

  1. Navegue até o console do Firestore.
  2. Clique em "Dados"

465ceca6198b2b88.png

Atualizar um documento

O pedido enviado não incluía a quantidade.

  1. Atualizar o registro e adicionar um par de chave-valor de quantidade
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Exemplo de saída

{"status":"success"}

Ver resultados

Ver os resultados no Firestore

  1. Navegue até o console do Firestore.
  2. Clique em "Dados"

cfcf78d200e15b84.png

Exclusão de um documento

  1. Excluir o item 46429 da coleção de pedidos do Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Ver resultados

  1. Navegue até o console do Firestore.
  2. Clique em "Dados"

73e14d69211d1539.png

11. Parabéns!

Parabéns, você concluiu o laboratório.

O que vem em seguida:

Conheça outros codelabs da Cymbal Eats:

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto ou mantenha o projeto e exclua cada um dos recursos.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.