Battle One – שדה קרב של מיקרו-שירותים

1. מבוא

עדכון אחרון: 26 באוגוסט 2020

זירת הקרבות של המיקרו-שירותים (microservices)

הייתם פעם בקרב כדורי שלג שבו אתם מסתובבים וזורקים כדורי שלג על אחרים? אם לא, נסו זאת מתישהו! אבל עכשיו, במקום להסתכן בפגיעה פיזית, אפשר לפתח שירות קטן ונגיש לרשת (מיקרו-שירות) שישתתף בקרב אדיר נגד מיקרו-שירותים (microservices) אחרים. ומכיוון שאנחנו מארחים את הקרב של המיקרו-שירותים ב-SpringOne, המיקרו-שירותים שלנו זורקים עלים במקום כדורי שלג.

ייתכן שאתם תוהים... אבל מה קורה אם מיקרו-שירות (microservice) "פועל" או עלה במיקרו-שירותים אחרים? מיקרו-שירות (microservice) יכול לקבל בקשות רשת (בדרך כלל באמצעות HTTP) ולהחזיר תגובות. יש 'מנהל אזור' שתשלח למיקרו-שירות (microservice) את המצב הנוכחי של הזירה, ואז המיקרו-שירות (microservice) תגיב באמצעות פקודה שמציינת מה לעשות.

ברור שהמטרה היא לנצח, אבל בהמשך תלמדו על יצירה ופריסה של מיקרו-שירותים (microservices) ב-Google Cloud.

איך זה עובד

נפתח מיקרו-שירות (microservice) בכל טכנולוגיה שרוצים (או לבחור מבין סימני Java, Kotlin או Scala) ולאחר מכן פורסים את המיקרו-שירות (microservice) ב-Google Cloud. לאחר הפריסה, ממלאים טופס כדי להודיע לנו על כתובת ה-URL של המיקרו-שירות (microservice) ואז אנחנו נוסיף אותו לזירה.

הזירה כוללת את כל השחקנים בקרב קרב מסוים. לוועידת SpringOne תהיה זירה משלה. כל שחקן מייצג מיקרו-שירות (microservice) שנע וזורק על השחקנים האחרים.

בערך פעם שנייה, מנהל הזירה שלנו יתקשר למיקרו-שירות (microservice) שלכם וישלח את מצב הזירה הנוכחי (איפה השחקנים נמצאים) והמיקרו-שירות (microservice) יגיב לפקודה 'מה לעשות'. בזירה אפשר להתקדם קדימה, לפנות שמאלה או ימינה או לזרוק עלה. עלה זרוע נע עד שלושה רווחים בכיוון שאליו השחקן פונה. אם עלה "מכה" שחקן אחר, הזורק מקבל נקודה אחת והשחקן הכה מאבד נקודה. גודל האצטדיון מותאם באופן אוטומטי למספר השחקנים הנוכחי.

כך נראית אצטדיון בעבר:

20628e6bd442bd11.png

דוגמה ל-Battle One ארנה

מחלוקות משתנות

בזירה, ייתכן שמספר שחקנים מנסים לבצע פעולות מתנגשות. לדוגמה, שני שחקנים עשויים לנסות לעבור לאותו מרחב. במקרה של התנגשות, המיקרו-שירות (microservice) עם זמן התגובה המהיר ביותר מנצח.

צפייה בקרב

כדאי לראות את הזירה בשידור חי כדי לראות את הביצועים של המיקרו-שירות (microservice) בקרב.

Battle API

כדי לעבוד עם מנהל/ת התחום שלנו, המיקרו-שירות (microservice) שלכם יצטרך להטמיע API ספציפי כדי להשתתף בזירה. מנהל הזירה ישלח את מצב הזירה הנוכחי ב-HTTP POST לכתובת ה-URL שסיפקתם לנו, במבנה הבא של 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
    }
  }
}

תגובת ה-HTTP חייבת להיות קוד סטטוס 200 (OK) עם גוף תגובה שמכיל את הצעד הבא, מקודדת כתו גדולה אחת של אחד או יותר מהערכים הבאים:

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

זה הכול! בואו נראה איך פורסים מיקרו-שירות (microservice) ב-Cloud Run, שירות של Google Cloud להרצת מיקרו-שירותים (microservices) ואפליקציות אחרות.

2. התחברות ל-Google Cloud

כדי שתוכלו לפרוס את המיקרו-שירות (microservice) ב-Cloud Run, תצטרכו להתחבר ל-Google Cloud. אנו נזכה את החשבון שלך ולא תצטרך להזין פרטי כרטיס אשראי. בדרך כלל פחות בעייתי להשתמש בחשבון אישי (למשל, gmail.com) במקום בחשבון G Suite, כי לפעמים האדמינים ב-G Suite מונעים מהמשתמשים שלהם להשתמש בתכונות מסוימות של Google Cloud. בנוסף, מסוף האינטרנט שבו נשתמש אמור לפעול היטב עם Chrome או עם Firefox, אבל ייתכן שיהיו בו בעיות ב-Safari.

3. פריסת המיקרו-שירות (microservice)

אתם יכולים לפתח מיקרו-שירות (microservice) בכל טכנולוגיה ולפרוס אותו בכל מקום, כל עוד אפשר לגשת אליו באופן ציבורי ותואם ל-Battle API. אבל כדי להקל עליכם, אנחנו נעזור לכם להתחיל משירות לדוגמה ולפרוס אותו ב-Cloud Run.

בחירת טעימה בתור התחלה

אפשר להתחיל בשתי דוגמאות של מיקרו-שירות (microservice):

Java ו- מגף קפיץ

מקור

פריסה ב-Cloud Run

קוטלין מגף קפיץ

מקור

פריסה ב-Cloud Run

אחרי שמחליטים באיזו דוגמה להתחיל, לוחצים על Deploy on Cloud Run (פריסה ב-Cloud Run) לחצן למעלה. פעולה זו תפעיל את Cloud Shell (מסוף מבוסס-אינטרנט למכונה וירטואלית בענן) שבה יש לשכפל את המקור ואז ליצור חבילה שניתן לפרוס (תמונת קונטיינר של Docer). לאחר מכן תתבצע העלאה אל Google Container Registry ואז נפרס ב-Cloud Run.

כשמופיעה בקשה, מציינים את האזור us-central1.

בצילום המסך למטה מוצג הפלט של Cloud Shell לפיתוח ולפריסה של מיקרו-שירות (microservice)

d88e40430706a32b.png

מוודאים שהמיקרו-שירות (microservice) פועל

ב-Cloud Shell אתם יכולים לשלוח בקשה למיקרו-שירות (microservice) החדש שנפרס, ולהחליף את הכתובת YOUR_SERVICE_URL בכתובת ה-URL של השירות (שנמצאת ב-Cloud Shell אחרי השורה 'האפליקציה שלך פעילה כאן'):

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, עם השם שלכם, כתובת ה-URL של שירות 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

עכשיו אתם יכולים לערוך את המקור של המיקרו-שירות (microservice) מתוך 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 כדי לזהות את סוג הפרויקט, להדר אותו וליצור את הארטיפקט שניתן לפריסה (קובץ אימג' בקונטיינר של Docker).

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

עכשיו, אחרי שתיצרו את קובץ האימג' בקונטיינר, תוכלו להשתמש בפקודת Docer (ב-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. פיתוח מקומי

אתם יכולים לעבוד על הפרויקט באופן מקומי באמצעות סביבת פיתוח משולבת (IDE) משלכם:

  1. [ב-Cloud Shell] יוצרים ZIP של הדוגמה:

cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE

  1. [ב-Cloud Shell] מורידים את קובץ ה-ZIP למחשב:

cloudshell download-file cloudbowl-sample.zip

  1. [במחשב] מחלצים את הקובץ ואז יוצרים & בדיקת השינויים
  2. [במכונה שלכם] התקנת ה-CLI של gcloud
  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. מזל טוב

כל הכבוד! פיתחתם ופרסתם בהצלחה מיקרו-שירות (microservice) שיכול להילחם במיקרו-שירותים (microservices) אחרים! בהצלחה!

חזרה ללמידה

מסמכי עזר

8. שאלות נפוצות

למה המיקרו-שירות (microservice) שלי לא מופיע בזירה?