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

1. परिचय

पिछली बार अपडेट किए जाने की तारीख: 12-02-2020

Microservices Battle Arena

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

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

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

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

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

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

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

यहां तीन काल्पनिक खिलाड़ियों के साथ अरीना का व्यू दिखाया गया है:

9e4775d13ff18d4d.png

Battle Peach अरीना का उदाहरण

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

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

बैटल देखना

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

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. अपनी माइक्रोसेवा को डिप्लॉय करना

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

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

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

Java और Spring Boot

सोर्स

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

Java और Quarkus

सोर्स

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

Kotlin और Micronaut

सोर्स

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

Kotlin और Quarkus

सोर्स

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

Scala और Play Framework

सोर्स

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

ऐप पर जाएं

सोर्स

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 में से किसी एक की रिस्पॉन्स स्ट्रिंग दिखनी चाहिए.

Arena में शामिल होने का अनुरोध करना

इस अरीना में शामिल होने के लिए, आपको एक छोटा सा फ़ॉर्म भरना होगा. सबसे मुश्किल काम यह तय करना होगा कि आपको अपनी प्रोफ़ाइल इमेज के लिए किस इमेज का इस्तेमाल करना है. आपके पास GitHub या LinkedIn की इमेज का इस्तेमाल करने का विकल्प होता है. इसके अलावा, हम आपके लिए कोई रैंडम अवतार चुनेंगे. सबमिट किए गए फ़ॉर्म की समीक्षा करने के बाद, आपका प्लेयर अरीना में दिखेगा.

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

बदलाव करने से पहले, आपको 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-micronaut
export SAMPLE=scala-play

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

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

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

f910c9ef7b51c406.png

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

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

pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path cloudbowl-microservice-game/samples/$SAMPLE \
  --builder heroku/buildpacks

कंटेनर इमेज बन जाने के बाद, 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

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

3. बधाई हो

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

आगे क्या करना है?

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