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



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
ตั้งค่าสภาพแวดล้อม
- สร้างตัวแปรรหัสโปรเจ็กต์
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
- เปิดใช้ 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
- โคลนที่เก็บ
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
- ไปยังไดเรกทอรี
cd cymbal-eats/inventory-service/spanner
4. สร้างและกำหนดค่าอินสแตนซ์ Spanner
Spanner เป็นฐานข้อมูลเชิงสัมพันธ์แบ็กเอนด์ของบริการสินค้าคงคลัง คุณจะสร้างอินสแตนซ์ ฐานข้อมูล และสคีมา Spanner ในขั้นตอนต่อไปนี้
สร้างอินสแตนซ์
- สร้างอินสแตนซ์ Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1
ตัวอย่างเอาต์พุต
Creating instance...done.
- ตรวจสอบว่ากำหนดค่าอินสแตนซ์ 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
สร้างฐานข้อมูลและสคีมา
สร้างฐานข้อมูลใหม่และใช้ภาษานิยามข้อมูล (DDL) ของ SQL มาตรฐานของ Google เพื่อสร้างสคีมาของฐานข้อมูล
- สร้างไฟล์ DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
- สร้างฐานข้อมูล Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl
ตัวอย่างเอาต์พุต
Creating database...done.
ตรวจสอบสถานะและสคีมาของฐานข้อมูล
- ดูสถานะของฐานข้อมูล
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
- ดูสคีมาของฐานข้อมูล
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 ปัจจุบัน กลยุทธ์นี้เรียกว่าข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน และช่วยให้โค้ดสามารถทำงานได้ในสภาพแวดล้อมหลายอย่าง
อย่างไรก็ตาม คุณควรสร้างข้อมูลประจำตัวเฉพาะโดยการมอบหมายบัญชีบริการที่มีการจัดการโดยผู้ใช้แทนบัญชีบริการเริ่มต้น
- มอบบทบาทผู้ดูแลฐานข้อมูล Spanner ให้กับบัญชีบริการ
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"
ตัวอย่างเอาต์พุต
Updated IAM policy for project [cymbal-eats-6422-3462]. [...]
การใช้ไลบรารีของไคลเอ็นต์
ไลบรารีของไคลเอ็นต์ Spanner จะซ่อนความซับซ้อนของการผสานรวมกับ Spanner และพร้อมใช้งานในภาษาโปรแกรมยอดนิยมหลายภาษา
สร้างไคลเอ็นต์ Spanner
ไคลเอ็นต์ Spanner เป็นไคลเอ็นต์สำหรับอ่านและเขียนข้อมูลไปยังฐานข้อมูล Cloud Spanner ไคลเอ็นต์สามารถใช้พร้อมกันได้อย่างปลอดภัย ยกเว้นเมธอด Close
ข้อมูลโค้ดด้านล่างจะสร้างไคลเอ็นต์ Spanner
main.go
var dataClient *spanner.Client ... dataClient, err = spanner.NewClient(ctx, databaseName)
คุณสามารถคิดว่าไคลเอ็นต์เป็นการเชื่อมต่อฐานข้อมูลได้ เนื่องจากคุณต้องโต้ตอบกับ Cloud Spanner ผ่านไคลเอ็นต์ โดยปกติแล้ว คุณจะสร้างไคลเอ็นต์เมื่อแอปพลิเคชันเริ่มต้น จากนั้นจึงนำไคลเอ็นต์นั้นกลับมาใช้ซ้ำเพื่ออ่าน เขียน และดำเนินการธุรกรรม ไคลเอ็นต์แต่ละรายใช้ทรัพยากรใน Cloud Spanner
แก้ไขข้อมูล
การแทรก อัปเดต และลบข้อมูลจากฐานข้อมูล Spanner ทำได้หลายวิธี วิธีการที่ใช้ได้มีดังนี้
ในฟังก์ชันทดลองนี้ คุณจะใช้การเปลี่ยนแปลงเพื่อแก้ไขข้อมูลใน Spanner
การเปลี่ยนแปลงใน Spanner
การเปลี่ยนแปลงคือคอนเทนเนอร์สำหรับการดำเนินการเปลี่ยนแปลง การจำลองแสดงถึงลำดับของการแทรก การอัปเดต และการลบที่ Cloud Spanner ใช้กับแถวและตารางต่างๆ ในฐานข้อมูล Cloud Spanner แบบอะตอม
main.go
m := []*spanner.Mutation{}
m = append(m, spanner.Insert(
"inventoryHistory",
inventoryHistoryColumns,
[]interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))
ข้อมูลโค้ดจะแทรกแถวใหม่ลงในตารางประวัติพื้นที่โฆษณา
การติดตั้งใช้งานและการทดสอบ
เมื่อกำหนดค่า Spanner และตรวจสอบองค์ประกอบโค้ดหลักแล้ว ให้ทำให้แอปพลิเคชันใช้งานได้ใน Cloud Run
ทำให้แอปพลิเคชันใช้งานได้ใน Cloud Run
Cloud Run สามารถสร้าง พุช และทำให้โค้ดใช้งานได้โดยอัตโนมัติด้วยคำสั่งเดียว ในคำสั่งต่อไปนี้ คุณจะเรียกใช้คำสั่ง deploy ในบริการ run โดยส่งตัวแปรที่แอปพลิเคชันที่กำลังทำงานใช้อยู่ เช่น SPANNER_CONNECTION_STRING ที่คุณสร้างไว้ก่อนหน้านี้
- คลิกเปิดเทอร์มินัล
- ติดตั้งใช้งานบริการสินค้าคงคลังใน 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
- จัดเก็บ URL ของบริการ
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
ทดสอบแอปพลิเคชัน Cloud Run
แทรกรายการ
- ใน Cloud Shell ให้ป้อนคำสั่งต่อไปนี้
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
ค้นหาสินค้า
- ค้นหาบริการสินค้าคงคลัง
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 จะระบุสิ่งที่ผู้ใช้ต้องการโดยไม่ต้องอธิบายวิธีรับผลลัพธ์
- ในเทอร์มินัล ให้ป้อนคำสั่งนี้เพื่อค้นหาตารางสำหรับระเบียนที่สร้างไว้ก่อนหน้านี้
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 อย่างไร
- เปิดหน้าอินสแตนซ์ Cloud Spanner ในคอนโซล
- ไปที่อินสแตนซ์ Cloud Spanner
- คลิกชื่ออินสแตนซ์ Cloud Spanner จากส่วนฐานข้อมูล ให้เลือกฐานข้อมูลที่ต้องการค้นหา
- คลิกคำค้นหา
- ป้อนการค้นหาต่อไปนี้ในตัวแก้ไขการค้นหา
SELECT * FROM InventoryHistory WHERE ItemID=1
- คลิกเรียกใช้
- คลิกคำอธิบาย
Cloud Console จะแสดงแผนการดำเนินการแบบภาพสำหรับการค้นหาของคุณ

เครื่องมือเพิ่มประสิทธิภาพคำค้นหา
ตัวเพิ่มประสิทธิภาพการค้นหาของ Cloud Spanner จะเปรียบเทียบแผนการดำเนินการทางเลือกและเลือกแผนที่มีประสิทธิภาพมากที่สุด เมื่อเวลาผ่านไป เครื่องมือเพิ่มประสิทธิภาพการค้นหาจะพัฒนาขึ้น โดยจะขยายตัวเลือกในแผนการดำเนินการค้นหาและปรับปรุงความแม่นยำของการประมาณค่าที่แจ้งตัวเลือกเหล่านั้น ซึ่งจะนำไปสู่แผนการดำเนินการค้นหาที่มีประสิทธิภาพมากขึ้น
Cloud Spanner จะเปิดตัวการอัปเดตตัวเพิ่มประสิทธิภาพเป็นตัวเพิ่มประสิทธิภาพการค้นหาเวอร์ชันใหม่ โดยค่าเริ่มต้น ฐานข้อมูลแต่ละรายการจะเริ่มใช้เครื่องมือเพิ่มประสิทธิภาพเวอร์ชันล่าสุดหลังจากที่เวอร์ชันดังกล่าวเผยแพร่แล้วอย่างน้อย 30 วัน
หากต้องการดูเวอร์ชันที่ใช้เมื่อเรียกใช้การค้นหาใน gcloud spanner ให้ตั้งค่าสถานะ –query-mode เป็น PROFILE
- ป้อนคำสั่งต่อไปนี้เพื่อดูเวอร์ชันของเครื่องมือเพิ่มประสิทธิภาพ
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'
ตัวอย่างเอาต์พุต
TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
RELATIONAL Distributed Union
(1 execution, 0.11 msecs total latency)
subquery_cluster_node: 1
|
+- RELATIONAL Distributed Union
| (1 execution, 0.09 msecs total latency)
| call_type: Local, subquery_cluster_node: 2
| |
| \- RELATIONAL Serialize Result
| (1 execution, 0.08 msecs total latency)
| |
| +- RELATIONAL Scan
| | (1 execution, 0.08 msecs total latency)
| | Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
| | |
| | +- SCALAR Reference
| | | ItemRowID
| | |
| | +- SCALAR Reference
| | | ItemID
| | |
| | +- SCALAR Reference
| | | InventoryChange
| | |
| | \- SCALAR Reference
| | Timestamp
| |
| +- SCALAR Reference
| | $ItemRowID
| |
| +- SCALAR Reference
| | $ItemID
| |
| +- SCALAR Reference
| | $InventoryChange
| |
| \- SCALAR Reference
| $Timestamp
|
\- SCALAR Constant
true
ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:
อัปเดตเวอร์ชันเครื่องมือเพิ่มประสิทธิภาพ
เวอร์ชันล่าสุด ณ เวลาที่ทำการทดลองนี้คือเวอร์ชัน 4 จากนั้นคุณจะอัปเดตตาราง Spanner เพื่อใช้เวอร์ชัน 4 สำหรับเครื่องมือเพิ่มประสิทธิภาพการค้นหา
- อัปเดตเครื่องมือเพิ่มประสิทธิภาพ
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'
ตัวอย่างเอาต์พุต
Schema updating...done.
- ป้อนคำสั่งต่อไปนี้เพื่อดูการอัปเดตเวอร์ชันของเครื่องมือเพิ่มประสิทธิภาพ
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 ใน Cloud Console เพื่อแสดงภาพจำนวนการค้นหาสำหรับอินสแตนซ์ฐานข้อมูลได้ คุณดูได้ว่าฐานข้อมูลแต่ละรายการใช้เครื่องมือเพิ่มประสิทธิภาพเวอร์ชันใด
- ไปที่การตรวจสอบใน Cloud Console แล้วเลือก Metrics Explorer ในเมนูด้านซ้าย
- ในช่องประเภททรัพยากร ให้เลือกอินสแตนซ์ Cloud Spanner
- ในช่องเมตริก ให้เลือกจํานวนการค้นหา แล้วคลิกใช้
- ในช่องจัดกลุ่มตาม ให้เลือก database, optimizer_version และ status

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

8. แนวคิดเกี่ยวกับ Firestore
โมเดลข้อมูล
ฐานข้อมูล Firestore ประกอบด้วยคอลเล็กชันและเอกสาร

เอกสาร
แต่ละเอกสารจะมีชุดคู่คีย์-ค่า Firestore ได้รับการเพิ่มประสิทธิภาพสำหรับการจัดเก็บคอลเล็กชันขนาดใหญ่ของเอกสารขนาดเล็ก

คอลเล็กชัน
คุณต้องจัดเก็บเอกสารทั้งหมดไว้ในคอลเล็กชัน เอกสารอาจมีคอลเล็กชันย่อยและออบเจ็กต์ที่ซ้อนกัน รวมถึงฟิลด์ดั้งเดิม เช่น สตริง หรือออบเจ็กต์ที่ซับซ้อน เช่น รายการ

สร้างฐานข้อมูล Firestore
- สร้างฐานข้อมูล Firestore
gcloud firestore databases create --location=$REGION
ตัวอย่างเอาต์พุต
Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462
9. การผสานรวม Firestore เข้ากับแอปพลิเคชัน
ในส่วนนี้ คุณจะอัปเดตบัญชีบริการ เพิ่มบัญชีบริการที่มีสิทธิ์เข้าถึง Firestore ตรวจสอบและใช้กฎความปลอดภัยของ Firestore รวมถึงตรวจสอบวิธีแก้ไขข้อมูลใน Firestore
ตั้งค่าการตรวจสอบสิทธิ์
- มอบบทบาทผู้ใช้ 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
กฎความปลอดภัยให้การควบคุมการเข้าถึงและการตรวจสอบข้อมูลในรูปแบบที่สื่อความหมายแต่ตรงไปตรงมา
- ไปที่ไดเรกทอรี order-service/starter-code
cd ~/cymbal-eats/order-service
- เปิดไฟล์ firestore.rules ใน Cloud Editor
cat firestore.rules
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents { ⇐ All database
match /{document=**} { ⇐ All documents
allow read: if true; ⇐ Allow reads
}
match /{document=**} {
allow write: if false; ⇐ Deny writes
}
}
}
คำเตือน: แนวทางปฏิบัติแนะนำคือการจำกัดการเข้าถึงที่เก็บข้อมูล Firestore ในแล็บนี้ เราจะอนุญาตการอ่านทั้งหมด นี่ไม่ใช่การกำหนดค่าการใช้งานจริงที่แนะนำ
เปิดใช้บริการที่มีการจัดการของ Firestore
- คลิกเปิดเทอร์มินัล
- สร้างไฟล์ .firebaserc ด้วยรหัสโปรเจ็กต์ปัจจุบัน การตั้งค่าสำหรับเป้าหมายการทำให้ใช้งานได้จะจัดเก็บไว้ในไฟล์ .firebaserc ในไดเรกทอรีโปรเจ็กต์
firebaserc.tmpl
sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
- ดาวน์โหลดไบนารี 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!
- ใช้กฎ 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() คุณต้องระบุรหัสสำหรับเอกสารที่จะสร้าง
ดูข้อมูลโค้ดด้านล่าง
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 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
- จัดเก็บ URL ในตัวแปร INVENTORY_SERVICE_URL เพื่อผสานรวมกับ Inventory Service
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--region=$REGION \
--format=json | jq \
--raw-output ".status.url")
- ติดตั้งใช้งานบริการคำสั่งซื้อ
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
สร้างเอกสาร
- จัดเก็บ URL ของแอปพลิเคชันบริการคำสั่งซื้อไว้ในตัวแปรสำหรับการทดสอบ
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- สร้างคำขอสั่งซื้อและโพสต์คำสั่งซื้อใหม่ลงในฐานข้อมูล 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
- ไปที่คอนโซล Firestore
- คลิก "ข้อมูล"

อัปเดตเอกสาร
คำสั่งซื้อที่ส่งมาไม่มีจำนวน
- อัปเดตระเบียนและเพิ่มคู่คีย์-ค่าของจำนวน
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
- ไปที่คอนโซล Firestore
- คลิก "ข้อมูล"

ลบเอกสาร
- ลบรายการ 46429 ออกจากคอลเล็กชันคำสั่งซื้อของ Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}
ดูผลลัพธ์
- ไปที่คอนโซล Firestore
- คลิก "ข้อมูล"

11. ยินดีด้วย
ยินดีด้วย คุณทำแล็บเสร็จแล้ว
ขั้นตอนต่อไปที่ทำได้
ดู Codelab อื่นๆ ของ Cymbal Eats
- ทริกเกอร์เวิร์กโฟลว์ระบบคลาวด์ด้วย Eventarc
- การทริกเกอร์การประมวลผลเหตุการณ์จาก Cloud Storage
- การเชื่อมต่อกับ Private Cloud SQL จาก Cloud Run
- ปกป้องแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วย Identity-Aware Proxy (IAP)
- ทริกเกอร์งาน Cloud Run ด้วย Cloud Scheduler
- การทำให้ใช้งานได้กับ Cloud Run อย่างปลอดภัย
- การรักษาความปลอดภัยให้การรับส่งข้อมูลขาเข้าของ Cloud Run
- การเชื่อมต่อกับ AlloyDB ส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
โปรดลบโปรเจ็กต์ที่มีทรัพยากรหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
การลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับบทแนะนำ