1. مقدمة
تاريخ آخر تعديل: 2021-05-06
Microservice Rainbow Rumpus
هل سبق لك أن شاركت في معركة كرات الثلج حيث تتنقل وترمي كرات الثلج على الآخرين بشكل هزلي؟ وإذا لم يكن كذلك، يُرجى تجربتها يومًا ما! ولكن الآن بدلاً من التعرض لخطر الضرب الجسدي، يمكنك إنشاء خدمة صغيرة يمكن الوصول إليها عبر الشبكة (خدمة مصغّرة) ستشارك في معركة ملحمية ضد الخدمات المصغَّرة الأخرى، عن طريق إلقاء أقواس قزح بدلاً من كرات الثلج.
قد تتساءل... ولكن كيف "تبرز" الخدمة الصغيرة قوس قزح في الخدمات الدقيقة الأخرى؟ يمكن للخدمة المصغّرة تلقي طلبات الشبكة (عادةً عبر HTTP) وعرض الاستجابات. يوجد "مدير أرينا" سترسل الخدمة المصغّرة إلى الحالة الحالية للساحة وستستجيب الخدمة المصغّرة من خلال أمر يحدد ما يجب فعله.
لا شك في أنّ الهدف هو الفوز، ولكن خلال هذه الفترة ستتعرف على كيفية إنشاء خدمات مصغّرة ونشرها على Google Cloud.
طريقة العمل
سيكون عليك إنشاء خدمة مصغَّرة باستخدام أي تكنولوجيا تريدها (أو الاختيار من بين تطبيقات Go أو Java أو Kotlin أو Scala أو NodeJS أو Python) ثم نشر الخدمة المصغّرة على Google Cloud. وبعد نشرها، عليك أن تخبرنا بعنوان URL الخاص بخدمتك المصغَّرة، ثم سنضيفه إلى المنصة.
تتضمّن الساحة جميع اللاعبين في معركة معيّنة. سيكون لكلٍ من قوس القزح ساحات خاصة به. ويمثّل كل لاعب خدمة مصغّرة تتحرك وتطرح أقواس قزح على اللاعبين الآخرين.
مرة واحدة تقريبًا، سيتصل مدير الساحة بخدمتك المصغَّرة، ويرسل إليك حالة الساحة الحالية (حيث يكون اللاعبون)، وستستجيب الخدمة المصغَّرة بأمر لما يجب فعله. وفي ساحة القتال، يمكنك المضي قدمًا أو الانعطاف إلى اليسار أو اليمين أو رمي قوس قزح. سينتقل قوس قزح لما يصل إلى ثلاث مسافات في الاتجاه الذي يواجهه اللاعب. إذا "ضرب" قوس القزح ويحصل لاعب آخر على نقطة واحدة، ويفقد اللاعب نقطة. يتم تعديل حجم الساحة تلقائيًا للعدد الحالي للّاعبين.
إليك كيف تبدو الساحة السابقة:
مثال على ساحة Battle One
التعارضات المتجددة
من الممكن أن يحاول عدة لاعبين تنفيذ إجراءات متعارضة في ساحة القتال. على سبيل المثال، قد يحاول لاعبان الانتقال إلى المساحة نفسها. وفي حال حدوث تعارض، تفوز الخدمة المصغَّرة التي تتميز بأسرع وقت استجابة.
مشاهدة المعركة
لمعرفة مستوى أداء خدمتك الصغيرة في المعركة، انتقِل إلى ساحة البث المباشر.
واجهة برمجة تطبيقات المعركة
للعمل مع مدير الساحة، يجب أن تستخدم خدمتك المصغّرة واجهة برمجة تطبيقات معيّنة للمشاركة في ساحة القتال. سيرسل مدير الساحة حالة الساحة الحالية عبر طلب 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
هذا كل ما في الأمر! لنتعرّف على طريقة نشر خدمة مصغّرة على Cloud Run، وهي خدمة على Google Cloud لتشغيل الخدمات المصغَّرة والتطبيقات الأخرى.
2. تسجيل الدخول إلى Google Cloud
لتتمكن من نشر خدمتك المصغّرة على Cloud Run، عليك تسجيل الدخول إلى Google Cloud. سنضيف رصيدًا إلى حسابك ولن تحتاج إلى إدخال معلومات بطاقة الائتمان. عادةً ما يكون من المشكلة الأقل استخدام حساب شخصي (مثل gmail.com) بدلاً من حساب G Suite لأن مشرفي GSuite في بعض الأحيان يمنعون المستخدمين من استخدام بعض ميزات Google Cloud. من المفترض أيضًا أن تعمل وحدة تحكُّم الويب التي سنستخدمها بشكل رائع مع Chrome أو Firefox، ولكن قد تواجه مشاكل في Safari.
3- نشر الخدمة المصغّرة
يمكنك إنشاء خدمتك المصغّرة باستخدام أي تكنولوجيا ونشرها في أي مكان طالما يمكن الوصول إليها بشكل علني وتتوافق مع Battle API. ولتسهيل الأمر، سنساعدك على البدء من نموذج خدمة ونشرها على Cloud Run.
اختيار عيّنة للبدء بها
هناك العديد من نماذج الخدمات الدقيقة للمعارك التي يمكنك البدء بها:
Kotlin حذاء الربيع | ||
Kotlin Micronaut | ||
Kotlin كواركوس | ||
Java حذاء الربيع | ||
Java كواركوس | ||
البدء | ||
Node.js & سريعة | ||
Python قارورة |
بعد أن تقرر النموذج الذي تبدأ به، انقر على "نشر في Cloud Run" الزر أعلاه. سيؤدي ذلك إلى إطلاق Cloud Shell (وحدة تحكُّم مستنِدة إلى الويب لجهاز افتراضي في السحابة الإلكترونية) حيث سيتم استنساخ المصدر، ثم دمجه في حزمة قابلة للنشر (صورة حاوية Docker)، والتي يتم تحميلها بعد ذلك إلى Google Container Registry، ثم نشرها على Cloud Run.
حدِّد منطقة us-central1
عندما يُطلَب منك ذلك.
تعرض لقطة الشاشة أدناه مخرجات Cloud Shell لإنشاء الخدمات المصغّرة ونشرها.
التحقّق من عمل الخدمة المصغّرة
في Cloud Shell، يمكنك تقديم طلب إلى الخدمة المصغّرة التي تم نشرها حديثًا، مع استبدال YOUR_SERVICE_URL
بعنوان URL لخدمتك (الذي يظهر في Cloud Shell بعد سطر "Your تطبيقك متوفّر الآن هنا"):
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. طلب الانضمام إلى ساحة القتال
للانضمام إلى Rainbow Rumpus، عليك الانضمام إلى ساحة القتال. افتح rainbowrumpus.dev وانقر على "الانضمام" في ساحة ستقدِّم فيها عنوان URL للخدمة المصغّرة.
5- الصنع نشر التغييرات
قبل إجراء التغييرات، يجب إعداد بعض المعلومات في Cloud Shell حول مشروع Google Cloud Platform والعيّنة التي استخدمتها. يُرجى إدراج مشاريع Google Cloud Platform أولاً:
gcloud projects list
من المحتمل أن يكون لديك مشروع واحد فقط. انسخ PROJECT_ID
من العمود الأول والصقه في الأمر التالي (مع استبدال YOUR_PROJECT_ID
برقم تعريف المشروع الفعلي) لضبط متغيّر بيئة سنستخدمه في الأوامر اللاحقة:
export PROJECT_ID=YOUR_PROJECT_ID
اضبط الآن متغير بيئة آخر للعينة التي استخدمتها حتى نتمكن في الأوامر اللاحقة من تحديد اسم الدليل والخدمة الصحيحين:
# Copy and paste ONLY ONE of these export SAMPLE=kotlin-micronaut export SAMPLE=kotlin-quarkus export SAMPLE=kotlin-springboot export SAMPLE=java-quarkus export SAMPLE=java-springboot export SAMPLE=go export SAMPLE=nodejs export SAMPLE=python
يمكنك الآن تعديل مصدر الخدمة المصغّرة من داخل Cloud Shell. لفتح المحرِّر المستنِد إلى الويب في Cloud Shell، شغِّل الأمر التالي:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
ستطلع بعد ذلك على مزيد من التعليمات لإجراء التغييرات.
Cloud Shell مع المحرِّر الذي يحتوي على نموذج المشروع المفتوح
بعد حفظ التغييرات، ابدأ التطبيق في Cloud Shell باستخدام الأمر من الملف README.md
، ولكن تأكَّد أولاً من أنّك في نموذج الدليل الصحيح في Cloud Shell:
cd cloudbowl-microservice-game/samples/$SAMPLE
بعد تشغيل التطبيق، افتح علامة تبويب جديدة في 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 لرصد نوع المشروع وتجميعه وإنشاء عنصر قابل للنشر (صورة حاوية صندوق الشحن).
# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID # and SAMPLE env vars. Otherwise, set them again. 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 \ --allow-unauthenticated
ستستخدم الساحة الآن نسختك الجديدة.
6- التطوير محليًا (اختياري)
يمكنك العمل على مشروعك محليًا باستخدام بيئة التطوير المتكاملة (IDE) باتّباع الخطوات التالية:
- [في Cloud Shell] متابعة العيّنة:
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples zip -r cloudbowl-sample.zip $SAMPLE
- [في Cloud Shell] تنزيل الملف المضغوط على جهازك:
cloudshell download-file cloudbowl-sample.zip
- [على جهازك] عليك فك ضغط الملف ثم إجراء اختبار التغييرات
- [على جهازك] تثبيت واجهة سطر الأوامر gcloud
- [على جهازك] تسجيل الدخول إلى Google Cloud:
gcloud auth login
- [على جهازك] اضبط متغيّرات البيئة
PROJECT_ID
وSAMPLE
على القيم نفسها التي تظهر في Cloud Shell. - [على جهازك] يمكنك استخدام Cloud Build لإنشاء الحاوية (من دليل المشروع الجذر):
gcloud alpha builds submit . \ --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \ --project=$PROJECT_ID
- [على جهازك] نشر الحاوية الجديدة:
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
7. تسليم متواصل
إعداد "إدارة الشؤون التجارية والعقود"
قم بإعداد GitHub حتى تتمكن من التعاون مع فريقك في خدمتك المصغّرة:
- تسجيل الدخول إلى GitHub
- إنشاء مستودع جديد
- إذا كنت تعمل على جهازك المحلي، يمكنك إما استخدام واجهة سطر أوامر git (CLI) أو تطبيق GUI لسطح المكتب في GitHub (نظام التشغيل Windows أو Mac). في حال استخدام Cloud Shell، عليك استخدام git CLI. للحصول على رمز الخدمة المصغّرة على GitHub، يُرجى اتّباع تعليمات واجهة سطر الأوامر (CLI) أو تعليمات GitHub Desktop.
إرسال الرمز باستخدام git CLI
- اتّبِع خطوات git over https باستخدام تعليمات رمز الدخول الشخصي.
- اختيار "repo" النطاق
- عملية إعداد git:
git config --global credential.helper \ 'cache --timeout=172800' git config --global push.default current git config --global user.email "YOUR@EMAIL" git config --global user.name "YOUR NAME"
- ضبط بيئات البيئات لمؤسسة GitHub ومستودعها (
https://github.com/ORG/REPO
)
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- إرسال الرمز إلى المستودع الجديد
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples/$SAMPLE git init git add . git commit -m init git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git git branch -M main # This will now ask for your GitHub username & password # for the password use the personal access token git push -u origin main
- بعد إجراء أي تغييرات، يمكنك الالتزام بالتغييرات ودفعها إلى GitHub:
git add . git status git diff --staged git commit -am "my changes" git push
إرسال الرمز باستخدام GitHub لأجهزة الكمبيوتر المكتبي
- نزِّل الرمز باتّباع تعليمات الإصدار السابق من قسم "التطوير محليًا". ميزة اختبارية
- تثبيت GitHub Desktop وبدء تشغيله وتسجيل الدخول
- استنسِخ المستودع الذي أنشأته مؤخرًا
- افتح مستكشف الملفات وانسخ مشروعك إلى المستودع الجديد.
- تنفيذ التغييرات
- نشر الفرع الرئيسي الخاص بك في GitHub
إعداد النشر المتواصل في السحابة الإلكترونية
من خلال إعداد "إدارة الشؤون التجارية والعقود" على GitHub، يمكنك الآن إعداد ميزة "التسليم المستمر" حتى يتم تلقائيًا إنشاء التغييرات ونشرها في كل مرة يتم فيها إرسال التزامات جديدة إلى فرع main
. يمكنك أيضًا إضافة دمج متواصل لإجراء اختباراتك قبل النشر، ولكن تم ترك هذه الخطوة تمرينًا لك لأنّ العينات الجاهزة لا تحتوي على أي اختبارات.
- في Cloud Console، انتقِل إلى خدمة Cloud Run.
- انقر فوق "إعداد النشر المستمر" زر
- المصادقة مع GitHub واختيار مستودع الخدمة المصغَّرة
- اختَر مستودع GitHub واضبط الفرع على:
^main$
- يجب ضبط "نوع الإصدار" لاستخدام حِزم Buildpacks.
- انقر على "حفظ" لإعداد عملية النشر المستمر.
8. الملاحظة
تعطّل الأمور. تُمكّننا الملاحظة من معرفة وقت حدوث ذلك وتشخيص السبب. تعرض المقاييس بيانات حول سلامة خدمتنا واستخدامها. تعرض السجلات المعلومات التي يتم إجراؤها يدويًا والمنبعثة من خدمتنا. تسمح لنا التنبيهات بإعلامنا عند حدوث خطأ ما. دعنا نستكشف كل منها بشكل أكبر.
المقاييس
- ابحث عن خدمتك في قائمة خدمات تشغيل السحابة الإلكترونية
- انقر على اسم الخدمة للانتقال إلى لوحة بيانات المقاييس الخاصة بها.
- انقر على قائمة ⋮ الخاصة بالمقياس، ثم اختَر "عرض في مستكشف المقاييس"
- يمكنك الآن تغيير مقاييس الموارد والفلاتر والتجميع والخيارات الأخرى. على سبيل المثال، يمكنك عرض متوسط أوقات استجابة الخدمة لجميع الخدمات:
السجلّات
يتم إرسال مخرجات STDOUT من الخدمات إلى نظام تسجيل الدخول في Google Cloud. يمكنك الوصول إلى عرض السجل الأساسي من صفحة مشرف خدمة Cloud Run، مثل:
في سجلات تشغيل السحابة الإلكترونية، يمكنك الفلترة حسب درجة الخطورة وفلترة السجلات. لمزيد من المرونة، انقر على:
التنبيهات
- يجب إنشاء عنوان URL للتحقّق من الصحة للخدمة.
- بالنسبة إلى Spring Boot، ما عليك سوى إضافة التبعية التالية:
org.springframework.boot:spring-boot-starter-actuator
- يمكنك إنشاء
src/main/resources/application.properties
أو تحديثه وإيقاف التحقّق من مساحة القرص:
management.health.diskspace.enabled=false
- إنشاء تنبيه بشأن مدة التشغيل، مع تحديد البروتوكول واسم المضيف والمسار. بالنسبة إلى التمهيد الربيعي، يكون المسار:
/actuator/health
- اختبار التنبيه
- إنشاء التنبيه
9. تهانينا
تهانينا، لقد نجحت في إنشاء ونشر خدمة مصغّرة يمكنها منافسة الخدمات المصغّرة الأخرى. أتمنى لك التوفيق.