میکروسرویس Rainbow Rumpus

۱. مقدمه

آخرین به‌روزرسانی: 2021-05-06

میکروسرویس رینبو رامپوس

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

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

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

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

شما یک میکروسرویس با هر فناوری که می‌خواهید (یا از میان Go، Java، Kotlin، Scala، NodeJS یا Python انتخاب کنید) خواهید ساخت و سپس میکروسرویس را در Google Cloud مستقر خواهید کرد. پس از استقرار، URL میکروسرویس خود را به ما اطلاع می‌دهید و سپس ما آن را به عرصه اضافه خواهیم کرد.

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

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

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

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

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

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

کاتلین و بوت اسپرینگ

منبع

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

منبع

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

منبع

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

منبع

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

منبع

برو

منبع

Node.js و اکسپرس

منبع

پایتون و فلاسک

منبع

بعد از اینکه تصمیم گرفتید با کدام نمونه شروع کنید، روی دکمه "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 را ببینید.

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

برای پیوستن به Rainbow Rumpus، باید به یک آرنا بپیوندید. rainbowrumpus.dev را باز کنید و روی دکمه‌ی join در آرنا کلیک کنید تا URL میکروسرویس خود را وارد کنید.

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

قبل از اینکه بتوانید تغییراتی ایجاد کنید، باید در 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=kotlin-micronaut
export SAMPLE=kotlin-quarkus
export SAMPLE=kotlin-springboot
export SAMPLE=java-quarkus
export SAMPLE=java-springboot
export SAMPLE=go
export SAMPLE=nodejs
export SAMPLE=python

اکنون می‌توانید منبع میکروسرویس خود را از داخل Cloud Shell ویرایش کنید. برای باز کردن ویرایشگر تحت وب Cloud Shell، این دستور را اجرا کنید:

cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md

سپس دستورالعمل‌های بیشتری برای ایجاد تغییرات مشاهده خواهید کرد.

f910c9ef7b51c406.png

پوسته ابری با ویرایشگر و پروژه نمونه باز

پس از ذخیره تغییرات، برنامه را در Cloud Shell با استفاده از دستور موجود در فایل README.md اجرا کنید، اما ابتدا مطمئن شوید که در دایرکتوری نمونه صحیح در Cloud Shell هستید:

cd cloudbowl-microservice-game/samples/$SAMPLE

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

# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID
# and SAMPLE env vars. Otherwise, set them again.
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 \
          --allow-unauthenticated

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

۶. توسعه محلی (اختیاری)

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

  1. [در پوسته ابری] نمونه را زیپ کنید:
# Make sure the SAMPLE env var is still set. If not, re-set it.
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 \
  --project=$PROJECT_ID
  1. [روی دستگاه شما] کانتینر جدید را مستقر کنید:
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

۷. تحویل مداوم

راه اندازی SCM

گیت‌هاب را راه‌اندازی کنید تا بتوانید با تیم خود در میکروسرویس خود همکاری کنید:

  1. ورود به گیت‌هاب
  2. یک مخزن جدید ایجاد کنید
  3. اگر روی دستگاه محلی خود کار می‌کنید، می‌توانید از رابط خط فرمان git (CLI) یا برنامه رابط کاربری گرافیکی دسکتاپ GitHub (ویندوز یا مک) استفاده کنید. اگر از Cloud Shell استفاده می‌کنید، باید از git CLI استفاده کنید. برای دریافت کد میکروسرویس خود در GitHub، دستورالعمل‌های CLI یا GitHub Desktop را دنبال کنید.

کد خود را با git CLI وارد کنید

  1. دستورالعمل‌های مربوط به توکن دسترسی شخصی را از طریق گیت روی https دنبال کنید
  2. محدوده «مخزن» را انتخاب کنید
  3. راه‌اندازی گیت:
git config --global credential.helper \
  'cache --timeout=172800'
git config --global push.default current
git config --global user.email "YOUR@EMAIL"
git config --global user.name "YOUR NAME"
  1. متغیر‌های env را برای GitHub org و مخزن ( https://github.com/ORG/REPO ) تنظیم کنید.
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. کد خود را به مخزن جدید ارسال کنید
# Make sure the SAMPLE env var is still set. If not, re-set it.
cd ~/cloudbowl-microservice-game/samples/$SAMPLE
git init
git add .
git commit -m init
git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git
git branch -M main

# This will now ask for your GitHub username & password
# for the password use the personal access token
git push -u origin main
  1. بعد از اعمال هرگونه تغییر، می‌توانید تغییرات را کامیت کرده و به گیت‌هاب ارسال کنید:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

کد خود را با دسکتاپ GitHub وارد کنید

  1. کد خود را با استفاده از دستورالعمل‌های آزمایشگاه قبلی «توسعه محلی» دانلود کنید.
  2. دسکتاپ گیت‌هاب را نصب کنید ، آن را اجرا کنید و وارد شوید
  3. مخزن تازه ایجاد شده خود را کلون کنید

cf7f38c7c86a91cd.png

  1. فایل اکسپلورر خود را باز کنید و پروژه خود را در مخزن جدید کپی کنید.
  2. تغییرات خود را اعمال کنید

5f3c1552e30ad7c5.png

  1. شاخه اصلی خود را در گیت‌هاب منتشر کنید

راه‌اندازی استقرار مداوم Cloud Run

با راه‌اندازی SCM خود در GitHub، اکنون می‌توانید Continuous Delivery را راه‌اندازی کنید تا هر بار که commitهای جدید به شاخه main ارسال می‌شوند، Cloud Build به طور خودکار تغییرات را ایجاد و مستقر کند. همچنین می‌توانید Continuous Integration را اضافه کنید که تست‌های شما را قبل از استقرار اجرا می‌کند، اما این مرحله به عنوان یک تمرین برای شما باقی مانده است زیرا نمونه‌های آماده شامل هیچ تستی نیستند.

  1. در کنسول Cloud ، به سرویس Cloud Run خود بروید.
  2. روی دکمه‌ی «تنظیم استقرار مداوم» کلیک کنید
  3. با گیت‌هاب احراز هویت کنید و مخزن میکروسرویس خود را انتخاب کنید

a3b5692f178869bc.png

  1. مخزن گیت‌هاب خود را انتخاب کنید و شاخه را روی ^main$ تنظیم کنید.

۳۳۸f1c00f33d2f65.png

  1. نوع ساخت را برای استفاده از Buildpacks تنظیم کنید
  2. برای تنظیم استقرار مداوم، روی ذخیره کلیک کنید.

۸. مشاهده‌پذیری

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

معیارها

  1. سرویس خود را در لیست سرویس‌های Cloud Run پیدا کنید
  2. برای بازدید از داشبورد معیارهای آن، روی نام سرویس خود کلیک کنید

8491b8ec6bc5b4db.png

  1. روی منوی ⋮ مربوط به هر معیار کلیک کنید، سپس «مشاهده در مرورگر معیارها» را انتخاب کنید.
  2. اکنون می‌توانید معیارهای منابع، فیلترها، گروه‌بندی و سایر گزینه‌ها را تغییر دهید. برای مثال، می‌توانید میانگین تأخیر سرویس را برای همه سرویس‌ها مشاهده کنید :

f0d666d8f4221d45.png

سیاههها

خروجی STDOUT از سرویس‌ها به سیستم ثبت وقایع ابری گوگل ارسال می‌شود. می‌توانید از صفحه مدیریت سرویس Cloud Run به یک نمای اولیه از گزارش دسترسی داشته باشید، مانند:

40058a82c9299cff.png

در لاگ‌های Cloud Run می‌توانید بر اساس شدت فیلتر کنید و لاگ‌ها را فیلتر کنید. برای انعطاف‌پذیری بیشتر، کلیک کنید: ۱۸۶fdb0e6d39a6ca.png

هشدارها

  1. برای سرویس خود یک URL بررسی سلامت ایجاد کنید.
  2. برای Spring Boot، فقط وابستگی زیر را اضافه کنید:
org.springframework.boot:spring-boot-starter-actuator
  1. فایل src/main/resources/application.properties را ایجاد یا به‌روزرسانی کنید و بررسی فضای دیسک را غیرفعال کنید:
management.health.diskspace.enabled=false
  1. یک هشدار آپتایم ایجاد کنید که پروتکل، نام میزبان و مسیر شما را مشخص کند. برای Spring Boot مسیر به صورت /actuator/health است.
  2. هشدار را آزمایش کنید

۶۹۴۸d13b263bf573.png

  1. هشدار را ایجاد کنید

۹. تبریک

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

اسناد مرجع