اتصال به پایگاه های داده کاملاً مدیریت شده از Cloud Run

۱. مرور کلی

در این آزمایش، شما پایگاه‌های داده بدون سرور (Spanner و Firestore) را با برنامه‌هایی (Go و Node.js) که در Cloud Run اجرا می‌شوند، ادغام خواهید کرد. برنامه Cymbal Eats شامل چندین سرویس است که روی Cloud Run اجرا می‌شوند. در مراحل بعدی، سرویس‌ها را برای استفاده از پایگاه داده رابطه‌ای Cloud Spanner و Cloud Firestore ، یک پایگاه داده سند NoSQL، پیکربندی خواهید کرد. استفاده از محصولات بدون سرور برای لایه داده و زمان اجرای برنامه به شما این امکان را می‌دهد که تمام مدیریت زیرساخت را انتزاعی کنید و به جای نگرانی در مورد سربار، بر ساخت برنامه خود تمرکز کنید.

۲. آنچه یاد خواهید گرفت

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه موارد زیر را انجام دهید:

  • آچار یکپارچه
  • فعال کردن سرویس‌های مدیریت‌شده‌ی Spanner
  • ادغام در کد
  • کدی را که به Spanner متصل می‌شود، مستقر کنید
  • ادغام فایراستور
  • فعال کردن سرویس‌های مدیریت‌شده‌ی فایراستور
  • ادغام در کد
  • کدی را که به Firestore متصل می‌شود، مستقر کنید

۳. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

محیط راه‌اندازی

  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. فعال کردن APIهای Spanner، Cloud Run، Cloud Build و 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. مخزن را کلون کنید
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. به دایرکتوری بروید
cd cymbal-eats/inventory-service/spanner

۴. ایجاد و پیکربندی یک نمونه Spanner

Spanner پایگاه داده رابطه‌ای backend خدمات موجودی کالا است. شما در مراحل زیر یک نمونه، پایگاه داده و طرحواره 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

ایجاد پایگاه داده و طرحواره

یک پایگاه داده جدید ایجاد کنید و از زبان تعریف داده (DDL) استاندارد SQL گوگل برای ایجاد طرحواره پایگاه داده استفاده کنید.

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

۵. آچار یکپارچه‌سازی

در این بخش، نحوه ادغام Spanner در برنامه خود را خواهید آموخت. علاوه بر این، SQL Spanner کتابخانه‌های کلاینت ، درایورهای JDBC ، درایورهای R2DBC ، APIهای REST و APIهای RPC را ارائه می‌دهد که به شما امکان می‌دهد Spanner را در هر برنامه‌ای ادغام کنید.

در بخش بعدی، از کتابخانه کلاینت Go برای نصب، احراز هویت و تغییر داده‌ها در Spanner استفاده خواهید کرد.

نصب کتابخانه کلاینت

کتابخانه کلاینت Cloud Spanner با استفاده خودکار از Application Default Credentials (ADC) برای یافتن اعتبارنامه‌های حساب سرویس شما، ادغام با Cloud Spanner را آسان‌تر می‌کند.

تنظیم احراز هویت

رابط خط فرمان گوگل کلود (Google Cloud CLI) و کتابخانه‌های کلاینت گوگل کلود به طور خودکار تشخیص می‌دهند که چه زمانی روی گوگل کلود اجرا می‌شوند و از حساب سرویس زمان اجرا (runtime service account) نسخه فعلی Cloud Run استفاده می‌کنند. این استراتژی Application Default Credentials نام دارد و قابلیت حمل کد را در محیط‌های مختلف فراهم می‌کند.

با این حال، بهتر است با اختصاص یک حساب سرویس مدیریت‌شده توسط کاربر به جای حساب سرویس پیش‌فرض، یک هویت اختصاصی ایجاد کنید.

  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 است. استفاده همزمان از یک کلاینت، به جز متد Close آن، ایمن است.

قطعه کد زیر یک کلاینت spanner ایجاد می‌کند.

اصلی.برو

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

می‌توانید یک کلاینت را به عنوان یک اتصال پایگاه داده در نظر بگیرید: تمام تعاملات شما با Cloud Spanner باید از طریق یک کلاینت انجام شود. معمولاً هنگام شروع برنامه، یک کلاینت ایجاد می‌کنید و سپس از آن کلاینت برای خواندن، نوشتن و اجرای تراکنش‌ها استفاده مجدد می‌کنید. هر کلاینت از منابع موجود در Cloud Spanner استفاده می‌کند.

تغییر داده‌ها

روش‌های مختلفی برای درج، به‌روزرسانی و حذف داده‌ها از پایگاه داده Spanner وجود دارد. در زیر روش‌های موجود فهرست شده‌اند.

در این آزمایش، شما از جهش‌ها برای تغییر داده‌ها در Spanner استفاده خواهید کرد.

جهش در اسپنر

جهش (Mutation) ظرفی برای عملیات جهش است. جهش نشان دهنده توالی درج‌ها، به‌روزرسانی‌ها و حذف‌هایی است که Cloud Spanner به صورت خودکار روی سطرها و جداول مختلف در پایگاه داده Cloud Spanner اعمال می‌کند.

اصلی.برو

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. آدرس اینترنتی سرویس را ذخیره کنید
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. مفاهیم آچار

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 خاص وجود داشته باشد. طرح‌های اجرای پرس‌وجو در کنسول و کتابخانه‌های کلاینت قابل دسترسی هستند. برای مشاهده نحوه مدیریت پرس‌وجوهای SQL توسط Spanner:

  1. در کنسول، صفحه نمونه‌های Cloud Spanner را باز کنید.
  2. به نمونه‌های Cloud Spanner بروید
  3. روی نام نمونه Cloud Spanner کلیک کنید. از بخش پایگاه‌های داده، پایگاه داده‌ای را که می‌خواهید پرس‌وجو کنید، انتخاب کنید.
  4. روی پرس‌وجو کلیک کنید.
  5. عبارت زیر را در ویرایشگر عبارت وارد کنید
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. روی اجرا کلیک کنید
  2. توضیح کلیک کنید

کنسول ابری یک طرح اجرایی بصری برای کوئری شما نمایش می‌دهد.

۱۴۹f۸bae۴۶۸f۸b۳۴.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:

نسخه بهینه‌ساز را به‌روزرسانی کنید

جدیدترین نسخه در زمان انجام این آزمایش، نسخه ۴ است. در مرحله بعد، جدول Spanner را به‌روزرسانی خواهید کرد تا از نسخه ۴ برای بهینه‌ساز پرس‌وجو استفاده کند.

  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. به بخش نظارت در کنسول ابری بروید و در منوی سمت چپ، گزینه‌ی «Metrics Explorer» را انتخاب کنید.
  2. در فیلد نوع منبع ، نمونه Cloud Spanner را انتخاب کنید.
  3. در فیلد Metric ، تعداد پرس‌وجوها را انتخاب کرده و Apply کنید.
  4. در فیلد Group By ، گزینه database، optimizer_version و status را انتخاب کنید.

581b859c25790b21.png

۷. ایجاد و پیکربندی یک پایگاه داده Firestore

فایراستور یک پایگاه داده سند NoSQL است که برای مقیاس‌پذیری خودکار، عملکرد بالا و سهولت توسعه برنامه ساخته شده است. در حالی که رابط کاربری فایراستور بسیاری از ویژگی‌های مشابه پایگاه‌های داده سنتی را دارد، یک پایگاه داده NoSQL در توصیف روابط بین اشیاء داده با آنها متفاوت است.

وظیفه زیر شما را در ایجاد یک برنامه سرویس سفارش Cloud Run با پشتیبانی Firestore راهنمایی می‌کند. سرویس سفارش، سرویس موجودی ایجاد شده در بخش قبلی را برای پرس و جو از پایگاه داده Spanner قبل از شروع سفارش فراخوانی می‌کند. این سرویس اطمینان حاصل می‌کند که موجودی کافی وجود دارد و سفارش می‌تواند تکمیل شود.

6843abaf4263e112.png

۸. مفاهیم فایراستور

مدل داده

یک پایگاه داده Firestore از مجموعه‌ها و اسناد تشکیل شده است.

b60acd63d4793a6c.png

اسناد

هر سند شامل مجموعه‌ای از جفت‌های کلید-مقدار است. فایراستور برای ذخیره مجموعه‌های بزرگی از اسناد کوچک بهینه شده است.

5571cb2f261d2dbe.png

مجموعه‌ها

شما باید تمام اسناد را در مجموعه‌ها ذخیره کنید. اسناد می‌توانند شامل زیرمجموعه‌ها و اشیاء تو در تو، از جمله فیلدهای اولیه مانند رشته‌ها یا اشیاء پیچیده مانند لیست‌ها باشند.

5811378cb721e5ec.png

ایجاد پایگاه داده فایراستور

  1. ایجاد پایگاه داده Firestore
gcloud firestore databases create --location=$REGION

خروجی مثال

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

۹. ادغام 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].

قوانین امنیتی فایراستور

قوانین امنیتی، کنترل دسترسی و اعتبارسنجی داده‌ها را به شکلی رسا و در عین حال ساده ارائه می‌دهند.

  1. به دایرکتوری order-service/starter-code بروید
cd ~/cymbal-eats/order-service
  1. فایل firestore.rules را در ویرایشگر ابری باز کنید
cat 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 است. برای اهداف این آزمایش، همه خواندن‌ها مجاز هستند. این پیکربندی برای محیط عملیاتی توصیه نمی‌شود.

فعال کردن سرویس‌های مدیریت‌شده‌ی فایراستور

  1. روی باز کردن ترمینال کلیک کنید
  2. فایل .firebaserc را با شناسه پروژه فعلی ایجاد کنید. تنظیمات مربوط به اهداف استقرار در فایل .firebaserc در دایرکتوری پروژه شما ذخیره می‌شوند.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. دانلود فایل باینری فایربیس
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 آن را ایجاد می‌کند.

اضافه کردن داده به فایراستور

چندین روش برای نوشتن داده‌ها در Cloud Firestore وجود دارد:

  • داده‌های یک سند را در یک مجموعه تنظیم می‌کند، و به صراحت یک شناسه سند را مشخص می‌کند.
  • یک سند جدید به یک مجموعه اضافه کنید. در این حالت، Cloud Firestore به طور خودکار شناسه سند را تولید می‌کند.
  • یک سند خالی با شناسه‌ای که به صورت خودکار ایجاد می‌شود ایجاد کنید و بعداً داده‌ها را به آن اختصاص دهید.

بخش بعدی شما را در ایجاد یک سند با استفاده از متد set راهنمایی خواهد کرد.

تنظیم یک سند

برای ایجاد یک سند از متد set() استفاده کنید. با استفاده از متد set() ، باید یک شناسه (ID) برای سندی که قرار است ایجاد شود، مشخص کنید.

به قطعه کد زیر نگاهی بیندازید.

ایندکس.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() به شما امکان می‌دهد برخی از فیلدهای سند را بدون بازنویسی کل سند، به‌روزرسانی کنید.

در قطعه کد زیر، کد شماره ۱۲۳ به‌روزرسانی می‌شود.

ایندکس.js

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

حذف یک سند

در Firestore، می‌توانید مجموعه‌ها، اسناد یا فیلدهای خاصی را از یک سند حذف کنید. برای حذف یک سند، از متد delete() استفاده کنید.

قطعه کد زیر دستور ۱۲۳ را حذف می‌کند.

ایندکس.js

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

۱۰. استقرار و آزمایش

در این بخش، برنامه را روی Cloud Run مستقر کرده و متدهای ایجاد، به‌روزرسانی و حذف را آزمایش خواهید کرد.

برنامه را روی Cloud Run مستقر کنید

  1. URL را در متغیر INVENTORY_SERVICE_URL ذخیره کنید تا با سرویس موجودی ادغام شود.
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. مورد ۴۶۴۲۹ را از مجموعه سفارشات Firestore حذف کنید
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

مشاهده نتایج

  1. به کنسول Firestore بروید
  2. روی داده کلیک کنید

73e14d69211d1539.png

۱۱. تبریک می‌گویم!

تبریک می‌گویم، آزمایشگاه را تمام کردید!

قدم بعدی چیست؟

سایر آزمایشگاه‌های کد Cymbal Eats را کاوش کنید:

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب گوگل کلود خود برای منابع استفاده شده در این آموزش، یا پروژه‌ای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید.

حذف پروژه

ساده‌ترین راه برای حذف هزینه‌ها، حذف پروژه‌ای است که برای آموزش ایجاد کرده‌اید.