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 cần 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 có 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 tầng dữ liệu và thời gian chạy ứng dụng cho phé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í phát sinh.

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ụ được quản lý của Spanner
  • 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 Dịch vụ được quản lý của Firestore
  • 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 tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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ự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 300 USD.

Thiết lập môi trường

  1. Tạo một 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 API Spanner, Cloud Run, Cloud Build và Artifact Registry
gcloud services enable \
     compute.googleapis.com \
     spanner.googleapis.com \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     artifactregistry.googleapis.com \
     firestore.googleapis.com \
     appengine.googleapis.com \
     artifactregistry.googleapis.com
  1. 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 một phiên bản Spanner

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

Tạo một phiên bản

  1. Tạo một phiên bản Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

Ví dụ về kết quả đầu ra

Creating instance...done.   
  1. Xác minh xem phiên bản 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 một cơ sở dữ liệu mới và sử dụng ngôn ngữ định nghĩa dữ liệu (DDL) SQL 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ơ 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 của mình. Ngoài ra, SQL Spanner còn 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ẽ 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 dễ dàng tích hợp 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 tài khoản dịch vụ của bạn

Thiết lập chế độ xác thực

Google Cloud CLI và các thư viện ứng dụng Google Cloud sẽ tự động phát hiện thời điểm chúng đang 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 chuyên biệt bằng cách chỉ định cho danh tính đó 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 giúp đơn giản hoá những điểm phức tạp khi 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 một ứng dụng Spanner

Ứng dụng Spanner là một ứng dụng để đọc và ghi dữ liệu vào cơ sở dữ liệu Cloud Spanner. Bạn có thể sử dụng đồng thời một ứng dụng khách, ngoại trừ phương thức Đó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ể coi Client là một kết nối cơ sở dữ liệu: mọi hoạt động tương tác của bạn với Cloud Spanner đều phải thông qua Client. Thông thường, bạn sẽ tạo một Client khi ứng dụng khởi động, sau đó bạn sẽ dùng lại Client đó để đọc, ghi và thực thi các giao dịch. Mỗi ứng dụng sẽ sử dụng các 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 khỏi cơ sở dữ liệu Spanner. Dưới đây là danh sách các phương thức có sẵn.

Trong lớp học này, bạn sẽ sử dụng các thao tác sửa đổi để thay đổi dữ liệu trong Spanner.

Các đột biến trong Spanner

Mutation là một vùng chứa cho các thao tác đột biến. Mutation (Thao tác sửa đổi) biểu thị một chuỗi các thao tác chèn, cập nhật và xoá mà Cloud Spanner áp dụng một cách nguyên tử 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ã này sẽ chèn một hàng mới vào bảng nhật ký kho hàng.

Triển khai và kiểm thử

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

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

Cloud Run có thể tự động tạo, đẩy và triển khai mã của bạn chỉ bằng một lệnh. Trong lệnh sau, bạn sẽ gọi lệnh deploy trên dịch vụ run, truyền vào 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 hàng 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 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. Các khái niệm về Spanner

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

  1. Trong thiết bị đầu cuối, hãy nhập lệnh này để truy vấn bảng cho 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 chuỗi các bước mà Spanner sử dụng để nhận kết quả. Có thể có nhiều cách để thu thập kết quả của một câu lệnh SQL cụ thể. Bạn có thể truy cập vào kế hoạch thực thi truy vấn trong bảng điều khiển và các thư viện ứng dụng. Cách Spanner xử lý các truy vấn SQL:

  1. Trong bảng điều khiển, hãy mở trang phiên bản Cloud Spanner.
  2. Chuyển đến các phiên bản Cloud Spanner
  3. Nhấp vào tên của phiên bản Cloud Spanner. Trong phần 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 GIẢI THÍCH

Cloud Console hiển thị một 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 kế hoạch thực thi thay thế và chọn kế hoạch 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 thông tin ước tính cho những lựa chọn đó, dẫn đến 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 các 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 sẽ 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 thực hiện lớp học 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 phiên bản cơ sở dữ liệu của mình. Bạn có thể xem phiên bản trình tối ưu hoá đang được dùng trong mỗi cơ sở dữ liệu.

  1. Chuyển đến phần Giám sát trong Bảng điều khiển Google Cloud 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 Cloud Spanner Instance (Phiên bản Cloud Spanner).
  3. Trong trường Chỉ số, hãy chọn Số lượng truy vấn rồi nhấp vào Áp dụng.
  4. Trong trường Group By (Nhóm theo), hãy chọn database (cơ sở dữ liệu), optimizer_version (phiên bản trình tối ưu hoá) và status (trạng thái).

581b859c25790b21.png

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

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

Tác vụ sau đây sẽ hướng dẫn bạn tạo một ứng dụng Cloud Run dịch vụ đặt hàng được hỗ trợ bởi Firestore. Dịch vụ đặt hàng sẽ gọi dịch vụ kho hàng được tạo trong 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ó đủ hàng tồn kho và đơn đặt hàng có thể được thực hiện.

6843abaf4263e112.png

8. Các khái niệm 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ữ các bộ sưu tập lớn gồm các tài liệu nhỏ.

5571cb2f261d2dbe.png

Bộ sưu tập

Bạn phải lưu trữ tất cả tài liệu trong các 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 trường nguyên thuỷ như chuỗi hoặc cá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 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 chế độ xác thực

  1. Cấp vai trò 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

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

  1. Chuyển đến thư mục order-service/starter-code
cd ~/cymbal-eats/order-service
  1. Mở tệp firestore.rules trong trình chỉnh sửa đá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: Bạn nên hạn chế quyền truy cập vào bộ nhớ Firestore. Để phục vụ mục đích của lớp học này, tất cả các lần đọc đều được cho phép. Đây không phải là cấu hình sản xuất được khuyến nghị.

Bật Dịch vụ được quản lý của Firestore

  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. Các chế độ cài đặt cho 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 

Ví dụ về kết quả đầu ra

=== 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 một cách gián tiếp trong Firestore. Chỉ cần chỉ định dữ liệu cho một 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:

  • Đặt dữ liệu của một tài liệu trong một bộ sưu tập, chỉ định rõ ràng một 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 có mã nhận dạng được tạo tự động và chỉ định dữ liệu cho tài liệu đó sau.

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

Đặt 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ột mã nhận dạng cho tài liệu cần tạo.

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

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ã nhận dạng tài liệu do người dùng tạo là 123. Để Firestore thay bạn tạo mã nhận dạng, 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 tài liệu mà không ghi đè toàn bộ tài liệu.

Trong đoạn mã bên dưới, mã này sẽ cập nhật đơn đặt hàng 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á các bộ sưu tập, tài liệu hoặc trường cụ thể khỏi một tài liệu. Để xoá một tài liệu, hãy sử 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à kiểm thử

Trong phần này, bạn sẽ triển khai ứng dụng vào 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 lên Cloud Run

  1. Lưu trữ URL trong biến INVENTORY_SERVICE_URL để tích hợp với Inventory Service
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 thử
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 vào 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ển Firestore
  2. Nhấp vào Dữ liệu

465ceca6198b2b88.png

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ển Firestore
  2. Nhấp vào Dữ liệu

cfcf78d200e15b84.png

Xoá tài liệu

  1. Xoá mục 46429 khỏi bộ sưu tậ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ển Firestore
  2. Nhấp vào Dữ liệu

73e14d69211d1539.png

11. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành bài thực hành!

Bước tiếp theo:

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

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.

Xoá dự án

Cách dễ nhất để không bị tính phí là xoá dự án mà bạn đã tạo cho hướng dẫn này.