Battle Peach - A Microservices Battle Ground

۱. مقدمه

آخرین به‌روزرسانی: ۲۰۲۰-۰۲-۱۲

میدان نبرد میکروسرویس‌ها

تا حالا شده توی یه مسابقه گلوله برفی باشی که توش حرکت کنی و با شیطنت گلوله برفی به سمت بقیه پرتاب کنی؟ اگه نه، یه روزی امتحانش کن! اما حالا به جای ریسک کردن و آسیب دیدن فیزیکی، می‌تونی یه سرویس کوچیک و قابل دسترسی به شبکه (یه میکروسرویس) بسازی که تو یه نبرد حماسی با بقیه میکروسرویس‌ها شرکت کنه. و از اونجایی که ما اولین مسابقه میکروسرویس‌ها رو تو آتلانتا، جورجیا برگزار می‌کنیم، میکروسرویس‌های ما به جای گلوله برفی، هلو پرتاب می‌کنن.

شاید از خود بپرسید... اما یک میکروسرویس چگونه یک درخواست Peach را به سمت سایر میکروسرویس‌ها ارسال می‌کند؟ یک میکروسرویس می‌تواند درخواست‌های شبکه (معمولاً از طریق HTTP) را دریافت کرده و پاسخ‌ها را برگرداند. یک "مدیر آرنا" وجود دارد که وضعیت فعلی آرنا را برای میکروسرویس شما ارسال می‌کند و سپس میکروسرویس شما با دستوری که مشخص می‌کند چه کاری باید انجام دهد، پاسخ می‌دهد.

البته هدف برنده شدن است، اما در طول مسیر، شما در مورد ساخت و استقرار میکروسرویس‌ها در Google Cloud یاد خواهید گرفت.

چگونه کار می‌کند؟

شما یک میکروسرویس با هر فناوری که می‌خواهید (یا از میان جاوا، کاتلین یا اسکالا یکی را انتخاب کنید) خواهید ساخت و سپس میکروسرویس را در گوگل کلود مستقر خواهید کرد. پس از استقرار، فرمی را پر می‌کنید تا URL میکروسرویس خود را به ما اطلاع دهید و سپس ما آن را به عرصه اضافه خواهیم کرد.

این میدان شامل تمام بازیکنان برای یک نبرد مشخص است. برای کنفرانس DevNexus، برای هر روز یک میدان وجود خواهد داشت. هر بازیکن نماینده یک میکروسرویس است که در اطراف حرکت می‌کند و به سمت سایر بازیکنان هلو پرتاب می‌کند.

تقریباً هر ثانیه یک بار، مدیر میدان ما با میکروسرویس شما تماس می‌گیرد و وضعیت فعلی میدان (جایی که بازیکنان هستند) را ارسال می‌کند و میکروسرویس شما با دستوری برای انجام کار پاسخ می‌دهد. در میدان می‌توانید به جلو حرکت کنید، به چپ یا راست بپیچید یا یک هلو پرتاب کنید. یک هلو پرتاب شده تا سه خانه در جهتی که بازیکن رو به آن است، حرکت می‌کند. اگر یک هلو به بازیکن دیگری "برخورد" کند، پرتاب‌کننده یک امتیاز می‌گیرد و بازیکنی که به آن برخورد کرده یک امتیاز از دست می‌دهد. اندازه میدان به طور خودکار برای تعداد فعلی بازیکنان تنظیم می‌شود.

این هم نمای ورزشگاه با سه بازیکن گریم شده:

9e4775d13ff18d4d.png

مثال میدان نبرد پیچ

درگیری‌های چرخشی

در میدان مسابقه ممکن است چندین بازیکن سعی کنند اقدامات متناقضی انجام دهند. برای مثال، دو بازیکن ممکن است سعی کنند به یک فضای مشابه حرکت کنند. در صورت بروز تضاد، میکروسرویسی که سریع‌ترین زمان پاسخ را داشته باشد، برنده می‌شود.

تماشای نبرد

برای دیدن اینکه میکروسرویس شما در این نبرد چگونه عمل می‌کند، صحنه‌ی زنده را بررسی کنید !

API نبرد

برای همکاری با مدیر عرصه ما، میکروسرویس شما باید یک 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 شما باید کد وضعیت ۲۰۰ (OK) داشته باشد و متن پاسخ شامل حرکت بعدی شما باشد که به صورت یک کاراکتر بزرگ از یکی از موارد زیر کدگذاری شده است:

F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw

همین! بیایید پیاده‌سازی یک میکروسرویس روی Cloud Run ، یک سرویس ابری گوگل برای اجرای میکروسرویس‌ها و سایر برنامه‌ها، را بررسی کنیم.

۲. استقرار میکروسرویس شما

شما می‌توانید میکروسرویس خود را با هر فناوری بسازید و آن را در هر جایی مستقر کنید، البته تا زمانی که به صورت عمومی قابل دسترسی باشد و با Battle API مطابقت داشته باشد. برای آسان‌تر کردن کارها، می‌توانید با یک پروژه نمونه شروع کنید که فقط یک دستور تصادفی را انتخاب می‌کند.

نمونه خود را برای شروع انتخاب کنید

سه نمونه میکروسرویس نبرد وجود دارد که می‌توانید از آنها شروع کنید:

جاوا و بوت اسپرینگ

منبع

استقرار در Cloud Run

جاوا و کوارکوس

منبع

استقرار در Cloud Run

کاتلین و میکرونات

منبع

استقرار در Cloud Run

کاتلین و کوارکوس

منبع

استقرار در Cloud Run

چارچوب اسکالا و بازی

منبع

استقرار در Cloud Run

برو

منبع

استقرار در Cloud Run

بعد از اینکه تصمیم گرفتید با کدام نمونه شروع کنید، روی دکمه "Deploy on Cloud Run" در بالا کلیک کنید. این کار Cloud Shell (یک کنسول مبتنی بر وب برای یک ماشین مجازی در فضای ابری) را اجرا می‌کند که در آن منبع کلون می‌شود، سپس در یک بسته قابل استقرار (یک تصویر کانتینر داکر) ساخته می‌شود، که سپس در Google Container Registry آپلود می‌شود و سپس روی Cloud Run مستقر می‌شود.

وقتی از شما خواسته شد، منطقه us-central1 را مشخص کنید.

تصویر زیر خروجی Cloud Shell را برای ساخت و استقرار میکروسرویس نشان می‌دهد.

d88e40430706a32b.png

تأیید کنید که میکروسرویس کار می‌کند

در Cloud Shell می‌توانید درخواستی به میکروسرویس تازه مستقر شده خود ارسال کنید و YOUR_SERVICE_URL را با URL سرویس خود جایگزین کنید (که در Cloud Shell پس از خط "برنامه شما اکنون اینجا فعال است" قرار دارد):

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 را ببینید.

درخواست حضور در ورزشگاه

برای حضور در میدان مسابقه، باید فرم کوتاهی را پر کنید . سخت‌ترین بخش، تعیین تصویر پروفایل شماست. می‌توانید از تصویر گیت‌هاب، لینکدین خود استفاده کنید، یا ما فقط یک آواتار تصادفی برای شما انتخاب خواهیم کرد. پس از بررسی فرم ارسالی، بازیکن شما در میدان مسابقه ظاهر خواهد شد.

ایجاد و اعمال تغییرات

قبل از اینکه بتوانید تغییراتی ایجاد کنید، باید در Cloud Shell اطلاعاتی در مورد پروژه GCP و نمونه‌ای که استفاده کرده‌اید، تنظیم کنید. ابتدا پروژه‌های GCP خود را فهرست کنید:

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 با استفاده از دستور pack بسازید. این دستور از Buildpacks برای تشخیص نوع پروژه، کامپایل آن و ایجاد مصنوع قابل استقرار (یک تصویر کانتینر docker) استفاده می‌کند.

pack build gcr.io/$PROJECT_ID/$SAMPLE \
  --path cloudbowl-microservice-game/samples/$SAMPLE \
  --builder heroku/buildpacks

اکنون که تصویر کانتینر شما ایجاد شده است، از دستور docker (در Cloud Shell) برای قرار دادن تصویر کانتینر در رجیستری کانتینر گوگل استفاده کنید تا از طریق 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

حالا ورزشگاه از نسخه جدید شما استفاده خواهد کرد!

۳. تبریک می‌گویم

تبریک می‌گویم، شما با موفقیت یک میکروسرویس ساختید و مستقر کردید که می‌تواند با سایر میکروسرویس‌ها رقابت کند! موفق باشید!

بعدش چی؟

اسناد مرجع