1. מבוא
העדכון האחרון: 26 באוגוסט 2020
Microservices Battle Arena
השתתפתם פעם בקרב כדורי שלג שבו אתם זזים וזורקים כדורי שלג על אחרים? אם לא, כדאי לנסות בהזדמנות! אבל עכשיו, במקום להסתכן בחטיפה פיזית, אתם יכולים ליצור שירות קטן עם גישה לרשת (מיקרו-שירות) שישתתף בקרב אפי נגד מיקרו-שירותים אחרים. ובגלל שאנחנו מארחים את הקרב הזה של המיקרו-שירותים ב-SpringOne, המיקרו-שירותים שלנו יזרקו עלים במקום כדורי שלג.
אולי תהיתם… אבל איך מיקרו-שירות יכול "לזרוק" עלה על מיקרו-שירותים אחרים? מיקרו-שירות יכול לקבל בקשות רשת (בדרך כלל באמצעות HTTP) ולהחזיר תשובות. יש 'מנהל זירה' שישלח למיקרו-שירות שלכם את המצב הנוכחי של הזירה, ואז המיקרו-שירות שלכם יגיב בפקודה שמציינת מה לעשות.
המטרה היא כמובן לנצח, אבל במהלך המשחק תלמדו איך ליצור ולפרוס מיקרו-שירותים ב-Google Cloud.
איך זה עובד
תבנו מיקרו-שירות באמצעות כל טכנולוגיה שתרצו (או תבחרו מתוך תבניות התחלה של Java, Kotlin או Scala) ואז תפרסו את המיקרו-שירות ב-Google Cloud. אחרי הפריסה, תצטרכו למלא טופס כדי לציין את כתובת ה-URL של המיקרו-שירות, ואנחנו נוסיף אותו לזירה.
הזירה מכילה את כל השחקנים בקרב נתון. לכנס SpringOne יהיה זירה משלו. כל שחקן מייצג מיקרו-שירות שנע ממקום למקום וזורק עלים על השחקנים האחרים.
בערך פעם בשנייה, מנהל הזירה יתקשר למיקרו-שירות שלכם, ישלח את המצב הנוכחי של הזירה (איפה השחקנים), והמיקרו-שירות שלכם יגיב עם פקודה לגבי מה לעשות. בזירה תוכלו להתקדם, לפנות ימינה או שמאלה או לזרוק עלה. עלה שנזרק יעבור עד שלושה משבצות בכיוון שאליו השחקן פונה. אם עלה פוגע בשחקן אחר, השחקן שזרק את העלה מקבל נקודה אחת והשחקן שנפגע מאבד נקודה אחת. גודל הזירה מותאם אוטומטית למספר השחקנים הנוכחי.
כך נראה זירה קודמת:

זירת קרב לדוגמה
התנגשויות חוזרות
יכול להיות שבזירה כמה שחקנים ינסו לבצע פעולות סותרות. לדוגמה, שני שחקנים יכולים לנסות לעבור לאותו מקום. במקרה של קונפליקט, המיקרו-שירות עם זמן התגובה המהיר ביותר הוא זה שינצח.
צפייה בקרב
כדי לראות את הביצועים של המיקרו-שירות שלכם בקרב, אפשר להיכנס לזירה בזמן אמת.
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. כניסה ל-Google Cloud
כדי לפרוס את המיקרו-שירות (microservice) ב-Cloud Run, צריך להיכנס ל-Google Cloud. נוסיף קרדיט לחשבון שלכם ולא תצטרכו להזין כרטיס אשראי. בדרך כלל, עדיף להשתמש בחשבון לשימוש אישי (למשל gmail.com) במקום בחשבון G Suite, כי לפעמים אדמינים של G Suite מונעים מהמשתמשים שלהם להשתמש בתכונות מסוימות של Google Cloud. בנוסף, מסוף האינטרנט שבו נשתמש אמור לפעול בצורה חלקה עם Chrome או Firefox, אבל יכול להיות שיהיו בעיות ב-Safari.
3. פריסת המיקרו-שירות
אתם יכולים לבנות את המיקרו-שירות בכל טכנולוגיה ולפרוס אותו בכל מקום, כל עוד הוא נגיש לציבור ועומד בדרישות של Battle API. כדי להקל עליכם, נעזור לכם להתחיל משירות לדוגמה ולפרוס אותו ב-Cloud Run.
בחירת דוגמה כדי להתחיל
יש שתי דוגמאות של מיקרו-שירותים של קרבות שאפשר להתחיל מהן:
Java ו-Spring Boot | ||
Kotlin ו-Spring Boot |
אחרי שמחליטים באיזה קוד לדוגמה להתחיל, לוחצים על הלחצן 'פריסה ב-Cloud Run' שלמעלה. הפעולה הזו תפעיל את Cloud Shell (מסוף מבוסס-אינטרנט למכונה וירטואלית בענן) שבו המקור ישוכפל, ואז יורכב לחבילה שניתן לפרוס (קובץ אימג' של קונטיינר של Docker), שתועלה ל-Google Container Registry ואז תיפרס ב-Cloud Run.
כשמתבקשים, מציינים את האזור us-central1.
צילום המסך שלמטה מציג את הפלט של Cloud Shell עבור בנייה ופריסה של מיקרו-שירות

אימות הפעולה של המיקרו-שירות
ב-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.
4. בקשה להיכלל בזירה
כדי להיכלל בזירה, צריך לשלוח הודעה לערוץ Slack #3-sponsor-google-cloud עם השם, כתובת ה-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
עכשיו אפשר לערוך את המקור של המיקרו-שירות מתוך Cloud Shell. כדי לפתוח את Cloud Shell Editor מבוסס-האינטרנט, מריצים את הפקודה הבאה:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
יוצגו הוראות נוספות לביצוע שינויים.

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
אחרי שיוצרים את קובץ האימג' של הקונטיינר, משתמשים בפקודה 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. פיתוח באופן מקומי
כדי לעבוד על הפרויקט באופן מקומי באמצעות סביבת פיתוח משולבת משלכם, פועלים לפי השלבים הבאים:
- [ב-Cloud Shell] מכווצים את הדוגמה:
cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE
- [In Cloud Shell] מורידים את קובץ ה-ZIP למחשב:
cloudshell download-file cloudbowl-sample.zip
- [במחשב] מבטלים את הדחיסה של הקובץ, מבצעים את השינויים ובודקים אותם.
- [במחשב] מתקינים את ה-CLI של gcloud
- [במחשב] נכנסים ל-Google Cloud:
gcloud auth login
- [במחשב שלכם] מגדירים את משתני הסביבה
PROJECT_IDו-SAMPLEלאותם ערכים כמו ב-Cloud Shell. - [במכונה שלכם] משתמשים ב-Cloud Build כדי לבנות את הקונטיינר (מתיקיית הבסיס של הפרויקט):
gcloud alpha builds submit . --pack=image=gcr.io/$PROJECT_ID/$SAMPLE
- [במחשב] פורסים את הקונטיינר החדש:
gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated
7. מזל טוב
הצלחתם לבנות ולפרוס מיקרו-שירות שיכול להילחם במיקרו-שירותים אחרים. בהצלחה!
חזרה ללמידה
מסמכי עזר
8. שאלות נפוצות
למה המיקרו-שירות שלי לא מופיע בזירה?