Battle Peach – שדה קרב של מיקרו-שירותים (microservices)

1. מבוא

תאריך העדכון האחרון: 12 בפברואר 2020

Microservices Battle Arena

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

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

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

איך זה עובד

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

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

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

כך נראית הזירה עם שלושה שחקנים פיקטיביים:

9e4775d13ff18d4d.png

דוגמה לזירה של קרב פיץ'

התנגשויות חוזרות

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

צפייה בקרב

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

Battle API

כדי לעבוד עם מנהל הזירה שלנו, המיקרו-שירות שלכם צריך להטמיע 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. פריסת המיקרו-שירות

אתם יכולים לבנות את המיקרו-שירות בכל טכנולוגיה ולפרוס אותו בכל מקום, כל עוד הוא נגיש לציבור ועומד בדרישות של Battle API. כדי להקל על ההתחלה, אפשר להתחיל עם פרויקט לדוגמה שבו נבחרת פקודה אקראית.

בחירת דוגמה כדי להתחיל

יש שלוש דוגמאות למיקרו-שירותים של קרבות שאפשר להתחיל מהן:

‫Java ו-Spring Boot

מקור

פריסה ב-Cloud Run

‫Java ו-Quarkus

מקור

פריסה ב-Cloud Run

‫Kotlin ו-Micronaut

מקור

פריסה ב-Cloud Run

‫Kotlin ו-Quarkus

מקור

פריסה ב-Cloud Run

‫Scala ו-Play Framework

מקור

פריסה ב-Cloud Run

Go

מקור

פריסה ב-Cloud Run

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

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

צילום המסך שלמטה מציג את הפלט של Cloud Shell עבור בנייה ופריסה של מיקרו-שירות

d88e40430706a32b.png

אימות הפעולה של המיקרו-שירות

ב-Cloud Shell, שולחים בקשה למיקרו-שירות החדש שהופעל, ומחליפים את YOUR_SERVICE_URL בכתובת ה-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 Editor מבוסס-האינטרנט, מריצים את הפקודה הבאה:

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

יוצגו הוראות נוספות לביצוע שינויים.

f910c9ef7b51c406.png

Cloud Shell עם העורך והפרויקט לדוגמה פתוח

אחרי ששומרים את השינויים, בונים את הפרויקט ב-Cloud Shell באמצעות הפקודה pack. הפקודה הזו משתמשת ב-Buildpacks כדי לזהות את סוג הפרויקט, לקמפל אותו וליצור את הארטיפקט שניתן לפריסה (קובץ אימג' של קונטיינר Docker).

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. מזל טוב

הצלחתם לבנות ולפרוס מיקרו-שירות שיכול להילחם במיקרו-שירותים אחרים. בהצלחה!

מה השלב הבא?

מאמרי עזרה