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

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

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

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

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

  • स्पैनर एकीकृत करें
  • स्पैनर से मैनेज की जा रही सेवाएं चालू करें
  • कोड में इंटिग्रेट करें
  • स्पैनर से कनेक्ट करने वाला कोड डिप्लॉय करें
  • 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 में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, बिलिंग से बचने के लिए संसाधनों को बंद करें. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. 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 के एपीआई चालू करना
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. स्पैनर इंस्टेंस बनाना और कॉन्फ़िगर करना

स्पैनर, इन्वेंट्री सेवाओं का बैकएंड रिलेशनल डेटाबेस है. नीचे दिए गए चरणों में आपको स्पैनर इंस्टेंस, डेटाबेस, और स्कीमा बनाना होगा.

इंस्टेंस बनाना

  1. Cloud Spanner इंस्टेंस बनाना
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1

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

Creating instance...done.   
  1. पुष्टि करें कि स्पैनर इंस्टेंस सही तरीके से कॉन्फ़िगर किया गया है या नहीं
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. स्पैनर डेटाबेस बनाना
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. स्पैनर एकीकृत करना

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

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

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

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

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

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

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

  1. सेवा खाते को स्पैनर डेटाबेस एडमिन की भूमिका देना
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].
[...]

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

स्पैनर क्लाइंट लाइब्रेरी, स्पैनर के साथ मिलकर काम करने की मुश्किलों को कम करती है और यह कई लोकप्रिय प्रोग्रामिंग भाषाओं में उपलब्ध है.

स्पैनर क्लाइंट बनाना

स्पैनर क्लाइंट, एक ऐसा क्लाइंट है जो क्लाउड स्पैनर डेटाबेस में डेटा को पढ़ने और उसमें बदलाव करने के लिए इस्तेमाल किया जाता है. 'बंद करें' तरीके को छोड़कर, क्लाइंट एक साथ इस्तेमाल के लिए सुरक्षित है.

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

main.go

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

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

Cloud Spanner, डिक्लेरेटिव एसक्यूएल स्टेटमेंट का इस्तेमाल करके अपने डेटाबेस से क्वेरी करती है. एसक्यूएल स्टेटमेंट, नतीजे पाने के तरीके की जानकारी दिए बिना बताते हैं कि उपयोगकर्ता क्या चाहता है.

  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: 

क्वेरी को एक्ज़ीक्यूट करने के प्लान

क्वेरी एक्ज़ीक्यूट करने का प्लान, कई चरणों की सीरीज़ है. इसका इस्तेमाल करके स्पैनर, नतीजे हासिल करता है. किसी खास एसक्यूएल स्टेटमेंट के नतीजे पाने के कई तरीके हो सकते हैं. क्वेरी एक्ज़ीक्यूट करने के प्लान को कंसोल और क्लाइंट लाइब्रेरी से ऐक्सेस किया जा सकता है. यह देखने के लिए कि स्पैनर, SQL क्वेरी को कैसे हैंडल करता है:

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

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

149f8bae468f8b34.png

क्वेरी ऑप्टिमाइज़र

Cloud Spanner क्वेरी ऑप्टिमाइज़र, प्लान को लागू करने के दूसरे तरीकों की तुलना करके, सबसे कारगर प्लान को चुनता है. समय के साथ, क्वेरी ऑप्टिमाइज़र बेहतर होगा, जिससे क्वेरी एक्ज़िक्यूशन प्लान में दिए जाने वाले विकल्पों को बढ़ाया जाएगा और उन विकल्पों की जानकारी देने वाले अनुमानों को ज़्यादा सटीक बनाया जाएगा. इससे क्वेरी को लागू करने के बेहतर प्लान बनेंगे.

Cloud Spanner, ऑप्टिमाइज़र के अपडेट को क्वेरी ऑप्टिमाइज़र के नए वर्शन के तौर पर रोल आउट करती है. डिफ़ॉल्ट रूप से, हर डेटाबेस, वर्शन रिलीज़ होने के 30 दिनों के अंदर ऑप्टिमाइज़र के सबसे नए वर्शन का इस्तेमाल करना शुरू कर देता है.

gcloud स्पैनर में क्वेरी चलाते समय इस्तेमाल किया गया वर्शन देखने के लिए, –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 का इस्तेमाल करने के मकसद से अपडेट करना होगा.

  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 में 'निगरानी' पर जाएं और बाएं मेन्यू में मेट्रिक एक्सप्लोरर चुनें.
  2. संसाधन टाइप फ़ील्ड में, क्लाउड स्पैनर इंस्टेंस चुनें.
  3. मेट्रिक फ़ील्ड में, क्वेरी की संख्या और 'लागू करें' चुनें.
  4. इसके हिसाब से ग्रुप बनाएं फ़ील्ड में, डेटाबेस, ऑप्टिमाइज़र वर्शन, और स्टेटस चुनें.

581b859c25790b21.png

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

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

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

6843ABf4263e112.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. ऑर्डर-सेवा/स्टार्टर-कोड डायरेक्ट्री पर जाएं
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 स्टोरेज के ऐक्सेस को सीमित करना सबसे सही तरीका है. इस लैब के लिए, सभी रीड की अनुमति है. यह एक सुझाया गया प्रोडक्शन कॉन्फ़िगरेशन नहीं है.

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 उसे बनाता है.

फ़ायरस्टोर में डेटा जोड़ें

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 के बारे में बताने वाला दस्तावेज़ बनाएगा. अगर आपको Firebase के लिए आईडी जनरेट करना है, तो 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 ऑर्डर कलेक्शन से आइटम 46429 मिटाएं
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}

नतीजे देखें

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

73e14d69211d1539.png

11. बधाई हो!

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

आने वाले समय में मिलने वाली सुविधाएं:

Cymbal Eagles के अन्य कोडलैब एक्सप्लोर करें:

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

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

प्रोजेक्ट मिटाया जा रहा है

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