Terhubung ke Database yang Terkelola Sepenuhnya dari Cloud Run

1. Ringkasan

Di lab ini, Anda akan mengintegrasikan database tanpa server(Spanner dan Firestore) dengan aplikasi(Go dan Node.js) yang berjalan di Cloud Run. Aplikasi Cymbal Eats mencakup beberapa layanan yang berjalan di Cloud Run. Pada langkah berikut, Anda akan mengonfigurasi layanan untuk menggunakan database relasional Cloud Spanner dan Cloud Firestore, database dokumen NoSQL. Dengan memanfaatkan produk tanpa server untuk tingkat data dan runtime aplikasi, Anda dapat memisahkan semua pengelolaan infrastruktur, dengan berfokus pada membangun aplikasi, tanpa mengkhawatirkan overhead.

2. Yang akan Anda pelajari

Di lab ini, Anda akan mempelajari cara melakukan hal-hal berikut:

  • Mengintegrasikan Spanner
  • Mengaktifkan Layanan Terkelola Spanner
  • Mengintegrasikan ke dalam kode
  • Deploy kode yang terhubung ke Spanner
  • Mengintegrasikan Firestore
  • Mengaktifkan Layanan yang Dikelola Firestore
  • Mengintegrasikan ke dalam kode
  • Men-deploy kode yang terhubung ke Firestore

3. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Lingkungan Penyiapan

  1. Membuat variabel project ID
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. Mengaktifkan Spanner, Cloud Run, Cloud Build, dan Artifact Registry API
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. Melakukan cloning repositori
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Buka direktori
cd cymbal-eats/inventory-service/spanner

4. Membuat dan Mengonfigurasi instance Spanner

Spanner adalah database relasional backend layanan inventaris. Anda akan membuat instance, database, dan skema Spanner pada langkah-langkah berikut.

Membuat instance

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

Contoh Output

Creating instance...done.   
  1. Memverifikasi apakah instance Spanner dikonfigurasi dengan benar
gcloud spanner instances list

Contoh output

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

Membuat database dan skema

Buat database baru dan gunakan bahasa definisi data (DDL) SQL standar Google untuk membuat skema database.

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

Contoh output

Creating database...done.

Memverifikasi status dan skema Database

  1. Melihat status database
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Contoh output

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. Melihat skema database
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Contoh output

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

5. Mengintegrasikan Spanner

Di bagian ini, Anda akan mempelajari cara mengintegrasikan Spanner ke dalam aplikasi. Selain itu, SQL Spanner menyediakan Library klien, driver JDBC, driver R2DBC, REST API, dan RPC API, yang memungkinkan Anda mengintegrasikan Spanner ke dalam aplikasi apa pun.

Di bagian berikutnya, Anda akan menggunakan library klien Go untuk menginstal, mengautentikasi, dan mengubah data di Spanner.

Menginstal library klien

Library klien Cloud Spanner mempermudah integrasi dengan Cloud Spanner dengan secara otomatis menggunakan Kredensial Default Aplikasi (ADC) untuk menemukan kredensial akun layanan Anda

Menyiapkan autentikasi

Library klien Google Cloud CLI dan Google Cloud otomatis mendeteksi saat keduanya berjalan di Google Cloud dan menggunakan akun layanan runtime dari revisi Cloud Run saat ini. Strategi ini disebut Kredensial Default Aplikasi dan memungkinkan portabilitas kode di berbagai lingkungan.

Namun, sebaiknya buat identitas khusus dengan menetapkan akun layanan yang dikelola pengguna untuknya, bukan akun layanan default.

  1. Memberikan peran Spanner Database Admin ke akun layanan
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Contoh output

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

Menggunakan library klien

Library klien Spanner menghilangkan kerumitan integrasi dengan Spanner dan tersedia dalam banyak bahasa pemrograman populer.

Membuat klien Spanner

Klien Spanner adalah klien untuk membaca dan menulis data ke database Cloud Spanner. Klien aman digunakan secara bersamaan, kecuali untuk metode Close-nya.

Cuplikan di bawah ini membuat klien spanner

main.go

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

Anda dapat menganggap Klien sebagai koneksi database: semua interaksi Anda dengan Cloud Spanner harus melalui Klien. Biasanya Anda membuat Klien saat aplikasi dimulai, lalu menggunakan kembali klien tersebut untuk membaca, menulis, dan menjalankan transaksi. Setiap klien menggunakan resource di Cloud Spanner.

Mengubah data

Ada beberapa cara untuk menyisipkan, memperbarui, dan menghapus data dari database Spanner. Di bawah ini adalah metode yang tersedia.

Di lab ini, Anda akan menggunakan mutasi untuk mengubah data di Spanner.

Mutasi di Spanner

Mutasi adalah container untuk operasi mutasi. Mutasi mewakili urutan penyisipan, pembaruan, dan penghapusan yang diterapkan Cloud Spanner secara atomik ke berbagai baris dan tabel dalam database Cloud Spanner.

main.go

m := []*spanner.Mutation{}

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

Cuplikan kode menyisipkan baris baru ke dalam tabel histori inventaris.

Men-deploy dan Menguji

Setelah Spanner dikonfigurasi dan Anda telah meninjau elemen kode utama, deploy aplikasi ke Cloud Run.

Men-deploy aplikasi ke Cloud Run

Cloud Run dapat otomatis membangun, mengirim, dan men-deploy kode Anda dengan satu perintah. Dalam perintah berikut, Anda akan memanggil perintah deploy di layanan run, dengan meneruskan variabel yang digunakan oleh aplikasi yang berjalan seperti SPANNER_CONNECTION_STRING yang Anda buat sebelumnya.

  1. Klik Open Terminal
  2. Men-deploy layanan inventaris ke 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

Contoh output

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

Menguji aplikasi Cloud Run

Sisipkan item

  1. Di cloudshell, masukkan perintah berikut.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Contoh output

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

Membuat kueri item

  1. Membuat kueri layanan inventaris
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Contoh respons

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. Konsep Spanner

Cloud Spanner membuat kueri database-nya menggunakan pernyataan SQL deklaratif. Pernyataan SQL menunjukkan apa yang diinginkan pengguna tanpa menjelaskan bagaimana hasilnya akan diperoleh.

  1. Di terminal, masukkan perintah ini untuk mengkueri tabel terkait data yang telah dibuat sebelumnya.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Contoh output

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Rencana eksekusi kueri

Rencana eksekusi kueri adalah serangkaian langkah yang digunakan Spanner untuk mendapatkan hasil. Mungkin ada beberapa cara untuk mendapatkan hasil dari pernyataan SQL tertentu. Rencana eksekusi kueri dapat diakses di konsol dan library klien. Untuk melihat cara Spanner menangani kueri SQL:

  1. Di konsol, buka halaman instance Cloud Spanner.
  2. Buka instance Cloud Spanner
  3. Klik nama instance Cloud Spanner. Dari bagian {i>database<i}, pilih {i>database<i} yang ingin Anda kueri.
  4. Klik Kueri.
  5. Masukkan kueri berikut di editor kueri
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Klik RUN
  2. Klik PENJELASAN

Cloud Console menampilkan rencana eksekusi visual untuk kueri Anda.

149f8bae468f8b34.pngS

Pengoptimal kueri

Pengoptimal kueri Cloud Spanner membandingkan rencana eksekusi alternatif dan memilih yang paling efisien. Seiring waktu, pengoptimal kueri akan berkembang, sehingga memperluas pilihan dalam rencana eksekusi kueri dan meningkatkan akurasi estimasi yang memberikan informasi pilihan tersebut, sehingga menghasilkan rencana eksekusi kueri yang lebih efisien.

Cloud Spanner meluncurkan update pengoptimal sebagai versi pengoptimal kueri baru. Secara default, setiap database mulai menggunakan versi pengoptimal terbaru tidak lebih cepat dari 30 hari setelah versi tersebut dirilis.

Untuk melihat versi yang digunakan saat menjalankan kueri di gcloud spanner, setel tanda –query-mode ke PROFILE

  1. Masukkan perintah berikut untuk melihat versi pengoptimal
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Contoh output

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:

Mengupdate versi pengoptimal

Versi terbaru pada saat lab ini adalah versi 4. Selanjutnya, Anda akan memperbarui Tabel Spanner agar menggunakan versi 4 untuk pengoptimal kueri.

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

Contoh output

Schema updating...done. 
  1. Masukkan perintah berikut untuk melihat update versi pengoptimal
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Contoh output

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

Memvisualisasikan versi pengoptimal kueri di Metrics Explorer

Anda dapat menggunakan Metrics Explorer di Konsol Cloud untuk memvisualisasikan Jumlah kueri untuk instance database Anda. Anda dapat melihat versi pengoptimal mana yang digunakan dalam setiap database.

  1. Buka Monitoring di Konsol Cloud, lalu pilih Metrics Explorer di menu kiri.
  2. Di kolom Resource type, pilih Instance Cloud Spanner.
  3. Di kolom Metric, pilih Count of kueri dan Terapkan.
  4. Di kolom Group By, pilih database, optimizer_version, dan status.

581b859c25790b21.pngS

7. Membuat dan Mengonfigurasi Database Firestore

Firestore adalah database dokumen NoSQL yang dibangun untuk penskalaan otomatis, performa tinggi, dan kemudahan pengembangan aplikasi. Meskipun antarmuka Firestore memiliki banyak fitur yang sama dengan database tradisional, database NoSQL berbeda dalam menjelaskan hubungan antar-objek data.

Tugas berikut akan memandu Anda membuat aplikasi Cloud Run layanan pemesanan yang didukung oleh Firestore. Layanan pemesanan akan memanggil layanan inventaris yang dibuat di bagian sebelumnya untuk mengkueri database Spanner sebelum memulai pesanan. Layanan ini akan memastikan tersedianya inventaris yang memadai dan pesanan dapat dipenuhi.

6843abaf4263e112.pngS

8. Konsep Firestore

Model data

Database Firestore terdiri dari koleksi dan dokumen.

b60acd63d4793a6c.png

Dokumen

Setiap dokumen berisi kumpulan pasangan nilai kunci. Firestore dioptimalkan untuk menyimpan koleksi besar dokumen berukuran kecil.

5571cb2f261d2dbe.pngS

Koleksi

Anda harus menyimpan semua dokumen dalam koleksi. Dokumen dapat berisi subkoleksi dan objek bertingkat, termasuk kolom dasar seperti string atau objek kompleks seperti daftar.

5811378cb721e5ec.png

Membuat database Firestore

  1. Membuat database Firestore
gcloud firestore databases create --location=$REGION

Contoh output

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

9. Mengintegrasikan Firestore ke dalam aplikasi Anda

Di bagian ini, Anda akan memperbarui akun layanan, menambahkan akun layanan akses Firestore, meninjau dan men-deploy aturan keamanan Firestore, serta meninjau cara data dimodifikasi di Firestore.

Menyiapkan autentikasi

  1. Berikan peran pengguna Datastore ke akun layanan
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Contoh output

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

Aturan Keamanan Firestore

Aturan keamanan menyediakan kontrol akses dan validasi data dalam format yang ekspresif tetapi sederhana.

  1. Buka direktori order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Buka file firestore.rules di editor 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
    }
  }
}

Peringatan: Sebaiknya batasi akses ke penyimpanan Firestore. Untuk tujuan lab ini, semua operasi baca diizinkan. Ini bukan konfigurasi produksi yang disarankan.

Mengaktifkan Layanan yang Dikelola Firestore

  1. Klik Open Terminal
  2. Buat file .firebaserc dengan Project ID saat ini. Setelan untuk target deploy disimpan dalam file .firebaserc di direktori project Anda.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Download biner firebase
curl -sL https://firebase.tools | upgrade=true bash

Contoh output

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

Contoh Output

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

Mengubah data

Koleksi dan dokumen dibuat secara implisit di Firestore. Cukup tetapkan data ke dokumen dalam koleksi. Jika koleksi atau dokumen tidak ada, Firestore akan membuatnya.

Menambahkan data ke firestore

Ada beberapa cara untuk menulis data ke Cloud Firestore:

  • Menetapkan data dokumen dalam koleksi, dengan secara eksplisit menentukan ID dokumen.
  • Menambahkan dokumen baru ke koleksi. Dalam hal ini, Cloud Firestore akan otomatis menghasilkan ID dokumen.
  • Membuat dokumen kosong dengan ID yang otomatis dihasilkan, lalu menetapkan data untuk dokumen tersebut.

Bagian berikutnya akan memandu Anda membuat dokumen menggunakan metode set.

Menetapkan dokumen

Gunakan metode set() untuk membuat dokumen. Dengan metode set(), Anda harus menentukan ID untuk dokumen yang akan dibuat.

Lihat cuplikan kode di bawah ini.

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

Kode ini akan membuat dokumen yang menentukan ID dokumen buatan pengguna 123. Agar Firestore membuat ID untuk Anda, gunakan metode add() atau create().

Memperbarui dokumen

Metode pembaruan update() memungkinkan Anda memperbarui beberapa kolom dokumen tanpa menimpa keseluruhan dokumen.

Dalam cuplikan di bawah, kode memperbarui urutan 123

index.js

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

Menghapus dokumen

Di Firestore, Anda dapat menghapus koleksi, dokumen, atau kolom tertentu dari dokumen. Untuk menghapus dokumen, gunakan metode delete().

Cuplikan di bawah menghapus pesanan 123.

index.js

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

10. Men-deploy dan Menguji

Di bagian ini, Anda akan men-deploy aplikasi ke Cloud Run dan menguji metode buat, update, dan hapus.

Men-deploy aplikasi ke Cloud Run

  1. Simpan URL dalam variabel INVENTORY_SERVICE_URL untuk diintegrasikan dengan Layanan Inventaris
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Men-deploy layanan pesanan
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

Contoh output

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

Menguji aplikasi Cloud Run

Buat dokumen

  1. Menyimpan URL aplikasi layanan pesanan ke dalam variabel untuk diuji
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Membuat permintaan pesanan dan memposting pesanan baru ke database 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
        }
    ]
}'

Contoh output

{"orderNumber":46429}

Simpan Nomor Pesanan untuk digunakan nanti

export ORDER_NUMBER=<value_from_output>

Lihat hasil

Melihat hasil di Firestore

  1. Buka konsol Firestore
  2. Klik Data

465ceca6198b2b88.pngS

Memperbarui dokumen

Pesanan yang dikirim tidak menyertakan jumlah.

  1. Perbarui data dan tambahkan pasangan nilai kunci jumlah
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Contoh output

{"status":"success"}

Lihat hasil

Melihat hasil di Firestore

  1. Buka konsol Firestore
  2. Klik Data

cfcf78d200e15b84.png

Menghapus dokumen

  1. Menghapus item 46429 dari koleksi pesanan Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Lihat hasil

  1. Buka konsol Firestore
  2. Klik Data

73e14d69211d1539.pngS

11. Selamat!

Selamat, kamu telah menyelesaikan lab!

Langkah berikutnya:

Pelajari codelab Cymbal Eats lainnya:

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource, atau simpan project dan hapus resource satu per satu.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.