خدمة مصغّرة لقوس قزح

1. مقدمة

تاريخ آخر تعديل: 2021-05-06

Microservice Rainbow Rumpus

هل سبق لك أن شاركت في معركة كرات الثلج حيث تتحرّك وتلقي كرات الثلج بشكل مرح على الآخرين؟ وإذا لم يسبق لك تجربة هذه الميزة، ننصحك بتجربتها في يوم ما. ولكن بدلاً من المخاطرة بالتعرض للضرب، يمكنك الآن إنشاء خدمة صغيرة يمكن الوصول إليها عبر الشبكة (خدمة مصغّرة) تشارك في معركة ملحمية ضد خدمات مصغّرة أخرى، وتطلق قوس قزح بدلاً من كرات الثلج.

قد تتساءل... ولكن كيف يمكن لخدمة مصغّرة "طرح" قوس قزح على خدمات مصغّرة أخرى؟ يمكن أن تتلقّى الخدمة المصغّرة طلبات من الشبكة (عادةً عبر HTTP) وتعرض ردودًا. هناك "مدير ساحة" يرسل إلى خدمتك المصغّرة الحالة الحالية للساحة، ثم تردّ خدمتك المصغّرة بأمر يحدّد ما يجب فعله.

بالطبع، الهدف هو الفوز، ولكن ستتعرّف خلال هذه العملية على كيفية إنشاء الخدمات المصغّرة ونشرها على Google Cloud.

طريقة العمل

ستنشئ خدمة مصغّرة باستخدام أي تكنولوجيا تريدها (أو تختار من بين حزم البدء في Go أو Java أو Kotlin أو Scala أو NodeJS أو Python)، ثم ستنشر الخدمة المصغّرة على Google Cloud. بعد نشر الخدمة، يُرجى إعلامنا بعنوان URL الخاص بالخدمة المصغّرة، وسنضيفها إلى ساحة المنافسة.

تحتوي الساحة على جميع اللاعبين في معركة معيّنة. ستتضمّن فعالية Rainbow Rumpus ساحات خاصة بها. يمثّل كل لاعب خدمة مصغّرة تتحرّك وتطلق قوس قزح على اللاعبين الآخرين.

سيطلب مدير ساحة القتال من خدمتك المصغّرة حوالي مرة واحدة في الثانية إرسال حالة ساحة القتال الحالية (مواقع اللاعبين)، وستردّ خدمتك المصغّرة بأمر بشأن ما يجب فعله. في ساحة القتال، يمكنك التقدّم للأمام أو الانعطاف إلى اليسار أو اليمين أو إطلاق قوس قزح. سيتنقّل قوس قزح لمسافة تصل إلى ثلاث مساحات في الاتجاه الذي يواجهه اللاعب. إذا "أصابت" قوس قزح لاعبًا آخر، يحصل الرامي على نقطة واحدة ويخسر اللاعب المصاب نقطة واحدة. يتم تعديل حجم الساحة تلقائيًا حسب عدد اللاعبين الحالي.

في ما يلي شكل ساحة افتراضية سابقة:

20628e6bd442bd11.png

ساحة معركة Example Battle One

النزاعات المتكرّرة

في ساحة المعركة، من المحتمل أن يحاول عدة لاعبين تنفيذ إجراءات متعارضة. على سبيل المثال، قد يحاول لاعبان الانتقال إلى المساحة نفسها. في حال حدوث تعارض، يفوز التطبيق المصغّر الذي يستجيب بشكل أسرع.

مشاهدة المعركة

لمعرفة مستوى أداء خدمتك المصغّرة في المنافسة، اطّلِع على ساحة المعركة المباشرة.

Battle 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

هذا كل ما في الأمر. لنستعرض معًا عملية نشر خدمة مصغّرة على Cloud Run، وهي إحدى خدمات Google Cloud لتشغيل الخدمات المصغّرة والتطبيقات الأخرى.

2. تسجيل الدخول إلى Google Cloud

لتتمكّن من نشر خدمتك المصغّرة على Cloud Run، عليك تسجيل الدخول إلى Google Cloud. سنضيف رصيدًا إلى حسابك ولن تحتاج إلى إدخال بطاقة ائتمان. عادةً ما يكون استخدام حساب شخصي (مثل gmail.com) أقل إشكالية من استخدام حساب GSuite لأنّ مشرفي GSuite يمنعون أحيانًا المستخدمين من استخدام ميزات معيّنة في Google Cloud. بالإضافة إلى ذلك، يجب أن تعمل وحدة تحكّم الويب التي سنستخدمها بشكل جيد مع Chrome أو Firefox، ولكن قد تواجه مشاكل في Safari.

3- نشر الخدمة المصغّرة

يمكنك إنشاء خدمتك المصغّرة باستخدام أي تكنولوجيا ونشرها في أي مكان طالما أنّها متاحة للجميع وتتوافق مع Battle API. ولكن لتسهيل الأمر، سنساعدك في البدء من خدمة نموذجية ونشرها على Cloud Run.

اختيار عيّنتك للبدء

تتوفّر العديد من الأمثلة على الخدمات المصغّرة الخاصة بالمعارك التي يمكنك البدء بها:

‫Kotlin وSpring Boot

المصدر

Kotlin وMicronaut

المصدر

Kotlin وQuarkus

المصدر

‫Java وSpring Boot

المصدر

Java وQuarkus

المصدر

Go

المصدر

Node.js وExpress

المصدر

Python وFlask

المصدر

بعد تحديد النموذج الذي تريد البدء به، انقر على الزر "نشر على 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.

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

ستظهر لك بعد ذلك تعليمات إضافية لإجراء التغييرات.

f910c9ef7b51c406.png

نافذة 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. يستخدم هذا الأمر حِزم الإنشاء لاكتشاف نوع المشروع وتجميعه وإنشاء العنصر القابل للنشر (صورة حاوية Docker).

# 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. التطوير محليًا (اختياري)

يمكنك العمل على مشروعك محليًا باستخدام بيئة التطوير المتكاملة الخاصة بك باتّباع الخطوات التالية:

  1. [في 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
  1. [في Cloud Shell] نزِّل ملف ZIP على جهازك:
cloudshell download-file cloudbowl-sample.zip
  1. [على جهازك] فك ضغط الملف ثم إجراء التغييرات واختبارها
  2. [على جهازك] ثبِّت gcloud CLI
  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 \
  --project=$PROJECT_ID
  1. [على جهازك] نفِّذ الحاوية الجديدة:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. التسليم المتواصل

إعداد SCM

اضبط GitHub لتتمكّن من التعاون مع فريقك في خدمتك المصغّرة:

  1. تسجيل الدخول إلى GitHub
  2. إنشاء مستودع جديد
  3. إذا كنت تعمل على جهازك المحلي، يمكنك استخدام واجهة سطر الأوامر (CLI) الخاصة بـ Git أو تطبيق واجهة المستخدم الرسومية (GUI) الخاص بـ GitHub Desktop (على Windows أو Mac). إذا كنت تستخدم Cloud Shell، عليك استخدام واجهة سطر الأوامر git. للحصول على رمز الخدمة المصغّرة على GitHub، اتّبِع تعليمات واجهة سطر الأوامر أو GitHub Desktop.

إرسال الرمز باستخدام واجهة سطر الأوامر git

  1. اتّبِع تعليمات استخدام git عبر https مع رمز دخول شخصي.
  2. اختيار نطاق "المستودع"
  3. إعداد 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"
  1. ضبط متغيرات البيئة لمؤسسة GitHub ومستودعها (https://github.com/ORG/REPO)
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. نقل الرمز إلى المستودع الجديد
# 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
  1. بعد إجراء أي تغييرات، يمكنك تنفيذها ونقلها إلى GitHub باتّباع الخطوات التالية:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

إرسال الرمز البرمجي باستخدام تطبيق GitHub على الكمبيوتر

  1. نزِّل الرمز باستخدام التعليمات الواردة في المختبر السابق "التطوير على الجهاز المحلي".
  2. تثبيت تطبيق GitHub Desktop وتشغيله وتسجيل الدخول
  3. استنساخ المستودع الذي تم إنشاؤه حديثًا

cf7f38c7c86a91cd.png

  1. افتح مستكشف الملفات وانسخ مشروعك إلى المستودع الجديد
  2. تنفيذ التغييرات

5f3c1552e30ad7c5.png

  1. نشر فرعك الرئيسي على GitHub

إعداد النشر المستمر في Cloud Run

بعد إعداد إدارة مصادر البرامج على GitHub، يمكنك الآن إعداد ميزة "التسليم المتواصل" لكي تنشئ خدمة Cloud Build التغييرات وتنفّذها تلقائيًا في كل مرة يتم فيها إرسال عمليات تثبيت جديدة إلى الفرع main. يمكنك أيضًا إضافة ميزة "التكامل المستمر" التي تُجري اختباراتك قبل النشر، ولكن تم ترك هذه الخطوة كتمرين لك لأنّ النماذج الجاهزة لا تحتوي على أي اختبارات.

  1. في Cloud Console، انتقِل إلى خدمة Cloud Run
  2. انقر على الزرّ "إعداد النشر المستمر"
  3. المصادقة باستخدام GitHub واختيار مستودع الخدمات المصغّرة

a3b5692f178869bc.png

  1. اختَر مستودع GitHub واضبط الفرع على: ^main$

338f1c00f33d2f65.png

  1. ضبط نوع الإصدار لاستخدام حِزم الإنشاء
  2. انقر على "حفظ" لإعداد "النشر المستمر".

8. إمكانية تتبّع البيانات

قد تحدث أعطال. تمنحنا إمكانية المراقبة القدرة على معرفة وقت حدوث ذلك وتشخيص السبب. تُظهر لنا المقاييس بيانات حول سلامة خدمتنا واستخدامها. تعرض السجلات المعلومات التي تم جمعها يدويًا من خدمتنا. تتيح لنا التنبيهات تلقّي إشعارات عند حدوث خطأ. لنستكشف كلّ منها بالتفصيل.

المقاييس

  1. ابحث عن خدمتك في قائمة خدمات Cloud Run.
  2. انقر على اسم خدمتك للانتقال إلى لوحة بيانات المقاييس الخاصة بها.

8491b8ec6bc5b4db.png

  1. انقر على قائمة ⋮ الخاصة بمقياس معيّن، ثمّ اختَر "عرض في "مستكشف المقاييس"".
  2. يمكنك الآن تغيير مقاييس الموارد والفلاتر والتجميع وخيارات أخرى. على سبيل المثال، يمكنك عرض متوسط وقت استجابة الخدمة لجميع الخدمات:

f0d666d8f4221d45.png

السجلّات

يتم إرسال نتائج STDOUT من الخدمات إلى نظام Google Cloud Logging. يمكنك الوصول إلى عرض سجلّ أساسي من صفحة مشرف خدمة Cloud Run، مثل:

40058a82c9299cff.png

في سجلّات Cloud Run، يمكنك الفلترة حسب مستوى الخطورة وفلترة السجلّات. للحصول على مزيد من المرونة، انقر على: 186fdb0e6d39a6ca.png

التنبيهات

  1. أنشئ عنوان URL لفحص حالة الخدمة.
  2. بالنسبة إلى Spring Boot، ما عليك سوى إضافة التبعية التالية:
org.springframework.boot:spring-boot-starter-actuator
  1. أنشئ أو عدِّل src/main/resources/application.properties وأوقِف عملية التحقّق من مساحة القرص:
management.health.diskspace.enabled=false
  1. أنشئ تنبيهًا بشأن وقت التشغيل، مع تحديد البروتوكول واسم المضيف والمسار. بالنسبة إلى Spring Boot، يكون المسار على النحو التالي: /actuator/health
  2. اختبار التنبيه

6948d13b263bf573.png

  1. إنشاء التنبيه

9- تهانينا

تهانينا، لقد أنشأت ونشرت بنجاح خدمة مصغّرة يمكنها التنافس مع الخدمات المصغّرة الأخرى. أتمنى لك التوفيق.

مستندات المراجع