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

التعارضات المتجددة

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

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

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

واجهة برمجة تطبيقات المعركة

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

المصدر

النشر على Cloud Run

Java كواركوس

المصدر

النشر على Cloud Run

Kotlin Micronaut

المصدر

النشر على Cloud Run

Kotlin كواركوس

المصدر

النشر على Cloud Run

سكالا إطار عمل Play

المصدر

النشر على Cloud Run

البدء

المصدر

النشر على 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 تطبيقك متوفّر الآن هنا"):

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 لرصد نوع المشروع وتجميعه وإنشاء عنصر قابل للنشر (صورة حاوية صندوق الشحن).

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

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

الخطوات التالية

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