۱. مقدمه
آخرین بهروزرسانی: 2020-05-05
میدان نبرد میکروسرویسها
تا حالا شده توی یه مسابقه گلوله برفی باشید که توش حرکت کنید و با شوخی گلوله برفی به سمت بقیه پرتاب کنید؟ اگه نه، یه روزی امتحانش کنید! اما حالا به جای ریسک برخورد فیزیکی، میتونید یه سرویس کوچیک و قابل دسترسی به شبکه (یه میکروسرویس) بسازید که تو یه نبرد حماسی با میکروسرویسهای دیگه شرکت کنه. و از اونجایی که ما این نبرد میکروسرویسها رو در Spring I/O برگزار میکنیم، میکروسرویسهای ما به جای گلوله برفی، جامون پرتاب میکنن.
شاید از خود بپرسید... اما یک میکروسرویس چگونه یک jamón را به سمت سایر میکروسرویسها "پرتاب" میکند؟ یک میکروسرویس میتواند درخواستهای شبکه (معمولاً از طریق HTTP) را دریافت کرده و پاسخها را برگرداند. یک "مدیر آرنا" وجود دارد که وضعیت فعلی آرنا را برای میکروسرویس شما ارسال میکند و سپس میکروسرویس شما با دستوری که مشخص میکند چه کاری باید انجام دهد، پاسخ میدهد.
البته هدف برنده شدن است، اما در طول مسیر، شما در مورد ساخت و استقرار میکروسرویسها در Google Cloud یاد خواهید گرفت.
چگونه کار میکند؟
شما یک میکروسرویس با هر فناوری که میخواهید (یا از میان جاوا، کاتلین یا اسکالا یکی را انتخاب کنید) خواهید ساخت و سپس میکروسرویس را در گوگل کلود مستقر خواهید کرد. پس از استقرار، فرمی را پر میکنید تا URL میکروسرویس خود را به ما اطلاع دهید و سپس ما آن را به عرصه اضافه خواهیم کرد.
این میدان شامل تمام بازیکنان برای یک نبرد مشخص است. کنفرانس Spring I/O Bridge میدان مخصوص به خود را خواهد داشت. هر بازیکن نماینده یک میکروسرویس است که در اطراف حرکت میکند و به سمت سایر بازیکنان جامون پرتاب میکند.
تقریباً هر ثانیه یک بار، مدیر میدان ما با میکروسرویس شما تماس میگیرد و وضعیت فعلی میدان (جایی که بازیکنان هستند) را ارسال میکند و میکروسرویس شما با دستوری برای انجام کار پاسخ میدهد. در میدان میتوانید به جلو حرکت کنید، به چپ یا راست بپیچید یا یک جامون پرتاب کنید. یک جامون پرتاب شده تا سه خانه در جهتی که بازیکن رو به آن است، حرکت میکند. اگر یک جامون به بازیکن دیگری "برخورد" کند، پرتابکننده یک امتیاز میگیرد و بازیکنی که به آن برخورد کرده یک امتیاز از دست میدهد. اندازه میدان به طور خودکار برای تعداد فعلی بازیکنان تنظیم میشود.
این هم نمای ورزشگاه با سه بازیکن گریم شده:

مثال میدان نبرد ژامون
درگیریهای چرخشی
در میدان مسابقه ممکن است چندین بازیکن سعی کنند اقدامات متناقضی انجام دهند. برای مثال، دو بازیکن ممکن است سعی کنند به یک فضای مشابه حرکت کنند. در صورت بروز تضاد، میکروسرویسی که سریعترین زمان پاسخ را داشته باشد، برنده میشود.
تماشای نبرد
برای دیدن اینکه میکروسرویس شما در این نبرد چگونه عمل میکند، صحنهی زنده را بررسی کنید !
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 مستقر کنید.
نمونه خود را برای شروع انتخاب کنید
دو نمونه میکروسرویس نبرد وجود دارد که میتوانید از آنها شروع کنید:
جاوا و بوت اسپرینگ | ||
کاتلین و بوت اسپرینگ |
بعد از اینکه تصمیم گرفتید با کدام نمونه شروع کنید، روی دکمه "Deploy on Cloud Run" در بالا کلیک کنید. این کار Cloud Shell (یک کنسول مبتنی بر وب برای یک ماشین مجازی در فضای ابری) را اجرا میکند که در آن منبع کلون میشود، سپس در یک بسته قابل استقرار (یک تصویر کانتینر داکر) ساخته میشود، که سپس در Google Container Registry آپلود میشود و سپس روی Cloud Run مستقر میشود.
وقتی از شما خواسته شد، منطقه us-central1 را مشخص کنید.
تصویر زیر خروجی Cloud Shell را برای ساخت و استقرار میکروسرویس نشان میدهد.

تأیید کنید که میکروسرویس کار میکند
در 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 را ببینید.
۴. درخواست حضور در ورزشگاه
برای حضور در میدان مسابقه، باید پیامی به کانال #battle-jamon حاوی نام، آدرس اینترنتی سرویس 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
سپس دستورالعملهای بیشتری برای ایجاد تغییرات مشاهده خواهید کرد.

پوسته ابری به همراه ویرایشگر و پروژه نمونه باز
پس از ذخیره تغییرات، برنامه را در 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
حالا ورزشگاه از نسخه جدید شما استفاده خواهد کرد!
۶. تبریک
تبریک میگویم، شما با موفقیت یک میکروسرویس ساختید و مستقر کردید که میتواند با سایر میکروسرویسها رقابت کند! موفق باشید!
ادامه یادگیری
اسناد مرجع
۷. سوالات متداول
چرا میکروسرویس من در عرصه نمایش داده نمیشود؟
نبرد نهایی چگونه اجرا میشود؟
میدان نبرد قبل از نبرد نهایی چگونه کار میکند؟
چطور برنده شوم؟
آیا میتوانم به صورت محلی توسعه پیدا کنم؟