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



- نام پروژه، نام نمایشی برای شرکتکنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمیشود. شما همیشه میتوانید آن را بهروزرسانی کنید.
- شناسه پروژه در تمام پروژههای گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید میکند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاههای کد، باید شناسه پروژه خود را (که معمولاً با عنوان
PROJECT_IDشناخته میشود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، میتوانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، میتوانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی میماند. - برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده میکنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
- در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینهای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، میتوانید منابعی را که ایجاد کردهاید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
محیط راهاندازی
- ایجاد متغیر شناسه پروژه
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
- فعال کردن 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
- مخزن را کلون کنید
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
- به دایرکتوری بروید
cd cymbal-eats/inventory-service/spanner
۴. ایجاد و پیکربندی یک نمونه Spanner
Spanner پایگاه داده رابطهای backend خدمات موجودی کالا است. شما در مراحل زیر یک نمونه، پایگاه داده و طرحواره 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 گوگل برای ایجاد طرحواره پایگاه داده استفاده کنید.
- ایجاد یک فایل 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);
۵. آچار یکپارچهسازی
در این بخش، نحوه ادغام 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 نام دارد و قابلیت حمل کد را در محیطهای مختلف فراهم میکند.
با این حال، بهتر است با اختصاص یک حساب سرویس مدیریتشده توسط کاربر به جای حساب سرویس پیشفرض، یک هویت اختصاصی ایجاد کنید.
- نقش مدیر پایگاه داده 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 که قبلاً ایجاد کردهاید، به آن ارسال میکنید.
- روی باز کردن ترمینال کلیک کنید
- سرویس موجودی را در 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
- آدرس اینترنتی سرویس را ذخیره کنید
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
اپلیکیشن Cloud Run را تست کنید
یک مورد وارد کنید
- در 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
پرس و جو برای یک آیتم
- استعلام موجودی کالا
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 بدون توصیف نحوه دستیابی به نتایج، آنچه کاربر میخواهد را نشان میدهند.
- در ترمینال، این دستور را وارد کنید تا جدول مربوط به رکوردی که قبلاً ایجاد شده است را جستجو کنید.
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:
- در کنسول، صفحه نمونههای Cloud Spanner را باز کنید.
- به نمونههای Cloud Spanner بروید
- روی نام نمونه Cloud Spanner کلیک کنید. از بخش پایگاههای داده، پایگاه دادهای را که میخواهید پرسوجو کنید، انتخاب کنید.
- روی پرسوجو کلیک کنید.
- عبارت زیر را در ویرایشگر عبارت وارد کنید
SELECT * FROM InventoryHistory WHERE ItemID=1
- روی اجرا کلیک کنید
- توضیح کلیک کنید
کنسول ابری یک طرح اجرایی بصری برای کوئری شما نمایش میدهد.

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

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

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

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

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

ایجاد پایگاه داده فایراستور
- ایجاد پایگاه داده Firestore
gcloud firestore databases create --location=$REGION
خروجی مثال
Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462
۹. ادغام 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].
قوانین امنیتی فایراستور
قوانین امنیتی، کنترل دسترسی و اعتبارسنجی دادهها را به شکلی رسا و در عین حال ساده ارائه میدهند.
- به دایرکتوری order-service/starter-code بروید
cd ~/cymbal-eats/order-service
- فایل 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 است. برای اهداف این آزمایش، همه خواندنها مجاز هستند. این پیکربندی برای محیط عملیاتی توصیه نمیشود.
فعال کردن سرویسهای مدیریتشدهی فایراستور
- روی باز کردن ترمینال کلیک کنید
- فایل .firebaserc را با شناسه پروژه فعلی ایجاد کنید. تنظیمات مربوط به اهداف استقرار در فایل .firebaserc در دایرکتوری پروژه شما ذخیره میشوند.
firebaserc.tmpl
sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
- دانلود فایل باینری فایربیس
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 آن را ایجاد میکند.
اضافه کردن داده به فایراستور
چندین روش برای نوشتن دادهها در 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 مستقر کنید
- URL را در متغیر INVENTORY_SERVICE_URL ذخیره کنید تا با سرویس موجودی ادغام شود.
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 بروید
- روی داده کلیک کنید

حذف یک سند
- مورد ۴۶۴۲۹ را از مجموعه سفارشات Firestore حذف کنید
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}
مشاهده نتایج
- به کنسول Firestore بروید
- روی داده کلیک کنید

۱۱. تبریک میگویم!
تبریک میگویم، آزمایشگاه را تمام کردید!
قدم بعدی چیست؟
سایر آزمایشگاههای کد Cymbal Eats را کاوش کنید:
- راهاندازی گردشهای کاری ابری با Eventarc
- راهاندازی پردازش رویداد از فضای ذخیرهسازی ابری
- اتصال به CloudSQL خصوصی از Cloud Run
- برنامه بدون سرور امن با پروکسی آگاه از هویت (IAP)
- راهاندازی کارهای ابری با استفاده از زمانبند ابری
- استقرار ایمن در Cloud Run
- ایمنسازی ترافیک ورودی Cloud Run
- اتصال به AlloyDB خصوصی از GKE Autopilot
تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب گوگل کلود خود برای منابع استفاده شده در این آموزش، یا پروژهای که شامل منابع است را حذف کنید، یا پروژه را نگه دارید و منابع تکی را حذف کنید.
حذف پروژه
سادهترین راه برای حذف هزینهها، حذف پروژهای است که برای آموزش ایجاد کردهاید.