Battle Jamón - A Microservices Battle Ground

1. مقدمه

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

Microservices Battle Arena

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

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

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

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

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

عرصه شامل همه بازیکنان برای یک نبرد معین است. کنفرانس Spring I/O Bridge عرصه خاص خود را خواهد داشت. هر بازیکن نشان دهنده یک میکروسرویس است که به اطراف حرکت می کند و به بازیکنان دیگر جامون می اندازد.

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

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

20628e6bd442bd11.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. وارد Google Cloud شوید

برای اینکه بتوانید میکروسرویس خود را در Cloud Run استقرار دهید، باید به Google Cloud وارد شوید. ما اعتباری به حساب شما اعمال می کنیم و نیازی به وارد کردن کارت اعتباری نخواهید داشت. معمولاً استفاده از یک حساب شخصی (مثلاً gmail.com) به جای حساب GSuite مشکل کمتری دارد زیرا گاهی اوقات مدیران GSuite از استفاده کاربران خود از برخی ویژگی های Google Cloud جلوگیری می کنند. همچنین، کنسول وب مورد استفاده ما باید با کروم یا فایرفاکس عالی کار کند اما ممکن است در سافاری مشکل داشته باشد.

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

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

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

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

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

منبع

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

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

برای حضور در عرصه، باید با نام خود، URL سرویس Cloud Run و در صورت تمایل نام کاربری GitHub خود را برای آواتار/عکس نمایه به کانال #battle-jamon ارسال کنید. هنگامی که ما اطلاعات را تأیید کردیم، بازیکن شما در عرصه ظاهر می شود.

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

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

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

اکنون که تصویر کانتینر شما ایجاد شده است، از دستور 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

اکنون عرصه از نسخه جدید شما استفاده خواهد کرد!

6. تبریک می گویم

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

به یادگیری ادامه دهید

اسناد مرجع

7. سوالات متداول

چرا میکروسرویس من در عرصه نمایش داده نمی شود؟

نبرد نهایی چگونه اجرا می شود؟

میدان قبل از نبرد نهایی چگونه کار می کند؟

چگونه برنده شوم؟

آیا می توانم به صورت محلی توسعه پیدا کنم؟