माइक्रोसर्विस रेनबो रम्पस

1. परिचय

पिछली बार अपडेट किया गया: 2021-05-06

Microservice Rainbow Rumpus

क्या आपने कभी स्नोबॉल फ़ाइट में हिस्सा लिया है, जिसमें आपको इधर-उधर घूमकर दूसरों पर स्नोबॉल फेंकने होते हैं? अगर आपने अब तक इसे आज़माया नहीं है, तो इसे आज़माएं! हालांकि, अब आपको शारीरिक रूप से चोटिल होने का खतरा नहीं है. इसके बजाय, नेटवर्क से ऐक्सेस की जा सकने वाली एक छोटी सी सेवा (माइक्रोसर्विस) बनाई जा सकती है. यह अन्य माइक्रोसर्विस के साथ एक बड़ी लड़ाई में हिस्सा लेगी और स्नोबॉल के बजाय इंद्रधनुष फेंकेगी.

आपके मन में यह सवाल हो सकता है कि... लेकिन, कोई माइक्रोसेवा दूसरी माइक्रोसेवाओं को "थ्रो" कैसे करती है? माइक्रोसर्विस, नेटवर्क अनुरोध (आम तौर पर एचटीटीपी पर) पा सकती है और जवाब दे सकती है. "अरीना मैनेजर" होता है, जो आपकी माइक्रोसेवा को अरीना की मौजूदा स्थिति के बारे में जानकारी भेजता है. इसके बाद, आपकी माइक्रोसेवा एक निर्देश के साथ जवाब देती है, जिसमें यह बताया जाता है कि क्या करना है.

ज़रूर, इस गेम का मकसद जीतना है. हालांकि, इस दौरान आपको Google Cloud पर माइक्रोसेवाएं बनाने और उन्हें डिप्लॉय करने के बारे में जानकारी मिलेगी.

यह सुविधा कैसे काम करती है

आपको अपनी पसंद की किसी भी टेक्नोलॉजी का इस्तेमाल करके एक माइक्रोसेवा बनानी होगी. इसके अलावा, Go, Java, Kotlin, Scala, NodeJS या Python स्टार्टर में से किसी एक को भी चुना जा सकता है. इसके बाद, आपको Google Cloud पर माइक्रोसेवा को डिप्लॉय करना होगा. डप्लॉय करने के बाद, हमें अपनी माइक्रोसेवा का यूआरएल बताएं. इसके बाद, हम इसे अरीना में जोड़ देंगे.

अरीना में, किसी बैटल के लिए सभी खिलाड़ी शामिल होते हैं. रेनबो रंपस के अपने अरीना होंगे. हर प्लेयर एक माइक्रोसेवा को दिखाता है. यह माइक्रोसेवा, गेम में घूमती है और दूसरे प्लेयर पर इंद्रधनुष फेंकती है.

हमारा अरीना मैनेजर, आपकी माइक्रोसेवा को हर सेकंड में एक बार कॉल करेगा. इससे अरीना की मौजूदा स्थिति (खिलाड़ी कहां हैं) के बारे में जानकारी मिलेगी. इसके बाद, आपकी माइक्रोसेवा यह बताएगी कि क्या करना है. अरीना में आगे बढ़ा जा सकता है, बाईं या दाईं ओर मुड़ा जा सकता है या इंद्रधनुष बनाया जा सकता है. इंद्रधनुष, खिलाड़ी के सामने की दिशा में तीन स्पेस तक जाएगा. अगर रेनबो किसी दूसरे खिलाड़ी को "लगता" है, तो थ्रो करने वाले खिलाड़ी को एक पॉइंट मिलता है और जिस खिलाड़ी को रेनबो लगता है उसका एक पॉइंट कम हो जाता है. अखाड़े का साइज़, खिलाड़ियों की मौजूदा संख्या के हिसाब से अपने-आप अडजस्ट हो जाता है.

यहां एक पुराने अरीना की झलक दिखाई गई है:

20628e6bd442bd11.png

बैटल वन अरीना का उदाहरण

बार-बार होने वाले उल्लंघन

अखाड़े में ऐसा हो सकता है कि कई खिलाड़ी एक साथ अलग-अलग कार्रवाइयां करें. उदाहरण के लिए, ऐसा हो सकता है कि दो खिलाड़ी एक ही जगह पर जाने की कोशिश करें. अगर कोई टकराव होता है, तो सबसे कम समय में जवाब देने वाली माइक्रोसेवा को प्राथमिकता दी जाती है.

बैटल देखना

यह देखने के लिए कि आपकी माइक्रोसेवा कैसा परफ़ॉर्म कर रही है, लाइव अरीना देखें!

Battle API

हमारे अरीना मैनेजर के साथ काम करने के लिए, आपकी माइक्रोसेवा को अरीना में शामिल होने के लिए, किसी खास एपीआई को लागू करना होगा. अरीना मैनेजर, अरीना की मौजूदा स्थिति को एचटीटीपी पोस्ट के ज़रिए, आपके दिए गए यूआरएल पर भेजेगा. इसके लिए, इस JSON स्ट्रक्चर का इस्तेमाल किया जाएगा:

{
  "_links": {
    "self": {
      "href": "https://YOUR_SERVICE_URL"
    }
  },
  "arena": {
    "dims": [4,3], // width, height
    "state": {
      "https://A_PLAYERS_URL": {
        "x": 0, // zero-based x position, where 0 = left
        "y": 0, // zero-based y position, where 0 = top
        "direction": "N", // N = North, W = West, S = South, E = East
        "wasHit": false,
        "score": 0
      }
      ... // also you and the other players
    }
  }
}

आपके एचटीटीपी रिस्पॉन्स का स्टेटस कोड 200 (OK) होना चाहिए. साथ ही, रिस्पॉन्स बॉडी में आपका अगला मूव होना चाहिए. इसे एक अपरकेस वर्ण के तौर पर एन्कोड किया गया हो. यह वर्ण इनमें से कोई एक होना चाहिए:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

बस इतना ही! आइए, Cloud Run पर माइक्रोसेवा डिप्लॉय करने का तरीका जानें. Cloud Run, Google Cloud की एक सेवा है. इसका इस्तेमाल माइक्रोसेवाओं और अन्य ऐप्लिकेशन को चलाने के लिए किया जाता है.

2. Google Cloud में लॉग इन करना

Cloud Run पर अपनी माइक्रोसेवा को डिप्लॉय करने के लिए, आपको Google Cloud में लॉगिन करना होगा. हम आपके खाते में क्रेडिट लागू कर देंगे. इसके बाद, आपको क्रेडिट कार्ड की जानकारी नहीं डालनी होगी. GSuite खाते के बजाय निजी खाते (जैसे, gmail.com) का इस्तेमाल करना आम तौर पर कम मुश्किल होता है. ऐसा इसलिए, क्योंकि कभी-कभी GSuite एडमिन, अपने उपयोगकर्ताओं को Google Cloud की कुछ सुविधाओं का इस्तेमाल करने से रोक देते हैं. इसके अलावा, हम जिस वेब कंसोल का इस्तेमाल करेंगे वह Chrome या Firefox के साथ अच्छी तरह से काम करना चाहिए. हालांकि, Safari में समस्याएं हो सकती हैं.

3. अपनी माइक्रोसेवा को डिप्लॉय करना

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

शुरू करने के लिए अपना सैंपल चुनें

बैटल माइक्रोसेवा के कई सैंपल उपलब्ध हैं. इनमें से किसी का भी इस्तेमाल किया जा सकता है:

Kotlin और Spring Boot

सोर्स

Kotlin और Micronaut

सोर्स

Kotlin और Quarkus

सोर्स

Java और Spring Boot

सोर्स

Java और Quarkus

सोर्स

ऐप पर जाएं

सोर्स

Node.js और Express

सोर्स

Python और Flask

सोर्स

आपको जिस सैंपल से शुरुआत करनी है उसे चुनने के बाद, ऊपर मौजूद "Cloud Run पर डिप्लॉय करें" बटन पर क्लिक करें. इससे Cloud Shell लॉन्च होगा. यह क्लाउड में मौजूद वर्चुअल मशीन के लिए वेब पर आधारित कंसोल है. यहां सोर्स को क्लोन किया जाएगा. इसके बाद, इसे डिप्लॉय किए जा सकने वाले पैकेज (डॉकर कंटेनर इमेज) में बनाया जाएगा. इसके बाद, इसे Google Container Registry पर अपलोड किया जाएगा. इसके बाद, इसे Cloud Run पर डिप्लॉय किया जाएगा.

जब आपसे पूछा जाए, तब us-central1 क्षेत्र की जानकारी दें.

नीचे दिए गए स्क्रीनशॉट में, माइक्रोसेवा को बनाने और डिप्लॉय करने के लिए Cloud Shell का आउटपुट दिखाया गया है

d88e40430706a32b.png

पुष्टि करना कि माइक्रोसेवा काम कर रही है

Cloud Shell में, नई डिप्लॉय की गई माइक्रोसेवा के लिए अनुरोध किया जा सकता है. इसके लिए, YOUR_SERVICE_URL को अपनी सेवा के यूआरएल से बदलें. यह यूआरएल, Cloud Shell में "Your application is now live here" लाइन के बाद दिखता है:

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  https://YOUR_SERVICE_URL

आपको F, L, R या T में से किसी एक की रिस्पॉन्स स्ट्रिंग दिखनी चाहिए.

4. अरीना में शामिल करने का अनुरोध करें

Rainbow Rumpus में शामिल होने के लिए, आपको किसी अरीना में शामिल होना होगा. rainbowrumpus.dev खोलें. इसके बाद, उस अरीना में शामिल हों जहां आपको अपनी माइक्रोसेवा का यूआरएल देना है.

5. बदलाव करना और उन्हें लागू करना

बदलाव करने से पहले, आपको Cloud Shell में GCP प्रोजेक्ट और इस्तेमाल किए गए सैंपल के बारे में कुछ जानकारी सेट अप करनी होगी. सबसे पहले, अपने GCP प्रोजेक्ट की लिस्ट बनाएं:

gcloud projects list

ऐसा हो सकता है कि आपके पास सिर्फ़ एक प्रोजेक्ट हो. पहले कॉलम से PROJECT_ID को कॉपी करें और इसे यहां दिए गए निर्देश में चिपकाएं. साथ ही, YOUR_PROJECT_ID को अपने असल प्रोजेक्ट आईडी से बदलें. ऐसा इसलिए किया जाता है, ताकि हम एक एनवायरमेंट वैरिएबल सेट कर सकें. इसका इस्तेमाल हम बाद के निर्देशों में करेंगे:

export PROJECT_ID=YOUR_PROJECT_ID

अब उस सैंपल के लिए एक और एनवायरमेंट वैरिएबल सेट करें जिसका आपने इस्तेमाल किया था, ताकि बाद के कमांड में हम सही डायरेक्ट्री और सेवा का नाम तय कर सकें:

# Copy and paste ONLY ONE of these
export SAMPLE=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

अब Cloud Shell में जाकर, अपनी माइक्रोसेवा के सोर्स में बदलाव किया जा सकता है. Cloud Shell के वेब-आधारित एडिटर को खोलने के लिए, यह कमांड चलाएं:

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

इसके बाद, आपको बदलाव करने के बारे में ज़्यादा निर्देश दिखेंगे.

f910c9ef7b51c406.png

एडिटर के साथ Cloud Shell, जिसमें सैंपल प्रोजेक्ट खुला हो

बदलावों को सेव करने के बाद, Cloud Shell में ऐप्लिकेशन शुरू करें. इसके लिए, README.md फ़ाइल में दिए गए कमांड का इस्तेमाल करें. हालांकि, इससे पहले पक्का करें कि Cloud Shell में, सैंपल की सही डायरेक्ट्री में हों:

cd cloudbowl-microservice-game/samples/$SAMPLE

ऐप्लिकेशन चालू होने के बाद, नया Cloud Shell टैब खोलें और curl का इस्तेमाल करके सेवा की जांच करें:

curl -d '{
  "_links": {
    "self": {
      "href": "https://foo.com"
    }
  },
  "arena": {
    "dims": [4,3],
    "state": {
      "https://foo.com": {
        "x": 0,
        "y": 0,
        "direction": "N",
        "wasHit": false,
        "score": 0
      }
    }
  }
}' -H "Content-Type: application/json" -X POST -w "\n" \
  http://localhost:8080

बदलावों को डिप्लॉय करने के लिए, Cloud Shell में pack कमांड का इस्तेमाल करके अपना प्रोजेक्ट बनाएं. यह कमांड, प्रोजेक्ट के टाइप का पता लगाने, उसे कंपाइल करने, और डिप्लॉय किए जा सकने वाले आर्टफ़ैक्ट (एक डॉकर कंटेनर इमेज) को बनाने के लिए, Buildpacks का इस्तेमाल करती है.

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path ~/cloudbowl-microservice-game/samples/$SAMPLE \
  --builder gcr.io/buildpacks/builder

कंटेनर इमेज बन जाने के बाद, docker कमांड (Cloud Shell में) का इस्तेमाल करके, कंटेनर इमेज को Google Container Registry पर पुश करें. इससे Cloud Run को इसे ऐक्सेस करने की अनुमति मिल जाएगी:

docker push gcr.io/$PROJECT_ID/$SAMPLE

अब नए वर्शन को Cloud Run पर डिप्लॉय करें:

gcloud run deploy $SAMPLE \
          --project=$PROJECT_ID \
          --platform=managed \
          --region=us-central1 \
          --image=gcr.io/$PROJECT_ID/$SAMPLE \
          --allow-unauthenticated

अब अरीना में आपके नए वर्शन का इस्तेमाल किया जाएगा!

6. स्थानीय तौर पर डेवलप करना (ज़रूरी नहीं)

अपने प्रोजेक्ट पर स्थानीय तौर पर काम करने के लिए, अपने आईडीई का इस्तेमाल किया जा सकता है. इसके लिए, यह तरीका अपनाएं:

  1. [Cloud Shell में] सैंपल को ज़िप करें:
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples
zip -r cloudbowl-sample.zip $SAMPLE
  1. [Cloud Shell में] अपने कंप्यूटर पर ZIP फ़ाइल डाउनलोड करें:
cloudshell download-file cloudbowl-sample.zip
  1. [अपने कंप्यूटर पर] फ़ाइल को अनज़िप करें. इसके बाद, बदलाव करें और उनकी जांच करें
  2. [On your machine] Install the gcloud CLI
  3. [अपनी मशीन पर] Google Cloud में लॉग इन करें:
gcloud auth login
  1. [अपनी मशीन पर] एनवायरमेंट वैरिएबल PROJECT_ID और SAMPLE को Cloud Shell में मौजूद वैल्यू के बराबर सेट करें.
  2. [अपनी मशीन पर] कंटेनर बनाने के लिए Cloud Build का इस्तेमाल करें (रूट प्रोजेक्ट डायरेक्ट्री से):
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [अपनी मशीन पर] नया कंटेनर डिप्लॉय करें:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. लगातार डिलीवरी

एससीएम सेटअप करना

GitHub को सेट अप करें, ताकि अपनी माइक्रोसेवा पर अपनी टीम के साथ मिलकर काम किया जा सके:

  1. GitHub में लॉगिन करें
  2. नई रेपो बनाना
  3. अगर आपको अपनी लोकल मशीन पर काम करना है, तो git कमांड लाइन इंटरफ़ेस (सीएलआई) या GitHub Desktop GUI ऐप्लिकेशन (Windows या Mac) का इस्तेमाल किया जा सकता है. अगर Cloud Shell का इस्तेमाल किया जा रहा है, तो आपको git CLI का इस्तेमाल करना होगा. GitHub पर अपनी माइक्रोसेवा का कोड पाने के लिए, CLI या GitHub Desktop के निर्देशों का पालन करें.

git सीएलआई की मदद से कोड पुश करना

  1. निजी ऐक्सेस टोकन के साथ, https पर git का इस्तेमाल करने से जुड़े निर्देशों का पालन करें
  2. "repo" स्कोप चुनें
  3. git सेटअप करें:
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. GitHub संगठन और डेटा स्टोर करने की जगह के लिए एनवायरमेंट वैरिएबल सेट करना (https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. अपने कोड को नई रेपो में पुश करें
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. बदलाव करने के बाद, उन्हें GitHub पर कमिट और पुश किया जा सकता है:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

GitHub Desktop की मदद से कोड पुश करना

  1. पिछले "स्थानीय तौर पर डेवलप करें" लैब में दिए गए निर्देशों का इस्तेमाल करके, अपना कोड डाउनलोड करें
  2. GitHub Desktop इंस्टॉल करें, इसे लॉन्च करें, और लॉगिन करें
  3. हाल ही में बनाई गई अपनी रेपो को क्लोन करें

cf7f38c7c86a91cd.png

  1. File Explorer खोलें और अपने प्रोजेक्ट को नई repo में कॉपी करें
  2. अपने बदलावों को कमिट करना

5f3c1552e30ad7c5.png

  1. अपनी मुख्य ब्रांच को GitHub पर पब्लिश करना

Cloud Run में लगातार डिप्लॉयमेंट की सुविधा सेट अप करना

GitHub पर SCM सेटअप करने के बाद, अब लगातार डिलीवरी की सुविधा सेटअप की जा सकती है. इससे main ब्रांच में हर बार नए कमिट पुश किए जाने पर, Cloud Build अपने-आप बदलावों को बनाएगा और उन्हें डिप्लॉय करेगा. आपके पास कंटीन्यूअस इंटिग्रेशन जोड़ने का विकल्प भी है. यह सुविधा, डिप्लॉय करने से पहले आपकी जांच करती है. हालांकि, इस चरण को आपके लिए एक अभ्यास के तौर पर छोड़ दिया गया है, क्योंकि आउट-ऑफ़-द-बॉक्स सैंपल में कोई जांच शामिल नहीं है.

  1. Cloud Console में, अपनी Cloud Run सेवा पर जाएं
  2. "SET UP CONTINUOUS DEPLOYMENT" बटन पर क्लिक करें
  3. GitHub से पुष्टि करें और अपने माइक्रोसेवा की रिपॉज़िटरी चुनें

a3b5692f178869bc.png

  1. अपनी GitHub रिपॉज़िटरी चुनें और ब्रांच को इस पर सेट करें: ^main$

338f1c00f33d2f65.png

  1. Buildpacks का इस्तेमाल करने के लिए, बिल्ड टाइप सेट करना
  2. लगातार डिप्लॉयमेंट की सुविधा सेट अप करने के लिए, सेव करें पर क्लिक करें.

8. जांचने की क्षमता

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

मेट्रिक

  1. Cloud Run सेवाओं की सूची में जाकर, अपनी सेवा ढूंढें
  2. अपनी सेवा के नाम पर क्लिक करके, उसके मेट्रिक डैशबोर्ड पर जाएं

8491b8ec6bc5b4db.png

  1. किसी मेट्रिक के ⋮ मेन्यू पर क्लिक करें. इसके बाद, "मेट्रिक एक्सप्लोरर में देखें" चुनें
  2. अब संसाधन मेट्रिक, फ़िल्टर, ग्रुप बनाने की सुविधा, और अन्य विकल्पों में बदलाव किया जा सकता है. उदाहरण के लिए, सभी सेवाओं के लिए सेवा की औसत लेटेंसी देखी जा सकती है:

f0d666d8f4221d45.png

लॉग

सेवाओं से मिलने वाले STDOUT आउटपुट को Google Cloud Logging सिस्टम को भेजा जाता है. Cloud Run सेवा के एडमिन पेज से, लॉग का बुनियादी व्यू ऐक्सेस किया जा सकता है. जैसे:

40058a82c9299cff.png

Cloud Run के लॉग में, गंभीरता के हिसाब से फ़िल्टर किया जा सकता है. साथ ही, लॉग को भी फ़िल्टर किया जा सकता है. ज़्यादा फ़्लेक्सिबिलिटी के लिए, इस पर क्लिक करें: 186fdb0e6d39a6ca.png

चेतावनियां

  1. अपनी सेवा के लिए हेल्थचेक यूआरएल बनाएं.
  2. Spring Boot के लिए, यह डिपेंडेंसी जोड़ें:
org.springframework.boot:spring-boot-starter-actuator
  1. src/main/resources/application.properties बनाएं या अपडेट करें और डिस्क स्पेस की जांच करने की सुविधा बंद करें:
management.health.diskspace.enabled=false
  1. अपना प्रोटोकॉल, होस्टनेम, और पाथ तय करके, अपटाइम की सूचना पाने के लिए अलर्ट बनाएं. Spring Boot के लिए पाथ यह है: /actuator/health
  2. सूचना की जांच करना

6948d13b263bf573.png

  1. सूचना बनाना

9. बधाई हो

बधाई हो, आपने एक ऐसी माइक्रोसेवा बना ली है जिसे अन्य माइक्रोसेवाओं के साथ इस्तेमाल किया जा सकता है! शुभकामनाएं!

रेफ़रंस दस्तावेज़