Kết nối với cơ sở dữ liệu được quản lý hoàn toàn từ Cloud Run

1. Tổng quan

Trong phòng thí nghiệm này, bạn sẽ tích hợp cơ sở dữ liệu không máy chủ(Spanner và Firestore) với các ứng dụng(Go và Node.js) chạy trong Cloud Run. Ứng dụng Cymbal Eats bao gồm nhiều dịch vụ chạy trên Cloud Run. Trong các bước sau, bạn sẽ định cấu hình các dịch vụ để sử dụng cơ sở dữ liệu quan hệ Cloud SpannerCloud Firestore, một cơ sở dữ liệu tài liệu NoSQL. Việc sử dụng các sản phẩm không máy chủ cho cấp dữ liệu và thời gian chạy của ứng dụng sẽ giúp bạn loại bỏ mọi hoạt động quản lý cơ sở hạ tầng, tập trung vào việc xây dựng ứng dụng thay vì lo lắng về chi phí.

2. Kiến thức bạn sẽ học được

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thực hiện những việc sau:

  • Tích hợp Spanner
  • Bật dịch vụ do Spanner quản lý
  • Tích hợp vào mã
  • Triển khai mã kết nối với Spanner
  • Tích hợp Firestore
  • Bật các dịch vụ do Firestore quản lý
  • Tích hợp vào mã
  • Triển khai mã kết nối với Firestore

3. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Môi trường thiết lập

  1. Tạo biến mã dự án
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. Bật Spanner, Cloud Run, Cloud Build và 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. Sao chép kho lưu trữ
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. Chuyển đến thư mục
cd cymbal-eats/inventory-service/spanner

4. Tạo và định cấu hình thực thể Spanner

Spanner là cơ sở dữ liệu quan hệ phụ trợ của dịch vụ khoảng không quảng cáo. Bạn sẽ tạo một phiên bản, cơ sở dữ liệu và giản đồ Spanner trong các bước sau.

Tạo một thực thể

  1. Tạo một thực thể Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

Kết quả ví dụ

Creating instance...done.   
  1. Xác minh xem thực thể Spanner có được định cấu hình đúng cách hay không
gcloud spanner instances list

Kết quả ví dụ

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

Tạo cơ sở dữ liệu và giản đồ

Tạo cơ sở dữ liệu mới và sử dụng ngôn ngữ định nghĩa dữ liệu (DDL) tiêu chuẩn của Google để tạo giản đồ cơ sở dữ liệu.

  1. Tạo tệp DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
  1. Tạo cơ sở dữ liệu Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl

Kết quả ví dụ

Creating database...done.

Xác minh trạng thái và giản đồ của cơ sở dữ liệu

  1. Xem trạng thái của cơ sở dữ liệu
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Kết quả ví dụ

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. Xem giản đồ của cơ sở dữ liệu
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE

Kết quả ví dụ

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

5. Tích hợp Spanner

Trong phần này, bạn sẽ tìm hiểu cách tích hợp Spanner vào ứng dụng. Ngoài ra, SQL Spanner cung cấp Thư viện ứng dụng, trình điều khiển JDBC, trình điều khiển R2DBC, API RESTAPI RPC, cho phép bạn tích hợp Spanner vào bất kỳ ứng dụng nào.

Trong phần tiếp theo, bạn sẽ dùng thư viện ứng dụng Go để cài đặt, xác thực và sửa đổi dữ liệu trong Spanner.

Cài đặt thư viện ứng dụng

Thư viện ứng dụng Cloud Spanner giúp bạn tích hợp dễ dàng hơn với Cloud Spanner bằng cách tự động sử dụng Thông tin xác thực mặc định của ứng dụng (ADC) để tìm thông tin đăng nhập cho tài khoản dịch vụ của bạn

Thiết lập tính năng xác thực

Thư viện ứng dụng Google Cloud CLI và Google Cloud sẽ tự động phát hiện thời điểm các thư viện này chạy trên Google Cloud và sử dụng tài khoản dịch vụ thời gian chạy của bản sửa đổi Cloud Run hiện tại. Chiến lược này được gọi là Thông tin xác thực mặc định của ứng dụng và cho phép khả năng di chuyển mã trên nhiều môi trường.

Tuy nhiên, tốt nhất là bạn nên tạo một danh tính riêng bằng cách chỉ định cho tài khoản đó một tài khoản dịch vụ do người dùng quản lý thay vì tài khoản dịch vụ mặc định.

  1. Cấp vai trò Quản trị viên cơ sở dữ liệu Spanner cho tài khoản dịch vụ
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"

Kết quả ví dụ

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

Sử dụng thư viện ứng dụng

Các thư viện ứng dụng Spanner tóm tắt những điểm phức tạp của việc tích hợp với Spanner và có sẵn bằng nhiều ngôn ngữ lập trình phổ biến.

Tạo ứng dụng Spanner

Ứng dụng Spanner là một ứng dụng dùng để đọc và ghi dữ liệu vào cơ sở dữ liệu Cloud Spanner. Ứng dụng có thể sử dụng đồng thời một cách an toàn, ngoại trừ phương thức Close của ứng dụng đó.

Đoạn mã dưới đây tạo một ứng dụng spanner

main.go

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

Bạn có thể xem Ứng dụng là một kết nối cơ sở dữ liệu: tất cả các hoạt động tương tác của bạn với Cloud Spanner đều phải trải qua một Ứng dụng. Thông thường, bạn sẽ tạo một Ứng dụng khi ứng dụng của bạn khởi động, sau đó sử dụng lại ứng dụng đó để đọc, ghi và thực thi các giao dịch. Mỗi ứng dụng đều sử dụng tài nguyên trong Cloud Spanner.

Sửa đổi dữ liệu

Có nhiều cách để chèn, cập nhật và xoá dữ liệu trong cơ sở dữ liệu Spanner. Dưới đây là các phương thức hiện có.

Trong phòng thí nghiệm này, bạn sẽ sử dụng biến đổi để sửa đổi dữ liệu trong Spanner.

Đột biến trong Spanner

Mutation (Mutation) là vùng chứa cho hoạt động đột biến. Đột biến thể hiện một chuỗi các thao tác chèn, cập nhật và xoá mà Cloud Spanner áp dụng nguyên tắc cho nhiều hàng và bảng trong cơ sở dữ liệu Cloud Spanner.

main.go

m := []*spanner.Mutation{}

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

Đoạn mã sẽ chèn một hàng mới vào bảng nhật ký kho hàng.

Triển khai và thử nghiệm

Giờ đây, Spanner đã được định cấu hình và bạn đã xem xét các thành phần mã chính triển khai ứng dụng vào Cloud Run.

Triển khai ứng dụng trên Cloud Run

Cloud Run có thể tự động tạo, đẩy và triển khai mã bằng một lệnh duy nhất. Trong lệnh sau, bạn sẽ gọi lệnh deploy trên dịch vụ run, truyền các biến mà ứng dụng đang chạy sử dụng, chẳng hạn như SPANNER_CONNECTION_STRING mà bạn đã tạo trước đó.

  1. Nhấp vào Open Terminal (Mở cửa sổ dòng lệnh)
  2. Triển khai dịch vụ khoảng không quảng cáo lên 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

Kết quả ví dụ

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. Lưu trữ URL dịch vụ
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

Kiểm thử ứng dụng Cloud Run

Chèn một mục

  1. Trong Cloudshell, hãy nhập lệnh sau.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

Kết quả ví dụ

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

Truy vấn một mục

  1. Truy vấn dịch vụ kho hàng
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}

Ví dụ về phản hồi

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. Khái niệm Spanner

Cloud Spanner truy vấn cơ sở dữ liệu bằng câu lệnh SQL khai báo. Câu lệnh SQL cho biết người dùng muốn gì mà không mô tả cách thu được kết quả.

  1. Trong cửa sổ dòng lệnh, hãy nhập lệnh này để truy vấn bảng về bản ghi đã tạo trước đó.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'

Kết quả ví dụ

ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp: 

Kế hoạch thực thi truy vấn

Kế hoạch thực thi truy vấn là một loạt các bước mà Spanner sử dụng để thu được kết quả. Có thể có một số cách để lấy kết quả của một câu lệnh SQL cụ thể. Bạn có thể truy cập kế hoạch thực thi truy vấn trong bảng điều khiển và thư viện ứng dụng. Cách xem cách Spanner xử lý các truy vấn SQL:

  1. Trong bảng điều khiển, hãy mở trang các phiên bản Cloud Spanner.
  2. Chuyển đến các thực thể Cloud Spanner
  3. Nhấp vào tên của thực thể Cloud Spanner. Trong mục cơ sở dữ liệu, hãy chọn cơ sở dữ liệu mà bạn muốn truy vấn.
  4. Nhấp vào Truy vấn.
  5. Nhập truy vấn sau vào trình chỉnh sửa truy vấn
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Nhấp vào CHẠY
  2. Nhấp vào MỤC GIẢI THÍCH

Cloud Console hiển thị kế hoạch thực thi trực quan cho truy vấn của bạn.

149f8bae468f8b34.png.

Trình tối ưu hoá truy vấn

Trình tối ưu hoá truy vấn Cloud Spanner so sánh các gói thực thi thay thế và chọn gói hiệu quả nhất. Theo thời gian, trình tối ưu hoá truy vấn sẽ phát triển, mở rộng các lựa chọn trong kế hoạch thực thi truy vấn và cải thiện độ chính xác của các ước tính cung cấp thông tin cho các lựa chọn đó, giúp các kế hoạch thực thi truy vấn hiệu quả hơn.

Cloud Spanner triển khai các bản cập nhật trình tối ưu hoá dưới dạng phiên bản trình tối ưu hoá truy vấn mới. Theo mặc định, mỗi cơ sở dữ liệu bắt đầu sử dụng phiên bản mới nhất của trình tối ưu hoá không sớm hơn 30 ngày sau khi phiên bản đó được phát hành.

Để xem phiên bản được dùng khi chạy một truy vấn trong gcloud spanner, hãy đặt cờ –query-mode thành PROFILE

  1. Nhập lệnh sau để xem phiên bản trình tối ưu hoá
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Kết quả ví dụ

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:

Cập nhật phiên bản trình tối ưu hoá

Phiên bản mới nhất tại thời điểm của phòng thí nghiệm này là phiên bản 4. Tiếp theo, bạn sẽ cập nhật Bảng Spanner để sử dụng phiên bản 4 cho trình tối ưu hoá truy vấn.

  1. Cập nhật trình tối ưu hoá
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'

Kết quả ví dụ

Schema updating...done. 
  1. Nhập lệnh sau để xem bản cập nhật phiên bản trình tối ưu hoá
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'

Kết quả ví dụ

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

Trực quan hoá phiên bản trình tối ưu hoá truy vấn trong Trình khám phá chỉ số

Bạn có thể sử dụng Trình khám phá chỉ số trong Cloud Console để trực quan hoá Số lượng truy vấn cho thực thể cơ sở dữ liệu của mình. Bạn có thể xem phiên bản trình tối ưu hoá nào đang được sử dụng trong mỗi cơ sở dữ liệu.

  1. Chuyển đến trang Giám sát trong Cloud Console rồi chọn Trình khám phá chỉ số trong trình đơn bên trái.
  2. Trong trường Resource type (Loại tài nguyên), hãy chọn Phiên bản Cloud Spanner.
  3. Trong trường Chỉ số, hãy chọn Số lượt truy vấn rồi chọn Áp dụng.
  4. Trong trường Nhóm theo, hãy chọn cơ sở dữ liệu, phiên bản tối ưu hoá và trạng thái.

581b859c25790b21.pngS

7. Tạo và định cấu hình cơ sở dữ liệu Firestore

Firestore là một cơ sở dữ liệu tài liệu NoSQL, được xây dựng để tự động mở rộng quy mô, đạt hiệu suất cao và dễ dàng phát triển ứng dụng. Mặc dù giao diện Firestore có nhiều tính năng giống với cơ sở dữ liệu truyền thống, nhưng cơ sở dữ liệu NoSQL khác với các cơ sở dữ liệu này ở việc mô tả mối quan hệ giữa các đối tượng dữ liệu.

Nhiệm vụ sau đây sẽ hướng dẫn bạn tạo một ứng dụng dịch vụ đặt hàng Cloud Run do Firestore hỗ trợ. Dịch vụ đặt hàng sẽ gọi dịch vụ kho hàng đã tạo ở phần trước để truy vấn cơ sở dữ liệu Spanner trước khi bắt đầu đặt hàng. Dịch vụ này sẽ đảm bảo có đủ kho hàng và có thể thực hiện đơn đặt hàng.

6843abaf4263e112.pngs

8. Các ý tưởng về Firestore

Mô hình dữ liệu

Cơ sở dữ liệu Firestore bao gồm các bộ sưu tập và tài liệu.

b60acd63d4793a6c.png

Tài liệu

Mỗi tài liệu chứa một tập hợp các cặp khoá-giá trị. Firestore được tối ưu hoá để lưu trữ những bộ sưu tập lớn gồm các tài liệu có kích thước nhỏ.

5571cb2f261d2dbe.png.

Bộ sưu tập

Bạn phải lưu trữ tất cả tài liệu trong bộ sưu tập. Tài liệu có thể chứa các tập hợp con và đối tượng lồng nhau, bao gồm cả các trường gốc như chuỗi hoặc đối tượng phức tạp như danh sách.

5811378cb721e5ec.png.

Tạo cơ sở dữ liệu Firestore

  1. Tạo cơ sở dữ liệu Firestore
gcloud firestore databases create --location=$REGION

Kết quả ví dụ

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

9. Tích hợp Firestore vào ứng dụng của bạn

Trong phần này, bạn sẽ cập nhật tài khoản dịch vụ, thêm tài khoản dịch vụ truy cập vào Firestore, xem xét và triển khai các quy tắc bảo mật của Firestore, đồng thời xem xét cách dữ liệu được sửa đổi trong Firestore.

Thiết lập tính năng xác thực

  1. Cấp vai trò của người dùng Datastore cho tài khoản dịch vụ
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/datastore.user"

Kết quả ví dụ

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

Quy tắc bảo mật của Firestore

Quy tắc bảo mật cung cấp chức năng kiểm soát quyền truy cập và xác thực dữ liệu theo định dạng biểu cảm nhưng đơn giản.

  1. Chuyển đến thư mục order-service/starter-code (mã khởi động)
cd ~/cymbal-eats/order-service
  1. Mở tệp firestore.rules trong trình chỉnh sửa trên đám mây
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
    }
  }
}

Cảnh báo: Tốt nhất là bạn nên giới hạn quyền truy cập vào bộ nhớ Firestore. Theo mục đích của phòng thí nghiệm này, tất cả các lần đọc đều được phép. Đây không phải là cấu hình sản xuất được khuyên dùng.

Bật các dịch vụ do Firestore quản lý

  1. Nhấp vào Open Terminal (Mở cửa sổ dòng lệnh)
  2. Tạo tệp .firebaserc bằng Mã dự án hiện tại. Chế độ cài đặt cho các mục tiêu triển khai được lưu trữ trong tệp .firebaserc trong thư mục dự án của bạn.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Tải tệp nhị phân Firebase xuống
curl -sL https://firebase.tools | upgrade=true bash

Kết quả ví dụ

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  1. Triển khai các quy tắc của Firestore.
firebase deploy 

Kết quả ví dụ

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

Sửa đổi dữ liệu

Các bộ sưu tập và tài liệu được tạo hoàn toàn trong Firestore. Chỉ cần gán dữ liệu cho tài liệu trong một bộ sưu tập. Nếu bộ sưu tập hoặc tài liệu không tồn tại, Firestore sẽ tạo bộ sưu tập hoặc tài liệu đó.

Thêm dữ liệu vào firestore

Có một số cách để ghi dữ liệu vào Cloud Firestore:

  • Thiết lập dữ liệu của một tài liệu trong một bộ sưu tập, chỉ định rõ giá trị nhận dạng tài liệu.
  • Thêm tài liệu mới vào một bộ sưu tập. Trong trường hợp này, Cloud Firestore sẽ tự động tạo giá trị nhận dạng tài liệu.
  • Tạo một tài liệu trống với một giá trị nhận dạng được tạo tự động và gán dữ liệu cho tài liệu đó vào lúc khác.

Phần tiếp theo sẽ hướng dẫn bạn tạo tài liệu bằng phương thức tập hợp.

Thiết lập tài liệu

Sử dụng phương thức set() để tạo tài liệu. Với phương thức set(), bạn phải chỉ định mã nhận dạng cho tài liệu cần tạo.

Hãy xem đoạn mã dưới đây.

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

Mã này sẽ tạo một tài liệu chỉ định mã tài liệu do người dùng tạo là 123. Để yêu cầu Firestore tạo mã nhận dạng thay cho bạn, hãy sử dụng phương thức add() hoặc create().

Cập nhật tài liệu

Phương thức cập nhật update() cho phép bạn cập nhật một số trường trong tài liệu mà không cần ghi đè toàn bộ tài liệu.

Trong đoạn mã dưới đây, mã cập nhật thứ tự 123

index.js

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

Xoá tài liệu

Trong Firestore, bạn có thể xoá bộ sưu tập, tài liệu hoặc các trường cụ thể khỏi tài liệu. Để xoá một tài liệu, hãy dùng phương thức delete().

Đoạn mã dưới đây sẽ xoá đơn đặt hàng 123.

index.js

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

10. Triển khai và thử nghiệm

Trong phần này, bạn sẽ triển khai ứng dụng lên Cloud Run và kiểm thử các phương thức tạo, cập nhật và xoá.

Triển khai ứng dụng trên Cloud Run

  1. Lưu trữ URL trong biến INVENTORY_SERVICE_URL để tích hợp với Dịch vụ kho hàng
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")
  1. Triển khai dịch vụ đặt hàng
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

Kết quả ví dụ

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

Kiểm thử ứng dụng Cloud Run

Tạo một tài liệu

  1. Lưu trữ URL của ứng dụng dịch vụ đặt hàng vào một biến để kiểm tra
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")
  1. Tạo yêu cầu đặt hàng và đăng đơn đặt hàng mới lên cơ sở dữ liệu 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
        }
    ]
}'

Kết quả ví dụ

{"orderNumber":46429}

Lưu số đơn đặt hàng để sử dụng sau này

export ORDER_NUMBER=<value_from_output>

Xem kết quả

Xem kết quả trong Firestore

  1. Chuyển đến Bảng điều khiểnFirestore
  2. Nhấp vào Dữ liệu

465ceca6198b2b88.pngS

Cập nhật tài liệu

Đơn đặt hàng bạn gửi không có số lượng.

  1. Cập nhật bản ghi và thêm cặp khoá-giá trị số lượng
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
        {   
            "id": 1,
            "quantity": 1   
        }
    ]
}'

Kết quả ví dụ

{"status":"success"}

Xem kết quả

Xem kết quả trong Firestore

  1. Chuyển đến Bảng điều khiểnFirestore
  2. Nhấp vào Dữ liệu

cfcf78d200e15b84.png

Xoá tài liệu

  1. Xoá mặt hàng 46429 khỏi tập hợp đơn đặt hàng trên Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

Xem kết quả

  1. Chuyển đến Bảng điều khiểnFirestore
  2. Nhấp vào Dữ liệu

73e14d69211d1539.pngS

11. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành phòng thí nghiệm!

Bước tiếp theo:

Khám phá các lớp học lập trình khác về Cymbal Eats:

Dọn dẹp

Để tránh làm phát sinh chi phí cho các tài nguyên được sử dụng trong hướng dẫn này trong tài khoản Google Cloud của bạn, hãy xoá dự án chứa các tài nguyên đó, hoặc giữ lại dự án và xoá từng tài nguyên riêng lẻ.

Xoá dự án

Cách dễ nhất để loại bỏ việc thanh toán là xoá dự án bạn đã tạo cho phần hướng dẫn.