Cloud Run से पूरी तरह से मैनेज किए जा रहे डेटाबेस से कनेक्ट करना

1. खास जानकारी

इस लैब में, आपको Cloud Run में चल रहे ऐप्लिकेशन(Go और Node.js) के साथ बिना सर्वर वाले डेटाबेस(Spanner और Firestore) को इंटिग्रेट करना होगा. Cymbal Eats ऐप्लिकेशन में कई सेवाएं शामिल हैं, जो Cloud Run पर चलती हैं. यहां दिए गए चरणों में, Cloud Spanner रिलेशनल डेटाबेस और NoSQL दस्तावेज़ डेटाबेस Cloud Firestore का इस्तेमाल करने के लिए, सेवाओं को कॉन्फ़िगर किया जाएगा. डेटा टियर और ऐप्लिकेशन रनटाइम के लिए सर्वरलेस प्रॉडक्ट का इस्तेमाल करने से, आपको इंफ़्रास्ट्रक्चर मैनेजमेंट से जुड़ी सभी समस्याओं से छुटकारा मिल जाता है. इससे, आपको ओवरहेड की चिंता किए बिना, ऐप्लिकेशन बनाने पर ध्यान देने का मौका मिलता है.

2. आपको क्या सीखने को मिलेगा

इस लैब में, आपको ये काम करने का तरीका बताया जाएगा:

  • Spanner को इंटिग्रेट करना
  • Spanner Managed Services को चालू करना
  • कोड में इंटिग्रेट करना
  • Spanner से कनेक्ट करने वाला कोड डिप्लॉय करना
  • Firestore को इंटिग्रेट करना
  • Firestore की मैनेज की गई सेवाओं को चालू करना
  • कोड में इंटिग्रेट करना
  • Firestore से कनेक्ट करने वाला कोड डिप्लॉय करना

3. सेटअप और ज़रूरी शर्तें

अपनी स्पीड से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी Google Cloud प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इससे कोई फ़र्क़ नहीं पड़ता कि यह क्या है. ज़्यादातर कोडलैब में, आपको अपने प्रोजेक्ट आईडी (आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है) का रेफ़रंस देना होगा. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास अपना नाम आज़माने का विकल्प भी है. इससे आपको पता चलेगा कि वह नाम उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट की अवधि तक बना रहता है.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जिसे प्रोजेक्ट नंबर कहते हैं. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, आपको Cloud Console में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलता है.

एनवायरमेंट सेटअप करना

  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. Spanner, Cloud Run, Cloud Build, और Artifact Registry API चालू करें
gcloud services enable \
     compute.googleapis.com \
     spanner.googleapis.com \
     run.googleapis.com \
     cloudbuild.googleapis.com \
     artifactregistry.googleapis.com \
     firestore.googleapis.com \
     appengine.googleapis.com \
     artifactregistry.googleapis.com
  1. रिपॉज़िटरी को क्लोन करना
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. डायरेक्ट्री में नेविगेट करना
cd cymbal-eats/inventory-service/spanner

4. Spanner इंस्टेंस बनाना और उसे कॉन्फ़िगर करना

Spanner, इन्वेंट्री सेवाओं का बैकएंड रिलेशनल डेटाबेस है. यहां दिए गए चरणों में, आपको 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

डेटाबेस और स्कीमा बनाना

एक नया डेटाबेस बनाएं और डेटाबेस स्कीमा बनाने के लिए, Google के स्टैंडर्ड एसक्यूएल की डेटा डेफ़िनिशन लैंग्वेज (डीडीएल) का इस्तेमाल करें.

  1. डेटा परिभाषा भाषा (डीडीएल) फ़ाइल बनाना
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);

5. Spanner को इंटिग्रेट करना

इस सेक्शन में, अपने ऐप्लिकेशन में Spanner को इंटिग्रेट करने का तरीका बताया गया है. इसके अलावा, SQL Spanner क्लाइंट लाइब्रेरी, JDBC ड्राइवर, R2DBC ड्राइवर, REST API, और RPC API उपलब्ध कराता है. इनकी मदद से, Spanner को किसी भी ऐप्लिकेशन में इंटिग्रेट किया जा सकता है.

अगले सेक्शन में, Spanner में डेटा इंस्टॉल करने, पुष्टि करने, और उसमें बदलाव करने के लिए, Go क्लाइंट लाइब्रेरी का इस्तेमाल किया जाएगा.

क्लाइंट लाइब्रेरी इंस्टॉल करना

Cloud Spanner क्लाइंट लाइब्रेरी, Cloud Spanner के साथ इंटिग्रेट करना आसान बनाती है. ऐसा इसलिए, क्योंकि यह आपके सेवा खाते के क्रेडेंशियल ढूंढने के लिए, ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल (एडीसी) का अपने-आप इस्तेमाल करती है

पुष्टि करने की सुविधा सेट अप करना

Google Cloud CLI और Google Cloud क्लाइंट लाइब्रेरी, Google Cloud पर चलने के दौरान अपने-आप इसका पता लगा लेती हैं. साथ ही, Cloud Run के मौजूदा वर्शन के रनटाइम सेवा खाते का इस्तेमाल करती हैं. इस रणनीति को ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल कहा जाता है. इससे कोड को कई एनवायरमेंट में पोर्ट किया जा सकता है.

हालांकि, डिफ़ॉल्ट सेवा खाते के बजाय, उपयोगकर्ता के मैनेज किए गए सेवा खाते को असाइन करके एक खास पहचान बनाना सबसे अच्छा होता है.

  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 तरीके का इस्तेमाल एक साथ नहीं किया जा सकता.

नीचे दिया गया स्निपेट, स्पैनर क्लाइंट बनाता है

main.go

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

क्लाइंट को डेटाबेस कनेक्शन के तौर पर देखा जा सकता है: Cloud Spanner के साथ आपके सभी इंटरैक्शन, क्लाइंट के ज़रिए होने चाहिए. आम तौर पर, ऐप्लिकेशन शुरू होने पर क्लाइंट बनाया जाता है. इसके बाद, लेन-देन को पढ़ने, लिखने, और लागू करने के लिए, उस क्लाइंट का फिर से इस्तेमाल किया जाता है. हर क्लाइंट, Cloud Spanner में मौजूद संसाधनों का इस्तेमाल करता है.

डेटा में बदलाव करना

Spanner डेटाबेस में डेटा डालने, अपडेट करने, और मिटाने के कई तरीके हैं. यहां उपलब्ध तरीके दिए गए हैं.

इस लैब में, Spanner में डेटा को बदलने के लिए म्यूटेशन का इस्तेमाल किया जाएगा.

Spanner में म्यूटेशन

म्यूटेशन, म्यूटेशन ऑपरेशन के लिए एक कंटेनर होता है. म्यूटेशन, इंसर्ट, अपडेट, और मिटाने की एक ऐसी प्रोसेस होती है जिसे Cloud Spanner, Cloud Spanner डेटाबेस की अलग-अलग लाइनों और टेबल पर एक साथ लागू करता है.

main.go

m := []*spanner.Mutation{}

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

कोड का यह स्निपेट, इन्वेंट्री के इतिहास की टेबल में एक नई लाइन जोड़ता है.

लागू करना और जांच करना

Spanner को कॉन्फ़िगर करने और मुख्य कोड एलिमेंट की समीक्षा करने के बाद, ऐप्लिकेशन को Cloud Run पर डिप्लॉय करें.

ऐप्लिकेशन को Cloud Run पर डिप्लॉय करना

Cloud Run, एक ही निर्देश से आपके कोड को अपने-आप बना सकता है, पुश कर सकता है, और डिप्लॉय कर सकता है. नीचे दिए गए निर्देश में, run सेवा पर deploy निर्देश को कॉल किया जाएगा. साथ ही, 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. Cloud Shell में, यह कमांड डालें.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
    {
        "itemID": 1,
        "inventoryChange": 5
    }
]'

आउटपुट का उदाहरण

HTTP/2 200
access-control-allow-origin: *
content-type: application/json
x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1
date: Fri, 22 Apr 2022 21:41:38 GMT
server: Google Frontend
content-length: 2

OK

किसी आइटम के बारे में क्वेरी करना

  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. Spanner के कॉन्सेप्ट

Cloud Spanner, डिक्लेरेटिव एसक्यूएल स्टेटमेंट का इस्तेमाल करके अपने डेटाबेस को क्वेरी करता है. 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, नतीजे पाने के लिए करता है. किसी एसक्यूएल स्टेटमेंट के नतीजे पाने के कई तरीके हो सकते हैं. क्वेरी एक्ज़ीक्यूशन प्लान, कंसोल और क्लाइंट लाइब्रेरी में ऐक्सेस किए जा सकते हैं. यह देखने के लिए कि Spanner, एसक्यूएल क्वेरी को कैसे मैनेज करता है:

  1. कंसोल में, Cloud Spanner इंस्टेंस पेज खोलें.
  2. Cloud Spanner इंस्टेंस पर जाएं
  3. Cloud Spanner इंस्टेंस के नाम पर क्लिक करें. डेटाबेस सेक्शन में जाकर, वह डेटाबेस चुनें जिसके लिए आपको क्वेरी करनी है.
  4. क्वेरी पर क्लिक करें.
  5. क्वेरी एडिटर में यह क्वेरी डालें
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. RUN पर क्लिक करें
  2. 'जानकारी' पर क्लिक करें

Cloud Console, आपकी क्वेरी के लिए विज़ुअल एक्ज़ीक्यूशन प्लान दिखाता है.

149f8bae468f8b34.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:

ऑप्टिमाइज़र का वर्शन अपडेट करना

इस लैब के समय, सबसे नया वर्शन 4 है. इसके बाद, क्वेरी ऑप्टिमाइज़र के लिए वर्शन 4 का इस्तेमाल करने के लिए, 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
[...]

मेट्रिक्स एक्सप्लोरर में क्वेरी ऑप्टिमाइज़र का वर्शन विज़ुअलाइज़ करना

Cloud Console में मेट्रिक एक्सप्लोरर का इस्तेमाल करके, अपने डेटाबेस इंस्टेंस के लिए क्वेरी की संख्या को विज़ुअलाइज़ किया जा सकता है. यह देखा जा सकता है कि हर डेटाबेस में ऑप्टिमाइज़र के किस वर्शन का इस्तेमाल किया जा रहा है.

  1. Cloud Console में मॉनिटरिंग पर जाएं और बाएं मेन्यू में जाकर, Metrics Explorer चुनें.
  2. संसाधन का टाइप फ़ील्ड में, Cloud Spanner इंस्टेंस चुनें.
  3. मेट्रिक फ़ील्ड में, क्वेरी की संख्या चुनें और लागू करें पर क्लिक करें.
  4. इसके हिसाब से ग्रुप करें फ़ील्ड में, डेटाबेस, optimizer_version, और status चुनें.

581b859c25790b21.png

7. Firestore डेटाबेस बनाना और उसे कॉन्फ़िगर करना

Firestore एक NoSQL दस्तावेज़ डेटाबेस है. इसे ऑटोमैटिक स्केलिंग, बेहतर परफ़ॉर्मेंस, और ऐप्लिकेशन डेवलपमेंट को आसान बनाने के लिए बनाया गया है. Firestore इंटरफ़ेस में, पारंपरिक डेटाबेस की तरह ही कई सुविधाएं होती हैं. हालांकि, NoSQL डेटाबेस, डेटा ऑब्जेक्ट के बीच संबंधों के बारे में बताने के मामले में उनसे अलग होता है.

इस टास्क में, आपको Firestore की मदद से Cloud Run ऐप्लिकेशन के लिए ऑर्डरिंग सेवा बनाने का तरीका बताया जाएगा. ऑर्डरिंग सेवा, ऑर्डर शुरू करने से पहले Spanner डेटाबेस से क्वेरी करने के लिए, पिछले सेक्शन में बनाई गई इन्वेंट्री सेवा को कॉल करेगी. इस सेवा से यह पक्का किया जा सकेगा कि इन्वेंट्री मौजूद है और ऑर्डर पूरा किया जा सकता है.

6843abaf4263e112.png

8. Firestore के कॉन्सेप्ट

डेटा मॉडल

Firestore डेटाबेस, कलेक्शन और दस्तावेज़ों से मिलकर बना होता है.

b60acd63d4793a6c.png

दस्तावेज़

हर दस्तावेज़ में, की-वैल्यू पेयर का एक सेट होता है. Firestore को छोटे दस्तावेज़ों के बड़े कलेक्शन को सेव करने के लिए ऑप्टिमाइज़ किया गया है.

5571cb2f261d2dbe.png

कलेक्शन

आपको सभी दस्तावेज़, कलेक्शन में सेव करने होंगे. दस्तावेज़ों में सब-कलेक्शन और नेस्ट किए गए ऑब्जेक्ट शामिल हो सकते हैं. इनमें स्ट्रिंग जैसे प्रिमिटिव फ़ील्ड या सूचियों जैसे कॉम्प्लेक्स ऑब्जेक्ट शामिल हैं.

5811378cb721e5ec.png

Firestore डेटाबेस बनाना

  1. Firestore डेटाबेस बनाना
gcloud firestore databases create --location=$REGION

आउटपुट का उदाहरण

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

9. अपने ऐप्लिकेशन में 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].

Firestore के सुरक्षा नियम

सुरक्षा के नियम, ऐक्सेस कंट्रोल और डेटा की पुष्टि करने की सुविधा देते हैं. ये नियम, आसान फ़ॉर्मैट में उपलब्ध होते हैं.

  1. order-service/starter-code डायरेक्ट्री पर जाएं
cd ~/cymbal-eats/order-service
  1. cloud editor में firestore.rules फ़ाइल खोलें
cat firestore.rules

firestore.rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { ⇐ All database
    match /{document=**} { ⇐ All documents
      allow read: if true; ⇐ Allow reads
    }
    match /{document=**} {
      allow write: if false; ⇐ Deny writes
    }
  }
}

चेतावनी: Firestore स्टोरेज का ऐक्सेस सीमित रखना सबसे सही तरीका है. इस लैब के लिए, सभी को पढ़ने की अनुमति है. यह प्रोडक्शन कॉन्फ़िगरेशन का सुझाव नहीं दिया गया है.

Firestore की मैनेज की गई सेवाओं को चालू करना

  1. टर्मिनल खोलें पर क्लिक करें
  2. मौजूदा प्रोजेक्ट आईडी के साथ .firebaserc फ़ाइल बनाएं. डप्लॉय टारगेट की सेटिंग, आपकी प्रोजेक्ट डायरेक्ट्री में मौजूद .firebaserc फ़ाइल में सेव होती हैं.

firebaserc.tmpl

sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
  1. Firebase बाइनरी डाउनलोड करें
curl -sL https://firebase.tools | upgrade=true bash

आउटपुट का उदाहरण

-- Checking for existing firebase-tools on PATH...
Your machine already has firebase-tools@10.7.0 installed. Nothing to do.
-- All done!
  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 उसे बना देता है.

Firestore में डेटा जोड़ना

Cloud Firestore में डेटा लिखने के कई तरीके हैं:

  • किसी कलेक्शन में मौजूद दस्तावेज़ का डेटा सेट करता है. इसके लिए, दस्तावेज़ का आइडेंटिफ़ायर साफ़ तौर पर तय किया जाता है.
  • किसी कलेक्शन में नया दस्तावेज़ जोड़ना. इस मामले में, Cloud Firestore दस्तावेज़ आइडेंटिफ़ायर को अपने-आप जनरेट करता है.
  • अपने-आप जनरेट होने वाले आइडेंटिफ़ायर के साथ एक खाली दस्तावेज़ बनाएं और बाद में उसमें डेटा असाइन करें.

अगले सेक्शन में, सेट किए गए तरीके का इस्तेमाल करके दस्तावेज़ बनाने का तरीका बताया गया है.

कोई दस्तावेज़ सेट करना

दस्तावेज़ बनाने के लिए, set() तरीके का इस्तेमाल करें. set() तरीके में, आपको दस्तावेज़ बनाने के लिए एक आईडी तय करनी होगी.

यहां दिया गया कोड स्निपेट देखें.

index.js

const orderDoc = db.doc(`orders/123`);
await orderDoc.set({
    orderNumber: 123,
    name: Anne,
    address: 555 Bright Street,
    city: Mountain View,
    state: CA,
    zip: 94043,
    orderItems: [id: 1],
    status: 'New'
  });

इस कोड से एक ऐसा दस्तावेज़ बनेगा जिसमें उपयोगकर्ता के जनरेट किए गए दस्तावेज़ का आईडी 123 होगा. अगर आपको Firestore से अपने लिए आईडी जनरेट कराना है, तो add() या create()तरीके का इस्तेमाल करें.

दस्तावेज़ अपडेट करना

अपडेट करने के तरीके update() की मदद से, पूरे दस्तावेज़ को बदले बिना, दस्तावेज़ के कुछ फ़ील्ड अपडेट किए जा सकते हैं.

नीचे दिए गए स्निपेट में, कोड ऑर्डर 123 को अपडेट करता है

index.js

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

दस्तावेज़ मिटाना

Firestore में, कलेक्शन, दस्तावेज़ या किसी दस्तावेज़ के खास फ़ील्ड मिटाए जा सकते हैं. किसी दस्तावेज़ को मिटाने के लिए, delete() तरीके का इस्तेमाल करें.

नीचे दिए गए स्निपेट में, ऑर्डर 123 को मिटाया गया है.

index.js

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

10. लागू करना और जांच करना

इस सेक्शन में, ऐप्लिकेशन को Cloud Run पर डिप्लॉय किया जाएगा. साथ ही, क्रिएट, अपडेट, और मिटाने के तरीकों की जांच की जाएगी.

ऐप्लिकेशन को Cloud Run पर डिप्लॉय करना

  1. इन्वेंट्री सेवा के साथ इंटिग्रेट करने के लिए, यूआरएल को 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. जांच के लिए, ऑर्डर सेवा देने वाले ऐप्लिकेशन के यूआरएल को किसी वैरिएबल में सेव करना
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 के orders कलेक्शन से 46429 आइटम मिटाओ
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

नतीजे देखें

  1. Firestore कंसोल पर जाएं
  2. डेटा पर क्लिक करें

73e14d69211d1539.png

11. बधाई हो!

बधाई हो, आपने यह लैब पूरी कर ली है!

इसके बाद क्या होगा:

Cymbal Eats के अन्य कोडलैब देखें:

व्यवस्थित करें

इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, संसाधनों वाला प्रोजेक्ट मिटाएं. इसके अलावा, प्रोजेक्ट को बनाए रखने और अलग-अलग संसाधनों को मिटाने का विकल्प भी है.

प्रोजेक्ट मिटाना

बिलिंग को बंद करने का सबसे आसान तरीका यह है कि ट्यूटोरियल के लिए बनाया गया प्रोजेक्ट मिटा दें.