การเชื่อมต่อกับฐานข้อมูลที่มีการจัดการครบวงจรจาก Cloud Run

1. ภาพรวม

คุณจะได้ผสานรวมฐานข้อมูลแบบ Serverless(SPANer และ Firestore) กับแอปพลิเคชัน(Go และ Node.js) ที่ทำงานใน Cloud Run ในห้องทดลองนี้ แอปพลิเคชัน Cymbal Eats ประกอบด้วยบริการหลายรายการที่ทำงานบน Cloud Run ในขั้นตอนต่อไปนี้ คุณจะต้องกำหนดค่าบริการให้ใช้ฐานข้อมูลเชิงสัมพันธ์ Cloud Spanner และ Cloud Firestore ซึ่งเป็นฐานข้อมูลเอกสาร NoSQL การใช้ผลิตภัณฑ์แบบ Serverless สำหรับระดับข้อมูลและรันไทม์ของแอปพลิเคชันช่วยให้คุณไม่ต้องจัดการโครงสร้างพื้นฐานทั้งหมด โดยมุ่งเน้นที่การสร้างแอปพลิเคชันแทนที่จะต้องกังวลเกี่ยวกับค่าใช้จ่าย

2. สิ่งที่คุณจะได้เรียนรู้

ในห้องทดลองนี้ คุณจะได้ศึกษาวิธีทำสิ่งต่อไปนี้

  • ผสานรวม Spanner
  • เปิดใช้บริการที่มีการจัดการของ Spanner
  • ผสานรวมเข้ากับโค้ด
  • ทำให้โค้ดที่เชื่อมต่อกับ Spanner ใช้งานได้
  • ผสานรวม Firestore
  • เปิดใช้บริการที่มีการจัดการของ Firestore
  • ผสานรวมเข้ากับโค้ด
  • ทำให้โค้ดที่เชื่อมต่อกับ Firestore ใช้งานได้

3. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตวิธีการชำระเงินได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้ใช้งานหรือไม่ คุณจะเปลี่ยนแปลงหลังจากขั้นตอนนี้ไม่ได้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้จะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่นอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud ใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรี$300 USD

ตั้งค่าสภาพแวดล้อม

  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. เปิดใช้ Spanner, Cloud Run, Cloud Build และ 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. โคลนที่เก็บ
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

สร้างฐานข้อมูลและสคีมา

สร้างฐานข้อมูลใหม่และใช้ภาษาคำจำกัดความข้อมูลของ Google SQL มาตรฐาน (DDL) เพื่อสร้างสคีมาฐานข้อมูล

  1. สร้างไฟล์ DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. สร้างฐานข้อมูล Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

ตัวอย่างเอาต์พุต

Creating database...done.

ยืนยันสถานะและสคีมาของฐานข้อมูล

  1. ดูสถานะของฐานข้อมูล
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

ตัวอย่างเอาต์พุต

createTime: '2022-04-22T15:11:33.559300Z'
databaseDialect: GOOGLE_STANDARD_SQL
earliestVersionTime: '2022-04-22T15:11:33.559300Z'
encryptionInfo:
- encryptionType: GOOGLE_DEFAULT_ENCRYPTION
name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory
state: READY
versionRetentionPeriod: 1h
  1. ดูสคีมาของฐานข้อมูล
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

ตัวอย่างเอาต์พุต

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

5. การผสานรวม Spanner

ในส่วนนี้ คุณจะได้เรียนรู้วิธีผสานรวม Spanner เข้ากับแอปพลิเคชันของคุณ นอกจากนี้ SQL Spanner ยังมีไลบรารีไคลเอ็นต์, ไดรเวอร์ JDBC, ไดรเวอร์ R2DBC, REST API และ RPC API ซึ่งช่วยให้คุณผสานรวม 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 ไคลเอ็นต์ใช้งานพร้อมกันได้อย่างปลอดภัย ยกเว้นวิธีการปิด

ข้อมูลโค้ดด้านล่างสร้างไคลเอ็นต์ประแจ

main.go

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

คุณอาจมองว่าไคลเอ็นต์เป็นการเชื่อมต่อฐานข้อมูล การโต้ตอบทั้งหมดกับ Cloud Spanner จะต้องผ่านไคลเอ็นต์ โดยปกติแล้ว คุณจะสร้างไคลเอ็นต์เมื่อแอปพลิเคชันเริ่มต้นทำงาน จากนั้นคุณจะใช้ไคลเอ็นต์นั้นซ้ำเพื่ออ่าน เขียน และดำเนินธุรกรรม ไคลเอ็นต์แต่ละรายใช้ทรัพยากรใน Cloud Spanner

แก้ไขข้อมูล

การแทรก อัปเดต และลบข้อมูลจากฐานข้อมูล Spanner ได้หลายวิธี วิธีที่ใช้ได้มีดังนี้

ในห้องทดลองนี้ คุณจะใช้การเปลี่ยนแปลงเพื่อแก้ไขข้อมูลใน Spanner

Mutations ใน Spanner

Mutation คือคอนเทนเนอร์สำหรับการดำเนินการ Mutation Mutation แสดงลำดับของการแทรก อัปเดต และลบที่ 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. แนวคิด Spanner

Cloud Spanner จะค้นหาฐานข้อมูลโดยใช้คำสั่ง SQL แบบประกาศ คำสั่ง SQL ระบุสิ่งที่ผู้ใช้ต้องการโดยไม่อธิบายว่าจะได้รับผลลัพธ์อย่างไร

  1. ป้อนคำสั่งนี้ลงในเทอร์มินัลเพื่อค้นหาระเบียนที่สร้างไว้ก่อนหน้านี้ในตาราง
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

ตัวอย่างเอาต์พุต

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

แผนการดำเนินการค้นหา

แผนการดำเนินการค้นหาคือชุดขั้นตอนที่ Spanner ใช้เพื่อให้ได้ผลลัพธ์ การรับผลลัพธ์ของคำสั่ง SQL หนึ่งๆ ทำได้หลายวิธี คุณจะเข้าถึงแผนการดำเนินการค้นหาได้ในคอนโซลและไลบรารีของไคลเอ็นต์ วิธีดูวิธีที่ Spanner จัดการการค้นหา SQL

  1. เปิดหน้าอินสแตนซ์ Cloud Spanner ในคอนโซล
  2. ไปที่อินสแตนซ์ Cloud Spanner
  3. คลิกชื่ออินสแตนซ์ Cloud Spanner จากส่วนฐานข้อมูล ให้เลือกฐานข้อมูลที่คุณต้องการค้นหา
  4. คลิกค้นหา
  5. ป้อนคำค้นหาต่อไปนี้ในตัวแก้ไขคำค้นหา
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. คลิก "เรียกใช้"
  2. คลิก "คำอธิบาย"

Cloud Console จะแสดงแผนการดำเนินการแบบภาพสำหรับการค้นหาของคุณ

149f8bae468f8b34.png

เครื่องมือเพิ่มประสิทธิภาพการค้นหา

เครื่องมือเพิ่มประสิทธิภาพการค้นหาของ Cloud Spanner จะเปรียบเทียบแผนการดำเนินการอื่นและเลือกแผนที่มีประสิทธิภาพมากที่สุด เมื่อเวลาผ่านไป เครื่องมือเพิ่มประสิทธิภาพการค้นหาจะพัฒนาไปพร้อมๆ กับขยายตัวเลือกต่างๆ ในแผนการดำเนินการค้นหา และปรับปรุงความแม่นยำของค่าประมาณต่างๆ ซึ่งจะบอกถึงตัวเลือกเหล่านั้น ซึ่งจะทำให้แผนการดำเนินการค้นหามีประสิทธิภาพมากขึ้น

Cloud Spanner เปิดตัวการอัปเดตเครื่องมือเพิ่มประสิทธิภาพเป็นเครื่องมือเพิ่มประสิทธิภาพการค้นหาเวอร์ชันใหม่ โดยค่าเริ่มต้น ฐานข้อมูลแต่ละรายการจะเริ่มใช้เครื่องมือเพิ่มประสิทธิภาพเวอร์ชันล่าสุดหลังจากเผยแพร่เวอร์ชันแล้วไม่เกิน 30 วัน

หากต้องการดูเวอร์ชันที่ใช้เมื่อเรียกใช้การค้นหาใน gcloud spanner ให้ตั้งค่าสถานะ –query-mode เป็น PROFILE

  1. ป้อนคำสั่งต่อไปนี้เพื่อดูเวอร์ชันของเครื่องมือเพิ่มประสิทธิภาพ
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

ตัวอย่างเอาต์พุต

TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
 RELATIONAL Distributed Union
 (1 execution, 0.11 msecs total latency)
 subquery_cluster_node: 1
    |
    +- RELATIONAL Distributed Union
    |  (1 execution, 0.09 msecs total latency)
    |  call_type: Local, subquery_cluster_node: 2
    |   |
    |   \- RELATIONAL Serialize Result
    |      (1 execution, 0.08 msecs total latency)
    |       |
    |       +- RELATIONAL Scan
    |       |  (1 execution, 0.08 msecs total latency)
    |       |  Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemRowID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  ItemID
    |       |   |
    |       |   +- SCALAR Reference
    |       |   |  InventoryChange
    |       |   |
    |       |   \- SCALAR Reference
    |       |      Timestamp
    |       |
    |       +- SCALAR Reference
    |       |  $ItemRowID
    |       |
    |       +- SCALAR Reference
    |       |  $ItemID
    |       |
    |       +- SCALAR Reference
    |       |  $InventoryChange
    |       |
    |       \- SCALAR Reference
    |          $Timestamp
    |
    \- SCALAR Constant
       true

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:

อัปเดตเวอร์ชันของตัวเพิ่มประสิทธิภาพ

เวอร์ชันใหม่ล่าสุด ณ เวลาที่ Lab นี้คือเวอร์ชัน 4 จากนั้น คุณจะอัปเดตตาราง Spanner เพื่อใช้เวอร์ชัน 4 สำหรับตัวเพิ่มประสิทธิภาพการค้นหา

  1. อัปเดตเครื่องมือเพิ่มประสิทธิภาพ
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

ตัวอย่างเอาต์พุต

Schema updating...done. 
  1. ป้อนคำสั่งต่อไปนี้เพื่อดูการอัปเดตเวอร์ชันของเครื่องมือเพิ่มประสิทธิภาพ
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

ตัวอย่างเอาต์พุต

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

แสดงภาพเวอร์ชันของเครื่องมือเพิ่มประสิทธิภาพการค้นหาใน Metrics Explorer

คุณสามารถใช้ Metrics Explorer ใน Cloud Console เพื่อแสดงภาพจำนวนการค้นหาสำหรับอินสแตนซ์ฐานข้อมูล คุณดูได้ว่ากำลังใช้เครื่องมือเพิ่มประสิทธิภาพเวอร์ชันใดอยู่ในฐานข้อมูลแต่ละรายการ

  1. ไปที่ Monitoring ใน Cloud Console แล้วเลือก Metrics Explorer ในเมนูด้านซ้าย
  2. ในช่องประเภททรัพยากร ให้เลือกอินสแตนซ์ Cloud Spanner
  3. ในช่องเมตริก ให้เลือกจำนวนคำค้นหาและใช้
  4. ในช่อง Group By ให้เลือกฐานข้อมูล, optimizer_version และสถานะ

581b859c25790b21.png

7. สร้างและกำหนดค่าฐานข้อมูล Firestore

Firestore เป็นฐานข้อมูลเอกสาร NoSQL ที่สร้างขึ้นมาสำหรับการปรับขนาดอัตโนมัติ โดยมีประสิทธิภาพสูง และพัฒนาแอปพลิเคชันได้อย่างง่ายดาย แม้ว่าอินเทอร์เฟซ Firestore จะมีฟีเจอร์มากมายเหมือนกับฐานข้อมูลแบบดั้งเดิม แต่ฐานข้อมูล NoSQL จะแตกต่างจากฟีเจอร์ดังกล่าวในการอธิบายความสัมพันธ์ระหว่างออบเจ็กต์ข้อมูล

งานต่อไปนี้จะแนะนำคุณตลอดขั้นตอนการสร้างแอปพลิเคชัน Cloud Run สำหรับบริการสั่งซื้อที่ได้รับการสนับสนุนโดย Firestore บริการสั่งซื้อจะเรียกใช้บริการสินค้าคงคลังที่สร้างในส่วนก่อนหน้าเพื่อค้นหาฐานข้อมูล Spanner ก่อนที่จะเริ่มคำสั่งซื้อ บริการนี้จะตรวจสอบให้มั่นใจว่ามีสินค้าคงคลังเพียงพอและสามารถเติมคำสั่งซื้อได้

6843abaf4263e112.png

8. แนวคิดของ Firestore

โมเดลข้อมูล

ฐานข้อมูล 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. มอบบทบาทของผู้ใช้ Datastore แก่บัญชีบริการ
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 อนุญาตให้อ่านทั้งหมดตามวัตถุประสงค์ของ Lab นี้ โปรดทราบว่านี่ไม่ใช่การกำหนดค่าเวอร์ชันที่ใช้งานจริงที่แนะนำ

เปิดใช้บริการที่มีการจัดการของ 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
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. ยินดีด้วย

ยินดีด้วย คุณใช้งานห้องทดลองเสร็จแล้ว

ขั้นตอนต่อไปที่ทำได้

สำรวจ Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

เพื่อหลีกเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ

กำลังลบโปรเจ็กต์

วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างไว้สำหรับบทแนะนำ