बैटल वन - माइक्रोसर्विस का बैटल ग्राउंड

1. परिचय

पिछले अपडेट की तारीख: 26-08-2020

Microservices Battle Arena

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

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

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

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

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

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

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

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

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 पर डिप्लॉय करने में मदद करेंगे.

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

बैटल माइक्रोसेवा के दो सैंपल हैं, जिनसे शुरुआत की जा सकती है:

Java और Spring Boot

सोर्स

Cloud Run पर डिप्लॉय करना

Kotlin और Spring Boot

सोर्स

Cloud Run पर डिप्लॉय करना

आपको जिस सैंपल से शुरुआत करनी है उसे चुनने के बाद, ऊपर मौजूद "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. अरीना में शामिल करने का अनुरोध करें

अरीना में शामिल होने के लिए, आपको #3-sponsor-google-cloud Slack चैनल पर एक मैसेज भेजना होगा. इसमें अपना नाम, Cloud Run सेवा का यूआरएल, और GitHub का उपयोगकर्ता नाम (वैकल्पिक) शामिल करें. इससे आपके अवतार / प्रोफ़ाइल फ़ोटो को सेट किया जा सकेगा. जानकारी की पुष्टि हो जाने के बाद, आपका प्लेयर अरीना में दिखेगा.

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=java-springboot
export SAMPLE=kotlin-springboot

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

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

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

f910c9ef7b51c406.png

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

बदलावों को सेव करने के बाद, Cloud Shell में ऐप्लिकेशन शुरू करें:

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

ऐप्लिकेशन चालू होने के बाद, नया 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 का इस्तेमाल करती है.

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\
          --memory=512Mi\
          --allow-unauthenticated

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

6. लोकल डेवलपमेंट

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

  1. [Cloud Shell में] सैंपल को ज़िप करें:

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

  1. [अपनी मशीन पर] नया कंटेनर डिप्लॉय करें:

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

7. बधाई हो

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

सीखना जारी रखें

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

8. अक्सर पूछे जाने वाले सवाल

मेरी माइक्रोसेवा, अरीना में क्यों नहीं दिख रही है?