لعبة Battle Jamón: A Microservices Battle Ground

1. مقدمة

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

Microservices Battle Arena

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

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

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

طريقة العمل

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

تحتوي الساحة على جميع اللاعبين في معركة معيّنة. سيكون لمؤتمر Spring I/O Bridge ساحة خاصة. يمثّل كل لاعب خدمة مصغّرة تتحرّك وتلقي شرائح لحم جامون على اللاعبين الآخرين.

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

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

20628e6bd442bd11.png

مثال على ساحة معارك Battle Jamón

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

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

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

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

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.

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

هناك عينتان من الخدمات المصغّرة الخاصة بالمعارك يمكنك البدء منهما:

Java وSpring Boot

المصدر

النشر على Cloud Run

‫Kotlin وSpring Boot

المصدر

النشر على 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.

4. طلب الإدراج في "الساحة"

لإدراجك في الساحة، عليك إرسال رسالة إلى القناة ‎#battle-jamon تتضمّن اسمك وعنوان URL لخدمة Cloud Run، ويمكنك أيضًا إدراج اسم مستخدم GitHub الخاص بك لاستخدامه كصورة رمزية أو صورة ملف شخصي. بعد التحقّق من صحة المعلومات، سيظهر اللاعب في الساحة.

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=java-springboot
export SAMPLE=kotlin-springboot

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

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

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

f910c9ef7b51c406.png

نافذة Cloud Shell مع المحرِّر والمشروع النموذجي مفتوحًا

بعد حفظ التغييرات، ابدأ تشغيل التطبيق في Cloud Shell:

cd cloudbowl-microservice-game/samples/$SAMPLE
./mvnw spring-boot:run

بعد تشغيل التطبيق، افتح علامة تبويب جديدة في 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).

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\
          --memory=512Mi\
          --allow-unauthenticated

ستستخدم الساحة الآن الإصدار الجديد.

6. تهانينا

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

مواصلة التعلّم

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

7. الأسئلة الشائعة

لماذا لا تظهر خدمتي المصغّرة في الساحة؟

كيف تتم إدارة المعركة النهائية؟

كيف تعمل الساحة قبل المعركة النهائية؟

كيف يمكنني الفوز؟

هل يمكنني التطوير محليًا؟