Battle Peach - A Microservices Battle Ground

1. مقدمه

آخرین به روز رسانی: 2020-02-12

Microservices Battle Arena

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

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

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

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

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

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

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

در اینجا چگونه به نظر می رسد عرصه با سه بازیکن ساخته شده است:

9e4775d13ff18d4d.png

به عنوان مثال میدان نبرد هلو

درگیری های گردان

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

تماشای نبرد

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

Battle API

برای کار با مدیر عرصه ما، میکروسرویس شما باید یک API خاص را برای شرکت در عرصه اجرا کند. مدیر عرصه، وضعیت فعلی عرصه را در یک پست HTTP به آدرس اینترنتی که به ما ارائه می‌دهید، با ساختار 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 مطابقت داشته باشد. برای آسان کردن کارها می توانید با یک پروژه نمونه شروع کنید که فقط یک دستور تصادفی را انتخاب می کند.

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

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

جاوا و بوت بهار

منبع

استقرار در Cloud Run

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

منبع

استقرار در Cloud Run

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

منبع

استقرار در Cloud Run

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

منبع

استقرار در Cloud Run

Scala & Play Framework

منبع

استقرار در Cloud Run

برو

منبع

استقرار در Cloud Run

بعد از اینکه تصمیم گرفتید با کدام نمونه شروع کنید، روی دکمه "Deploy on Cloud Run" در بالا کلیک کنید. با این کار، Cloud Shell (یک کنسول مبتنی بر وب برای یک ماشین مجازی در فضای ابری) راه‌اندازی می‌شود که در آن منبع شبیه‌سازی می‌شود، سپس در یک بسته قابل استقرار (یک تصویر کانتینر docker) ساخته می‌شود، که سپس در 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 را ببینید.

درخواست گنجاندن در آرنا

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

ایجاد و استقرار تغییرات

قبل از اینکه بتوانید تغییراتی ایجاد کنید، باید اطلاعاتی را در 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 با ویرایشگر با نمونه پروژه باز است

پس از ذخیره تغییرات خود، پروژه خود را در Cloud Shell با استفاده از دستور pack بسازید. این دستور از Buildpacks برای شناسایی نوع پروژه، کامپایل آن و ایجاد مصنوع قابل استقرار (تصویر کانتینر docker) استفاده می کند.

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

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

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

بعدش چی؟

اسناد مرجع