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

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

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

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

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