Conéctate a bases de datos completamente administradas desde Cloud Run

1. Descripción general

En este lab, integrarás bases de datos sin servidores(Spanner y Firestore) con aplicaciones(Go y Node.js) que se ejecutan en Cloud Run. La aplicación Cymbal Eats incluye varios servicios que se ejecutan en Cloud Run. En los siguientes pasos, configurarás los servicios para que usen la base de datos relacional Cloud Spanner y Cloud Firestore, una base de datos de documentos NoSQL. El uso de productos sin servidores para el nivel de datos y el tiempo de ejecución de la aplicación te permite abstraer toda la administración de la infraestructura y enfocarte en compilar tu aplicación en lugar de preocuparte por la sobrecarga.

2. Qué aprenderás

En este lab, aprenderás a realizar las siguientes tareas:

  • Integra Spanner
  • Habilita los servicios administrados de Spanner
  • Integración en el código
  • Implementa código que se conecte a Spanner
  • Integra Firestore
  • Habilita los servicios administrados de Firestore
  • Integración en el código
  • Implementa el código que se conecta a Firestore

3. Configuración y requisitos

Cómo configurar el entorno a tu propio ritmo

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Configura el entorno

  1. Crea una variable de ID del proyecto
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. Habilita las APIs de Spanner, Cloud Run, Cloud Build y 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. Clona el repositorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Navega al directorio
cd cymbal-eats/inventory-service/spanner

4. Crea y configura una instancia de Spanner

Spanner es la base de datos relacional de backend de los servicios de inventario. En los siguientes pasos, crearás una instancia, una base de datos y un esquema de Spanner.

Crea una instancia

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

Resultado de ejemplo

Creating instance...done.   
  1. Verifica si la instancia de Spanner está configurada correctamente
gcloud spanner instances list

Ejemplo de resultado:

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

Crea una base de datos y un esquema

Crea una base de datos nueva y usa el lenguaje de definición de datos (DDL) de SQL estándar de Google para crear el esquema de la base de datos.

  1. Crea un archivo DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. Crea la base de datos de Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

Ejemplo de resultado:

Creating database...done.

Verifica el estado y el esquema de la base de datos

  1. Cómo ver el estado de la base de datos
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Ejemplo de resultado:

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. Visualiza el esquema de la base de datos
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Ejemplo de resultado:

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

5. Integración de Spanner

En esta sección, aprenderás a integrar Spanner en tu aplicación. Además, Spanner SQL proporciona bibliotecas cliente, controladores JDBC, controladores R2DBC, APIs de REST y APIs de RPC, que te permiten integrar Spanner en cualquier aplicación.

En la siguiente sección, usarás la biblioteca cliente de Go para instalar, autenticar y modificar datos en Spanner.

Instala la biblioteca cliente

La biblioteca cliente de Cloud Spanner facilita la integración con Cloud Spanner, ya que usa automáticamente las credenciales predeterminadas de la aplicación (ADC) para encontrar las credenciales de tu cuenta de servicio.

Configura la autenticación

Google Cloud CLI y las bibliotecas cliente de Google Cloud detectan automáticamente cuándo se ejecutan en Google Cloud y usan la cuenta de servicio del entorno de ejecución de la revisión actual de Cloud Run. Esta estrategia se denomina credenciales predeterminadas de la aplicación y permite la portabilidad de código en varios entornos.

Sin embargo, es mejor crear una identidad exclusiva asignándole una cuenta de servicio administrada por el usuario en lugar de la cuenta de servicio predeterminada.

  1. Otorga el rol de administrador de la base de datos de Spanner a la cuenta de servicio
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Ejemplo de resultado:

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

Usa las bibliotecas cliente

Las bibliotecas cliente de Spanner abstraen las complejidades de la integración con Spanner y están disponibles en muchos lenguajes de programación populares.

Crea un cliente de Spanner

El cliente de Spanner es un cliente para leer y escribir datos en una base de datos de Cloud Spanner. Un cliente se puede usar de forma simultánea, excepto por su método Close.

El siguiente fragmento crea un cliente de Spanner

main.go

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

Puedes considerar un cliente como una conexión de base de datos: todas tus interacciones con Cloud Spanner deben pasar por un cliente. Normalmente, creas un cliente cuando se inicia la aplicación y, luego, vuelves a usar ese cliente para leer, escribir y ejecutar transacciones. Cada cliente usa los recursos en Cloud Spanner.

Modificar datos

Existen varias formas de insertar, actualizar y borrar datos de una base de datos de Spanner. A continuación, se enumeran los métodos disponibles.

En este lab, usarás mutaciones para modificar datos en Spanner.

Mutaciones en Spanner

Una mutación es un contenedor de operaciones de mutación. Una mutación representa una secuencia de inserciones, actualizaciones y eliminaciones que Cloud Spanner aplica de forma atómica a diferentes filas y tablas en una base de datos de Cloud Spanner.

main.go

m := []*spanner.Mutation{}

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

El fragmento de código inserta una fila nueva en la tabla del historial del inventario.

Implementación y pruebas

Ahora que Spanner está configurado y revisaste los elementos clave del código, implementa la aplicación en Cloud Run.

Implementa la aplicación en Cloud Run

Cloud Run puede compilar, enviar e implementar tu código automáticamente con un solo comando. En el siguiente comando, llamarás al comando deploy en el servicio run y pasarás las variables que usa la aplicación en ejecución, como SPANNER_CONNECTION_STRING, que creaste antes.

  1. Haz clic en Abrir terminal.
  2. Implementa el servicio de inventario en 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

Ejemplo de resultado:

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. Almacena la URL de servicio
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

Prueba la aplicación de Cloud Run

Cómo insertar un elemento

  1. En Cloud Shell, ingresa el siguiente comando.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Ejemplo de resultado:

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

Consulta un elemento

  1. Consulta el servicio de inventario
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Ejemplo de respuesta

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. Conceptos de Spanner

Cloud Spanner consulta sus bases de datos con instrucciones de SQL declarativas. Las instrucciones de SQL indican lo que quiere el usuario sin describir cómo se obtendrán los resultados.

  1. En la terminal, ingresa este comando para consultar el registro de la tabla que creaste anteriormente.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Ejemplo de resultado:

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Planes de ejecución de consultas

Un plan de ejecución de consultas es una serie de pasos que Spanner usa para obtener resultados. Puede haber varias formas de adquirir los resultados de una instrucción de SQL en particular. Se puede acceder a los planes de ejecución de consultas en la consola y en las bibliotecas cliente. Para ver cómo Spanner controla las consultas de SQL, haz lo siguiente:

  1. En la consola, abre la página Instancias de Cloud Spanner.
  2. Ir a las instancias de Cloud Spanner
  3. Haz clic en el nombre de la instancia de Cloud Spanner. En la sección de bases de datos, selecciona la base de datos que deseas consultar.
  4. Haz clic en Consulta.
  5. Ingresa la siguiente consulta en el editor de consultas
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Haz clic en EJECUTAR.
  2. Haz clic en EXPLICACIÓN.

La consola de Cloud muestra un plan de ejecución visual para tu consulta.

149f8bae468f8b34.png

Optimizador de consultas

El optimizador de consultas de Cloud Spanner compara planes de ejecución alternativos y selecciona el más eficiente. Con el tiempo, el optimizador de consultas evolucionará y ampliará las opciones en el plan de ejecución de consultas, además de mejorar la precisión de las estimaciones que informan esas opciones, lo que llevará a planes de ejecución de consultas más eficientes.

Cloud Spanner lanza actualizaciones del optimizador como nuevas versiones del optimizador de consultas. De forma predeterminada, cada base de datos comienza a usar la versión más reciente del optimizador no antes de 30 días después de que se lanza esa versión.

Para ver la versión que se usa cuando se ejecuta una consulta en gcloud spanner, configura la marca –query-mode en PROFILE.

  1. Ingresa el siguiente comando para ver la versión del optimizador:
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Ejemplo de resultado:

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:

Actualiza la versión del optimizador

La versión más reciente en el momento de este lab es la versión 4. A continuación, actualizarás la tabla de Spanner para usar la versión 4 del optimizador de consultas.

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

Ejemplo de resultado:

Schema updating...done. 
  1. Ingresa el siguiente comando para ver la actualización de la versión del optimizador:
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Ejemplo de resultado:

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

Visualiza la versión del optimizador de consultas en el Explorador de métricas

Puedes usar el Explorador de métricas en Cloud Console para visualizar el recuento de consultas de tu instancia de base de datos. Puedes ver qué versión del optimizador se usa en cada base de datos.

  1. Navega a Monitoring en la consola de Cloud y selecciona Explorador de métricas en el menú de la izquierda.
  2. En el campo Tipo de recurso, selecciona Instancia de Cloud Spanner.
  3. En el campo Métrica, selecciona Recuento de búsquedas y Aplicar.
  4. En el campo Agrupar por, selecciona database, optimizer_version y status.

581b859c25790b21.png

7. Crea y configura una base de datos de Firestore

Firestore es una base de datos de documentos NoSQL creada para proporcionar ajuste de escala automático, alto rendimiento y facilidad para el desarrollo de aplicaciones. Si bien la interfaz de Firestore comparte muchas de sus características con las bases de datos tradicionales, las NoSQL se diferencian por el modo en que describen las relaciones entre objetos de datos.

La siguiente tarea te guiará para crear una aplicación de Cloud Run de servicio de pedidos respaldada por Firestore. El servicio de pedidos llamará al servicio de inventario creado en la sección anterior para consultar la base de datos de Spanner antes de iniciar el pedido. Este servicio garantizará que haya suficiente inventario y que se pueda completar el pedido.

6843abaf4263e112.png

8. Conceptos de Firestore

Modelo de datos

Una base de datos de Firestore se compone de colecciones y documentos.

b60acd63d4793a6c.png

Documentos

Cada documento contiene un conjunto de pares clave-valor. Firestore está optimizado para almacenar grandes colecciones de documentos pequeños.

5571cb2f261d2dbe.png

Colecciones

Debes almacenar todos los documentos en colecciones. Los documentos pueden contener subcolecciones y objetos anidados, incluidos campos primitivos, como cadenas, o bien objetos complejos, como listas.

5811378cb721e5ec.png

Crea una base de datos de Firestore

  1. Crea la base de datos de Firestore
gcloud firestore databases create --location=$REGION

Ejemplo de resultado:

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

9. Cómo integrar Firestore en tu aplicación

En esta sección, actualizarás la cuenta de servicio, agregarás cuentas de servicio de acceso a Firestore, revisarás e implementarás las reglas de seguridad de Firestore y revisarás cómo se modifican los datos en Firestore.

Configura la autenticación

  1. Otorga el rol de usuario de Datastore a la cuenta de servicio
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Ejemplo de resultado:

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

Reglas de seguridad de Firestore

Las reglas de seguridad proporcionan control de acceso y validación de datos en un formato expresivo y sencillo.

  1. Navega al directorio order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Abre el archivo firestore.rules en el editor de Cloud
cat firestore.rules

firestore.rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { ⇐ All database
    match /{document=**} { ⇐ All documents
      allow read: if true; ⇐ Allow reads
    }
    match /{document=**} {
      allow write: if false; ⇐ Deny writes
    }
  }
}

Advertencia: Se recomienda limitar el acceso al almacenamiento de Firestore. Para los fines de este lab, se permiten todas las lecturas. Esta no es una configuración de producción recomendada.

Habilita los servicios administrados de Firestore

  1. Haz clic en Abrir terminal.
  2. Crea el archivo .firebaserc con el ID del proyecto actual. La configuración de los destinos de implementación se almacena en el archivo .firebaserc del directorio de tu proyecto.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Descarga el objeto binario de Firebase
curl -sL https://firebase.tools | upgrade=true bash

Ejemplo de resultado:

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

Resultado de ejemplo

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

Las colecciones y los documentos se crean de manera implícita en Firestore; solo debes asignar datos a un documento dentro de una colección. Si la colección o el documento no existen, Firestore los crea.

Agrega datos a Firestore

Hay varias formas de escribir datos en Cloud Firestore:

  • Configurar los datos de un documento dentro de una colección y especificar explícitamente un identificador de documento.
  • Agregar un documento nuevo a una colección. En este caso, Cloud Firestore genera automáticamente el identificador de documento.
  • Crear un documento vacío con un identificador generado automáticamente y asignarle datos después

En la siguiente sección, se te guiará para crear un documento con el método set.

Configura un documento

Usa el método set() para crear un documento. Con el método set(), debes especificar un ID para el documento que vas a crear.

Observa el siguiente fragmento de código.

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 creará un documento que especifica un ID de documento generado por el usuario 123. Para que Firestore genere un ID en tu nombre, usa el método add() o create().

Actualiza un documento

El método de actualización update()te permite actualizar algunos campos del documento sin reemplazarlo por completo.

En el siguiente fragmento, el código actualiza el pedido 123.

index.js

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

Cómo borrar un documento

En Firestore, puedes borrar colecciones, documentos o campos específicos de un documento. Para borrar un documento, usa el método delete().

El siguiente fragmento borra el pedido 123.

index.js

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

10. Implementación y pruebas

En esta sección, implementarás la aplicación en Cloud Run y probarás los métodos de creación, actualización y eliminación.

Implementa la aplicación en Cloud Run

  1. Almacena la URL en la variable INVENTORY_SERVICE_URL para integrarla con Inventory Service.
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Implementa el servicio de pedidos
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

Ejemplo de resultado:

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

Prueba la aplicación de Cloud Run

Crea un documento

  1. Almacena la URL de la aplicación del servicio de pedidos en una variable para realizar pruebas
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Compila una solicitud de pedido y publica un pedido nuevo en la base de datos de 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
        }
    ]
}'

Ejemplo de resultado:

{"orderNumber":46429}

Guarda el número de pedido para usarlo más adelante

export ORDER_NUMBER=<value_from_output>

Ver resultados

Visualiza los resultados en Firestore

  1. Navega a la consola de Firestore.
  2. Haz clic en Datos.

465ceca6198b2b88.png

Actualiza un documento

El pedido enviado no incluía la cantidad.

  1. Actualiza el registro y agrega un par clave-valor de cantidad
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Ejemplo de resultado:

{"status":"success"}

Ver resultados

Visualiza los resultados en Firestore

  1. Navega a la consola de Firestore.
  2. Haz clic en Datos.

cfcf78d200e15b84.png

Cómo borrar un documento

  1. Borra el elemento 46429 de la colección de pedidos de Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Ver resultados

  1. Navega a la consola de Firestore.
  2. Haz clic en Datos.

73e14d69211d1539.png

11. ¡Felicitaciones!

¡Felicitaciones! Completaste el lab.

Pasos siguientes:

Explora otros codelabs de Cymbal Eats:

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.