Battle Peach - A Microservices Battle Ground

1. مقدمة

تاريخ آخر تعديل: 12-02-2020

Microservices Battle Arena

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

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

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

طريقة العمل

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

تحتوي الساحة على جميع اللاعبين في معركة معيّنة. ستتوفّر ساحة واحدة لكل يوم من أيام مؤتمر DevNexus. يمثّل كل لاعب خدمة مصغّرة تتحرّك وتلقي الخوخ على اللاعبين الآخرين.

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

في ما يلي شكل الساحة مع ثلاثة لاعبين وهميين:

9e4775d13ff18d4d.png

مثال على ساحة Battle Peach

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

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

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

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

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. نشر الخدمة المصغّرة

يمكنك إنشاء خدمتك المصغّرة باستخدام أي تكنولوجيا ونشرها في أي مكان طالما أنّها متاحة للجميع وتتوافق مع 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.

طلب تضمين قناتك في "الساحة"

يجب ملء نموذج قصير ليتم تضمينك في الساحة. أصعب جزء هو تحديد الصورة التي تريد استخدامها لملفك الشخصي. يمكنك استخدام صورة GitHub أو صورة LinkedIn، أو سنختار لك أفاتارًا عشوائيًا. بعد مراجعة الطلب، سيظهر اللاعب في الساحة.

إجراء التغييرات ونشرها

قبل إجراء تغييرات، عليك إعداد بعض المعلومات في 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=java-springboot
export SAMPLE=kotlin-micronaut
export SAMPLE=scala-play

يمكنك الآن تعديل مصدر الخدمة المصغّرة من داخل Cloud Shell. لفتح محرِّر Cloud Shell المستند إلى الويب، نفِّذ الأمر التالي:

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- تهانينا

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

ما هي الخطوات التالية؟

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