نبرد یک - زمین نبرد میکروسرویس

۱. مقدمه

آخرین به‌روزرسانی: 2020-08-26

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

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

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

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

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

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

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

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

در اینجا نحوه نمایش یک عرصه گذشته آمده است:

20628e6bd442bd11.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 ، یک سرویس ابری گوگل برای اجرای میکروسرویس‌ها و سایر برنامه‌ها، را بررسی کنیم.

۲. وارد گوگل کلود شوید

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

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

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

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

برای حضور در میدان مسابقه، باید پیامی به کانال Slack با شماره #3-sponsor-google-cloud ارسال کنید که شامل نام، آدرس اینترنتی سرویس Cloud Run و در صورت تمایل نام کاربری GitHub شما برای آواتار/عکس پروفایل باشد. پس از تأیید اطلاعات، بازیکن شما در میدان مسابقه ظاهر خواهد شد.

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

قبل از اینکه بتوانید تغییراتی ایجاد کنید، باید در 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 اجرا کنید:

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

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

۶. توسعه محلی

شما می‌توانید با دنبال کردن مراحل زیر، به صورت محلی و با استفاده از IDE خودتان روی پروژه‌تان کار کنید:

  1. [در پوسته ابری] نمونه را زیپ کنید:

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

۷. تبریک

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

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

اسناد مرجع

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

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