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

1. مقدمه

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

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

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

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

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

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

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

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

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

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

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

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

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

کاتلین و چکمه بهار

منبع

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

منبع

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

منبع

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

منبع

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

منبع

برو

منبع

Node.js & Express

منبع

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

منبع

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

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

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=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 با ویرایشگر با نمونه پروژه باز است

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

# 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) برای فشار دادن تصویر کانتینر به رجیستری کانتینر 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 \
          --allow-unauthenticated

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

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

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

  1. [در Cloud Shell] نمونه را فشرده کنید:
# 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 CLI را نصب کنید
  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

7. تحویل مستمر

راه اندازی SCM

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

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

کد خود را با git CLI فشار دهید

  1. git را از طریق https با دستورالعمل‌های رمز دسترسی شخصی دنبال کنید
  2. محدوده "repo" را انتخاب کنید
  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 vars برای سازمان GitHub و مخزن ( 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. پس از ایجاد هر گونه تغییر، می توانید تغییرات را به GitHub اعمال کرده و فشار دهید:
git add .
git status
git diff --staged
git commit -am "my changes"
git push

کد خود را با دسکتاپ GitHub فشار دهید

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

cf7f38c7c86a91cd.png

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

5f3c1552e30ad7c5.png

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

راه اندازی Cloud Run Continuous Deployment

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

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

a3b5692f178869bc.png

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

338f1c00f33d2f65.png

  1. Build Type را برای استفاده از Buildpacks تنظیم کنید
  2. برای راه اندازی Continuous Deployment روی Save کلیک کنید.

8. قابلیت مشاهده

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

معیارها

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

8491b8ec6bc5b4db.png

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

f0d666d8f4221d45.png

سیاههها

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

40058a82c9299cff.png

در گزارش‌های Cloud Run می‌توانید گزارش‌ها را بر اساس شدت فیلتر و فیلتر کنید. برای انعطاف بیشتر کلیک کنید: 186fdb0e6d39a6ca.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. هشدار را تست کنید

6948d13b263bf573.png

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

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

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

اسناد مرجع