Battle One - ساحة المعركة للخدمات الصغيرة

1. مقدمة

تاريخ آخر تعديل: 26/08/2020

Microservices Battle Arena

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

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

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

طريقة العمل

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

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

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

إليك كيف تبدو الساحة السابقة:

20628e6bd442bd11.png

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

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

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

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

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

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

للعمل مع مدير الساحة، يجب أن تستخدم خدمتك المصغّرة واجهة برمجة تطبيقات معيّنة للمشاركة في ساحة القتال. سيرسل مدير الساحة حالة الساحة الحالية عبر طلب 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) بدلاً من حساب G Suite لأن مشرفي GSuite في بعض الأحيان يمنعون المستخدمين من استخدام بعض ميزات Google Cloud. من المفترض أيضًا أن تعمل وحدة تحكُّم الويب التي سنستخدمها بشكل رائع مع Chrome أو Firefox، ولكن قد تواجه مشاكل في Safari.

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

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

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

يمكنك البدء من خلال نموذجين من الخدمات المصغَّرة التي تقدّم الخدمة الصغيرة:

Java حذاء الربيع

المصدر

النشر على Cloud Run

Kotlin حذاء الربيع

المصدر

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

4. طلب الانضمام إلى ساحة القتال

للانضمام إلى الساحة، يجب إرسال رسالة إلى قناة Slack رقم 3-sponsor-google-cloud مع اسمك وعنوان 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. يستخدم هذا الأمر حِزم Buildpacks لرصد نوع المشروع وتجميعه وإنشاء عنصر قابل للنشر (صورة حاوية صندوق الشحن).

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- التطوير محليًا

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

  1. [في Cloud Shell] متابعة العيّنة:

cd ~/cloudbowl-microservice-game/samples; zip -r cloudbowl-sample.zip $SAMPLE

  1. [في Cloud Shell] تنزيل الملف المضغوط على جهازك:

cloudshell download-file cloudbowl-sample.zip

  1. [على جهازك] عليك فك ضغط الملف ثم إجراء اختبار التغييرات
  2. [على جهازك] تثبيت واجهة سطر الأوامر gcloud
  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

  1. [على جهازك] نشر الحاوية الجديدة:

gcloud run deploy $SAMPLE --project=$PROJECT_ID --platform=managed --region=us-central1 --image=gcr.io/$PROJECT_ID/$SAMPLE --memory=512Mi --allow-unauthenticated

7. تهانينا

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

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

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

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

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