۱. مقدمه
روشهای زیادی برای استقرار وبسایتها در Google Cloud وجود دارد که هر راهکار، ویژگیها، قابلیتها و سطوح کنترل متفاوتی را ارائه میدهد. Compute Engine سطح عمیقی از کنترل بر زیرساخت مورد استفاده برای اجرای یک وبسایت را ارائه میدهد، اما در مقایسه با راهکارهایی مانند Google Kubernetes Engine، App Engine یا سایر موارد، به مدیریت عملیاتی کمی بیشتری نیز نیاز دارد. با Compute Engine، شما کنترل دقیقی بر جنبههای زیرساخت، از جمله ماشینهای مجازی، متعادلکننده بار و موارد دیگر دارید. امروز، یک برنامه نمونه - وبسایت تجارت الکترونیک Fancy Store - را مستقر خواهید کرد تا نشان دهید که چگونه میتوان یک وبسایت را با Compute Engine مستقر و به راحتی مقیاسبندی کرد.
آنچه یاد خواهید گرفت
- نحوه ایجاد نمونههای موتور محاسباتی
- نحوه ایجاد الگوهای نمونه از نمونههای منبع
- نحوه ایجاد گروههای نمونه مدیریتشده
- نحوه تنظیم بررسیهای سلامت و بهبود خودکار
- نحوه ایجاد تعادل بار HTTP(S)
- نحوه ایجاد بررسیهای سلامت برای متعادلکنندههای بار
- نحوه استفاده از شبکه تحویل محتوا برای ذخیره سازی
در پایان این آزمایشگاه کد، شما نمونههایی (instance) درون گروههای نمونه مدیریتشده خواهید داشت تا بتوانید از قابلیتهایی مانند ترمیم خودکار، متعادلسازی بار، مقیاسبندی خودکار و بهروزرسانیهای لحظهای برای وبسایت خود استفاده کنید.
پیشنیازها
- برای آشنایی مقدماتی با مفاهیمی که در این آزمایشگاه استفاده خواهیم کرد، لطفاً مطالب زیر را بررسی کنید:
- به پلتفرم ابری گوگل خوش آمدید - ملزومات GCP
- شروع کار با موتور محاسبات ابری گوگل
- شروع کار با فضای ذخیرهسازی ابری گوگل
- شروع کار: پوسته ابری
۲. تنظیمات محیطی
تنظیم محیط خودتنظیم
- وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب Gmail یا Google Workspace ندارید، باید یکی ایجاد کنید .



شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژههای Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.
- در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .
اجرای این آزمایشگاه کد، اگر اصلاً هزینهای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعملهای بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش میدهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
فعال کردن API موتور محاسباتی
در مرحله بعد، باید رابط برنامهنویسی کاربردی موتور محاسبات (Compute Engine API) را فعال کنید. فعال کردن یک رابط برنامهنویسی کاربردی (API) مستلزم پذیرش شرایط خدمات و مسئولیت صدور صورتحساب برای API است.
در Cloud Shell، برای فعال کردن Compute Engine API، موارد زیر را اجرا کنید:
gcloud services enable compute.googleapis.com
پوسته ابری
اگرچه میتوان از راه دور و از طریق لپتاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از کلود شل ، یک محیط خط فرمان که در کلود اجرا میشود، استفاده خواهید کرد.
این ماشین مجازی مبتنی بر دبیان، تمام ابزارهای توسعه مورد نیاز شما را در خود جای داده است. این ماشین مجازی یک دایرکتوری خانگی ۵ گیگابایتی دائمی ارائه میدهد و در فضای ابری گوگل اجرا میشود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود میبخشد. این بدان معناست که تنها چیزی که برای این آزمایشگاه کد نیاز دارید یک مرورگر است (بله، روی کرومبوک هم کار میکند).
- برای فعال کردن Cloud Shell از کنسول Cloud، کافیست روی Activate Cloud Shell کلیک کنید.
(فقط چند لحظه طول میکشد تا آماده شود و به محیط متصل شود).


پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شدهاید و پروژه از قبل روی PROJECT_ID شما تنظیم شده است.
gcloud auth list
خروجی دستور
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
خروجی دستور
[core] project = <PROJECT_ID>
اگر به هر دلیلی پروژه تنظیم نشده باشد، کافیست دستور زیر را اجرا کنید:
gcloud config set project <PROJECT_ID>
به دنبال PROJECT_ID خود هستید؟ بررسی کنید که در مراحل راهاندازی از چه شناسهای استفاده کردهاید یا آن را در داشبورد Cloud Console جستجو کنید:

Cloud Shell همچنین برخی از متغیرهای محیطی را به طور پیشفرض تنظیم میکند که ممکن است هنگام اجرای دستورات بعدی مفید باشند.
echo $GOOGLE_CLOUD_PROJECT
خروجی دستور
<PROJECT_ID>
- در نهایت، منطقه پیشفرض و پیکربندی پروژه را تنظیم کنید.
gcloud config set compute/zone us-central1-f
شما میتوانید مناطق مختلفی را انتخاب کنید. برای اطلاعات بیشتر، به بخش مناطق و نواحی مراجعه کنید.
ایجاد سطل ذخیرهسازی ابری
ما قصد داریم از یک مخزن ذخیرهسازی ابری برای قرار دادن کد ساخته شده و همچنین اسکریپتهای راهاندازی خود استفاده کنیم. در Cloud Shell، دستور زیر را برای ایجاد یک مخزن ذخیرهسازی ابری جدید اجرا کنید:
gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID
۳. کپی کردن مخزن منبع
شما از وبسایت تجارت الکترونیک موجود Fancy Store که بر اساس مخزن یکپارچه به میکروسرویسها ساخته شده است، به عنوان پایه وبسایت خود استفاده خواهید کرد. کد منبع را از مخزن خود کپی خواهید کرد تا بتوانید روی جنبههای استقرار در Compute Engine تمرکز کنید. بعداً، یک بهروزرسانی کوچک روی کد انجام خواهید داد تا سادگی بهروزرسانیها در Compute Engine را نشان دهید.
شما میتوانید به طور خودکار مخزن کد را در پروژه کلون کنید، همچنین Cloud Shell و ویرایشگر کد داخلی را از طریق لینک زیر باز کنید: Open in Cloud Shell .
از طرف دیگر، میتوانید مخزن را به صورت دستی با دستورات زیر در داخل Cloud Shell کلون کنید:
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices
در خط فرمان Cloud Shell، نسخه اولیه کد را اجرا کنید تا برنامه به صورت محلی اجرا شود. ممکن است اجرای اسکریپت چند دقیقه طول بکشد.
./setup.sh
بررسیهای لازم را انجام دهید و برنامه خود را آزمایش کنید. دستور زیر را برای شروع وب سرور خود اجرا کنید:
cd microservices npm start
خروجی:
Products microservice listening on port 8082! Frontend microservice listening on port 8080! Orders microservice listening on port 8081!
با کلیک روی آیکون پیشنمایش وب و انتخاب «پیشنمایش روی پورت ۸۰۸۰»، پیشنمایش برنامه خود را مشاهده کنید.

این باید یک پنجره جدید باز کند که در آن میتوانید ظاهر فروشگاه فانتزی را در عمل ببینید!

میتوانید پس از مشاهده وبسایت، این پنجره را ببندید. برای متوقف کردن فرآیند وب سرور، Control+C (در مکینتاش Command+C ) را در پنجره ترمینال فشار دهید.
۴. ایجاد نمونههای موتور محاسباتی
حالا که محیط توسعهدهندهی فعال خود را دارید، میتوانید برخی از نمونههای Compute Engine را مستقر کنید! در مراحل زیر، شما:
- یک اسکریپت راهاندازی برای پیکربندی نمونهها ایجاد کنید.
- کد منبع را کپی کنید و آن را در فضای ذخیرهسازی ابری بارگذاری کنید.
- یک نمونه از Compute Engine را برای میزبانی میکروسرویسهای backend مستقر کنید.
- کد frontend را برای استفاده از نمونه میکروسرویسهای backend مجدداً پیکربندی کنید.
- یک نمونه از Compute Engine را برای میزبانی میکروسرویس frontend مستقر کنید.
- شبکه را طوری پیکربندی کنید که امکان ارتباط برقرار شود.
ایجاد اسکریپت راه اندازی
یک اسکریپت راهاندازی برای دستور دادن به نمونه که هر بار شروع به کار میکند، استفاده میشود. به این ترتیب، نمونهها به طور خودکار پیکربندی میشوند.
برای باز کردن ویرایشگر کد، روی آیکون مداد در نوار ابزار Cloud Shell کلیک کنید.
به پوشهی monolith-to-microservices بروید. روی File > New File کلیک کنید و فایلی به نام startup-script.sh ایجاد کنید.

در فایل جدید، کد زیر را قرار دهید، که برخی از آنها را پس از قرار دادن ویرایش خواهید کرد:
#!/bin/bash
# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &
# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc
# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm
# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/
# Install app dependencies.
cd /fancy-store/
npm install
# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app
# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF
supervisorctl reread
supervisorctl update
حالا، در ویرایشگر کد، متن [DEVSHELL_PROJECT_ID] را پیدا کنید و آن را با خروجی دستور زیر جایگزین کنید:
echo $DEVSHELL_PROJECT_ID
خروجی مثال:
my-gce-codelab-253520
خط کد موجود در startup-script.sh اکنون باید مشابه زیر باشد:
gs://fancy-store-my-gce-codelab-253520/monolith-to-microservices/microservices/* /fancy-store/
اسکریپت راه اندازی وظایف زیر را انجام می دهد:
- نصب عامل ثبت وقایع (Logging agent) که به طور خودکار گزارشها را از syslog جمعآوری میکند
- نصب Node.js و Supervisor که برنامه را به عنوان یک سرویس (daemon) اجرا میکند
- کپی کردن کد منبع برنامه از فضای ذخیرهسازی ابری و نصب وابستگیها
- پیکربندی سرپرست، که برنامه را اجرا میکند، اطمینان حاصل میکند که اگر برنامه به طور غیرمنتظرهای خارج شود یا توسط یک مدیر یا فرآیند متوقف شود، مجدداً راهاندازی میشود و stdout و stderr برنامه را برای جمعآوری توسط عامل ثبت وقایع به syslog ارسال میکند.
حالا فایل startup-script.sh ایجاد شده را در فضای ذخیرهسازی ابری که قبلاً ایجاد کردهاید، کپی کنید:
gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID
اکنون از طریق آدرس https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh قابل دسترسی است. [BUCKET_NAME] نام باکت ذخیرهسازی ابری را نشان میدهد. این باکت به طور پیشفرض فقط توسط کاربران مجاز و حسابهای سرویس قابل مشاهده خواهد بود، بنابراین از طریق مرورگر وب قابل دسترسی نخواهد بود. نمونههای Compute Engine به طور خودکار میتوانند از طریق حسابهای سرویس خود به آن دسترسی داشته باشند.
کد را در مخزن ذخیرهسازی ابری کپی کنید
وقتی نمونهها اجرا میشوند، کد را از مخزن ذخیرهسازی ابری دریافت میکنند تا بتوانید برخی از متغیرهای پیکربندی را در فایل '.env' کد ذخیره کنید.
کد کلون شده را در فضای ذخیرهسازی ابری کپی کنید:
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
نمونه backend را مستقر کنید
اولین نمونهای که مستقر خواهید کرد، نمونه بکاند خواهد بود که میکروسرویسهای سفارشات و محصولات را در خود جای میدهد.
دستور زیر را در Cloud Shell اجرا کنید تا یک نمونه f1-micro ایجاد شود که برای استفاده از اسکریپت راهاندازی قبلی شما پیکربندی شده و به عنوان یک نمونه backend برچسبگذاری شده است تا بتوانید بعداً قوانین فایروال خاصی را روی آن اعمال کنید:
gcloud compute instances create backend \
--machine-type=f1-micro \
--image=debian-9-stretch-v20190905 \
--image-project=debian-cloud \
--tags=backend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
پیکربندی اتصال به backend
قبل از اینکه frontend برنامه را مستقر کنید، باید پیکربندی را بهروزرسانی کنید تا به backend که مستقر کردهاید اشاره کند.
آدرس IP خارجی backend را بازیابی کنید، که میتوانید آن را از دستور زیر در تب EXTERNAL_IP برای نمونه backend مشاهده کنید:
gcloud compute instances list
خروجی مثال:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS backend us-central1-a f1-micro 10.128.0.2 34.68.223.88 RUNNING
در ویرایشگر کد Cloud Shell، به پوشه monolith-to-microservices > react-app بروید. از منوی Code Editor، گزینه View > Toggle Hidden Files را انتخاب کنید تا فایل .env را ببینید.

فایل .env را ویرایش کنید تا به آدرس IP خارجی backend اشاره کند. [BACKEND_ADDRESS] در زیر نشان دهنده آدرس IP خارجی نمونه backend است که از دستور قبلی در ابزار gcloud تعیین شده است.
REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products
فایل را ذخیره کنید.
از دستور زیر برای بازسازی react-app استفاده کنید که کد frontend را بهروزرسانی میکند:
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
کد برنامه را در فضای ذخیرهسازی ابری کپی کنید:
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
نمونه frontend را مستقر کنید
اکنون که کد پیکربندی شده است، میتوانید نمونه frontend را مستقر کنید. برای استقرار نمونه frontend با دستوری مشابه قبل، دستور زیر را اجرا کنید، اما این نمونه برای اهداف فایروال به عنوان "frontend" برچسب گذاری شده است.
gcloud compute instances create frontend \
--machine-type=f1-micro \
--image=debian-9-stretch-v20190905 \
--image-project=debian-cloud \
--tags=frontend \
--metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh
پیکربندی شبکه
قوانین فایروال را برای دسترسی به پورت ۸۰۸۰ برای frontend و پورتهای ۸۰۸۱ و ۸۰۸۲ برای backend ایجاد کنید. دستورات فایروال از تگهای اختصاص داده شده در هنگام ایجاد نمونه برای app استفاده میکنند.
gcloud compute firewall-rules create fw-fe \
--allow tcp:8080 \
--target-tags=frontend
gcloud compute firewall-rules create fw-be \
--allow tcp:8081-8082 \
--target-tags=backend
اکنون وبسایت باید قابل استفاده باشد. آدرس IP خارجی frontend را تعیین کنید. این آدرس را میتوان با جستجوی EXTERNAL_IP نمونه frontend تعیین کرد:
gcloud compute instances list
خروجی مثال:
NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS backend us-central1-a f1-micro 10.128.0.2 104.198.235.171 RUNNING frontend us-central1-a f1-micro 10.128.0.3 34.69.141.9 RUNNING
ممکن است چند دقیقه طول بکشد تا نمونه شروع به کار کند و پیکربندی شود. برای نظارت بر آمادگی برنامه، موارد زیر را اجرا کنید:
watch -n 5 curl http://[EXTERNAL_IP]:8080
زمانی که خروجی مشابه زیر را مشاهده کردید، وبسایت باید آماده باشد. برای لغو دستور watch، Control+C (در مکینتاش Command+C ) را در خط فرمان فشار دهید.

برای دسترسی به وبسایت، با یک تب جدید در مرورگر وب، به آدرس http://[FRONTEND_ADDRESS]:8080 مراجعه کنید، که در آن [FRONTEND_ADDRESS] همان EXTERNAL_IP تعیینشده در بالا است.
سعی کنید به صفحات محصولات و سفارشات بروید، که آنها هم باید کار کنند.

۵. ایجاد گروههای نمونه مدیریتشده
برای اینکه برنامه شما قابلیت مقیاسپذیری داشته باشد، گروههای نمونه مدیریتشده ایجاد میشوند و از نمونههای frontend و backend به عنوان قالبهای نمونه استفاده میکنند.
یک گروه نمونه مدیریتشده شامل نمونههای یکسانی است که میتوانید آنها را به عنوان یک موجودیت واحد در یک منطقه واحد مدیریت کنید. گروههای نمونه مدیریتشده با در دسترس نگهداشتن نمونههای شما، یعنی در حالت اجرا، دسترسیپذیری بالای برنامههای شما را حفظ میکنند. شما از گروههای نمونه مدیریتشده برای نمونههای frontend و backend خود استفاده خواهید کرد تا autohealing، load balancing، autoscaling و rolling updates را ارائه دهید.
ایجاد الگوی نمونه از نمونه منبع
قبل از اینکه بتوانید یک گروه نمونه مدیریتشده ایجاد کنید، باید یک الگوی نمونه ایجاد کنید که پایه و اساس گروه خواهد بود. الگوهای نمونه به شما امکان میدهند نوع دستگاه، تصویر دیسک بوت یا تصویر کانتینر، شبکه و سایر ویژگیهای نمونه را که هنگام ایجاد نمونههای جدید ماشین مجازی (VM) استفاده میکنید، تعریف کنید. میتوانید از الگوهای نمونه برای ایجاد نمونهها در یک گروه نمونه مدیریتشده یا حتی برای ایجاد نمونههای منفرد استفاده کنید.
برای ایجاد الگوی نمونه، از نمونههای موجودی که ایجاد کردهاید استفاده کنید.
اول، شما باید هر دو مورد را متوقف کنید.
gcloud compute instances stop frontend
gcloud compute instances stop backend
حالا، الگوی نمونه را از نمونههای منبع ایجاد کنید.
gcloud compute instance-templates create fancy-fe \
--source-instance=frontend
gcloud compute instance-templates create fancy-be \
--source-instance=backend
تأیید کنید که الگوهای نمونه ایجاد شدهاند:
gcloud compute instance-templates list
خروجی مثال:
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP fancy-be f1-micro 2019-09-12T07:52:57.544-07:00 fancy-fe f1-micro 2019-09-12T07:52:48.238-07:00
ایجاد گروه نمونه مدیریتشده
شما دو گروه نمونه مدیریتشده ایجاد خواهید کرد، یکی برای frontend و یکی برای backend. این گروههای نمونه مدیریتشده از قالبهای نمونه قبلاً ایجاد شده استفاده میکنند و برای شروع، هر کدام در هر گروه برای دو نمونه پیکربندی میشوند. نمونهها بهطور خودکار بر اساس "base-instance-name" مشخصشده با کاراکترهای تصادفی اضافهشده، نامگذاری میشوند.
gcloud compute instance-groups managed create fancy-fe-mig \
--base-instance-name fancy-fe \
--size 2 \
--template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
--base-instance-name fancy-be \
--size 2 \
--template fancy-be
برای برنامه شما، میکروسرویس frontend روی پورت ۸۰۸۰ اجرا میشود و میکروسرویسهای backend برای سفارشات روی پورت ۸۰۸۱ و برای محصولات روی پورت ۸۰۸۲ اجرا میشوند. با توجه به اینکه این پورتها غیراستاندارد هستند، شما پورتهای نامگذاری شده را برای شناسایی آنها مشخص خواهید کرد. پورتهای نامگذاری شده، ابردادههای جفت کلید:مقدار هستند که نام سرویس و پورتی را که روی آن اجرا میشود، نشان میدهند. پورتهای نامگذاری شده را میتوان به یک گروه نمونه اختصاص داد، که نشان میدهد سرویس در تمام نمونههای گروه در دسترس است. این اطلاعات توسط متعادلکننده بار استفاده میشود که بعداً آن را پیکربندی خواهید کرد.
gcloud compute instance-groups set-named-ports fancy-fe-mig \
--named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
--named-ports orders:8081,products:8082
پیکربندی خودکارسازی
برای بهبود در دسترس بودن خود برنامه و تأیید پاسخگویی آن، میتوانید یک سیاست بهبود خودکار برای گروههای نمونه مدیریتشده پیکربندی کنید.
یک سیاست خوددرمانی (autohealing) برای تأیید پاسخگویی یک برنامه مطابق انتظار، به یک بررسی سلامت مبتنی بر برنامه متکی است. بررسی پاسخگویی یک برنامه دقیقتر از تأیید صرف اینکه یک نمونه در حالت اجرا (RUNNING) است، که رفتار پیشفرض است، میباشد.
یک بررسی سلامت ایجاد کنید که اگر نمونه برای frontend و backend سه بار متوالی به عنوان ناسالم بازگشت، آن را تعمیر کند:
gcloud compute health-checks create http fancy-fe-hc \
--port 8080 \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
--port 8081 \
--request-path=/api/orders \
--check-interval 30s \
--healthy-threshold 1 \
--timeout 10s \
--unhealthy-threshold 3
یک قانون فایروال ایجاد کنید تا به کاوشگرهای بررسی سلامت اجازه دهد تا به میکروسرویسها روی پورتهای ۸۰۸۰ و ۸۰۸۱ متصل شوند:
gcloud compute firewall-rules create allow-health-check \
--allow tcp:8080-8081 \
--source-ranges 130.211.0.0/22,35.191.0.0/16 \
--network default
بررسیهای بهداشتی را در خدمات مربوطه اعمال کنید:
gcloud compute instance-groups managed update fancy-fe-mig \
--health-check fancy-fe-hc \
--initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
--health-check fancy-be-hc \
--initial-delay 300
با codelab ادامه دهید تا زمانی برای autohealing جهت نظارت بر نمونههای گروه فراهم شود. بعداً، یک شکست در آزمایش autohealing را شبیهسازی خواهید کرد.
۶. ایجاد متعادلکننده بار
برای تکمیل گروههای نمونه مدیریتشده، از متعادلسازی بار HTTP(S) برای ارائه ترافیک به میکروسرویسهای frontend و backend و از نگاشتها برای ارسال ترافیک به سرویسهای backend مناسب بر اساس قوانین مسیردهی استفاده خواهید کرد. این کار یک آدرس IP واحد و متعادلشده برای همه سرویسها را در معرض نمایش قرار میدهد.
برای اطلاعات بیشتر در مورد گزینههای متعادلسازی بار موجود در Google Cloud، به «مروری بر متعادلسازی بار» مراجعه کنید.
ایجاد تعادل بار HTTP(S)
گوگل کلود انواع مختلفی از متعادلسازی بار را ارائه میدهد، اما شما برای ترافیک خود از متعادلسازی بار HTTP(S) استفاده خواهید کرد. متعادلسازی بار HTTP(S) به شرح زیر ساختار یافته است:
- یک قانون ارسال، درخواستهای ورودی را به یک پروکسی HTTP هدف هدایت میکند.
- پروکسی HTTP هدف، هر درخواست را با یک نقشه URL بررسی میکند تا سرویس backend مناسب برای درخواست را تعیین کند.
- سرویس backend هر درخواست را بر اساس ظرفیت سرویسدهی، منطقه و سلامت نمونه backendهای متصل به آن، به یک backend مناسب هدایت میکند. سلامت هر نمونه backend با استفاده از بررسی سلامت HTTP تأیید میشود. اگر سرویس backend برای استفاده از بررسی سلامت HTTPS یا HTTP/2 پیکربندی شده باشد، درخواست در مسیر خود به نمونه backend رمزگذاری میشود.
- جلسات بین متعادلکننده بار و نمونه میتوانند از پروتکل HTTP، HTTPS یا HTTP/2 استفاده کنند. اگر از HTTPS یا HTTP/2 استفاده میکنید، هر نمونه در سرویسهای backend باید دارای گواهی SSL باشد.
بررسیهای سلامت ایجاد کنید که برای تعیین اینکه کدام نمونهها قادر به ارائه ترافیک برای هر سرویس هستند، استفاده شوند.
gcloud compute http-health-checks create fancy-fe-frontend-hc \ --request-path / \ --port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \ --request-path /api/orders \ --port 8081
gcloud compute http-health-checks create fancy-be-products-hc \ --request-path /api/products \ --port 8082
سرویسهای بکاندی ایجاد کنید که هدف ترافیک متعادلسازی بار باشند. سرویسهای بکاند از بررسیهای سلامت و پورتهای نامگذاریشدهای که ایجاد کردهاید استفاده خواهند کرد.
gcloud compute backend-services create fancy-fe-frontend \ --http-health-checks fancy-fe-frontend-hc \ --port-name frontend \ --global
gcloud compute backend-services create fancy-be-orders \ --http-health-checks fancy-be-orders-hc \ --port-name orders \ --global
gcloud compute backend-services create fancy-be-products \ --http-health-checks fancy-be-products-hc \ --port-name products \ --global
سرویسهای بکاند را اضافه کنید.
gcloud compute backend-services add-backend fancy-fe-frontend \ --instance-group fancy-fe-mig \ --instance-group-zone us-central1-f \ --global
gcloud compute backend-services add-backend fancy-be-orders \ --instance-group fancy-be-mig \ --instance-group-zone us-central1-f \ --global
gcloud compute backend-services add-backend fancy-be-products \ --instance-group fancy-be-mig \ --instance-group-zone us-central1-f \ --global
یک نقشه URL ایجاد کنید. نقشه URL مشخص میکند که کدام URLها به کدام سرویسهای backend هدایت میشوند.
gcloud compute url-maps create fancy-map \ --default-service fancy-fe-frontend
یک تطبیقدهنده مسیر ایجاد کنید تا مسیرهای /api/orders و /api/products به سرویسهای مربوطهشان هدایت شوند.
gcloud compute url-maps add-path-matcher fancy-map \ --default-service fancy-fe-frontend \ --path-matcher-name orders \ --path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"
پروکسیای ایجاد کنید که به نقشه URL ایجاد شده متصل شود.
gcloud compute target-http-proxies create fancy-proxy \ --url-map fancy-map
یک قانون ارسال سراسری ایجاد کنید که یک آدرس IP عمومی و پورت را به پروکسی مرتبط کند.
gcloud compute forwarding-rules create fancy-http-rule \ --global \ --target-http-proxy fancy-proxy \ --ports 80
پیکربندی را بهروزرسانی کنید
حالا که یک آدرس IP استاتیک جدید دارید، باید کد frontend را بهروزرسانی کنید تا به جای آدرس موقت که قبلاً به نمونه backend اشاره میکرد، به آدرس جدید اشاره کند.
در Cloud Shell، به پوشه react-app بروید، که فایل .env که پیکربندی را در خود جای داده است، در آن قرار دارد.
cd ~/monolith-to-microservices/react-app/
آدرس IP مربوط به متعادلکننده بار را پیدا کنید:
gcloud compute forwarding-rules list --global
خروجی مثال:
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET fancy-http-rule 34.102.237.51 TCP fancy-proxy
فایل .env را با ویرایشگر متن دلخواه خود (مانند GNU nano) ویرایش کنید تا به آدرس IP عمومی متعادلکننده بار اشاره کند. [LB_IP] نشان دهنده آدرس IP خارجی نمونه backend است.
REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products
react-app را بازسازی کنید، که کد frontend را بهروزرسانی میکند.
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
کد برنامه را در سطل GCS کپی کنید.
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
بهروزرسانی نمونههای فرانتاند
حالا میخواهید نمونههای frontend در گروه نمونههای مدیریتشده، کد جدید را دریافت کنند. نمونههای شما کد را در هنگام راهاندازی دریافت میکنند، بنابراین میتوانید دستور راهاندازی مجدد غلتان را صادر کنید.
gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
--max-unavailable 100%
وبسایت را آزمایش کنید
تقریباً 30 ثانیه پس از صدور دستور راهاندازی مجدد rolling-action صبر کنید تا به نمونهها زمان پردازش داده شود. سپس، وضعیت گروه نمونه مدیریتشده را بررسی کنید تا نمونهها در لیست ظاهر شوند.
watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig
پس از نمایش موارد در لیست، با فشار دادن Control+C ( Command+C در مکینتاش) از دستور watch خارج شوید.
تأیید کنید که سرویس به عنوان سالم فهرست شده است.
watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global
خروجی مثال:
---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
پس از نمایش موارد در لیست، با فشار دادن Control+C ( Command+C در مکینتاش) از دستور watch خارج شوید.
سپس برنامه از طریق http://[LB_IP] قابل دسترسی خواهد بود، که در آن [LB_IP] آدرس IP مشخص شده برای متعادل کننده بار است که با دستور زیر قابل یافتن است:
gcloud compute forwarding-rules list --global
۷. موتور محاسباتی مقیاسپذیر
تاکنون، شما دو گروه نمونه مدیریتشده ایجاد کردهاید که هر کدام دو نمونه دارند. پیکربندی کاملاً کاربردی است، اما صرف نظر از بار، یک پیکربندی استاتیک است. اکنون، یک سیاست مقیاسبندی خودکار بر اساس میزان استفاده ایجاد خواهید کرد تا به طور خودکار هر گروه نمونه مدیریتشده را مقیاسبندی کند.
تغییر اندازه خودکار بر اساس میزان استفاده
برای ایجاد سیاست مقیاسبندی خودکار، دستورات زیر را در Cloud Shell اجرا کنید. این دستورات یک مقیاسبندی خودکار روی گروههای نمونه مدیریتشده ایجاد میکنند که بهطور خودکار نمونههایی را اضافه میکند وقتی که متعادلکننده بار بالاتر از ۶۰٪ استفاده باشد و نمونههایی را حذف میکند وقتی که متعادلکننده بار کمتر از ۶۰٪ استفاده باشد.
gcloud compute instance-groups managed set-autoscaling \ fancy-fe-mig \ --max-num-replicas 5 \ --target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \ fancy-be-mig \ --max-num-replicas 5 \ --target-load-balancing-utilization 0.60
فعال کردن شبکه تحویل محتوا
یکی دیگر از ویژگیهایی که میتواند به مقیاسپذیری کمک کند، فعال کردن Cloud CDN - یک سرویس شبکه تحویل محتوا - برای ارائه ذخیرهسازی برای سرویس frontend است. برای انجام این کار، میتوانید دستور زیر را در سرویس frontend خود اجرا کنید:
gcloud compute backend-services update fancy-fe-frontend \
--enable-cdn --global
حالا، وقتی کاربری از متعادلکننده بار، محتوایی را درخواست میکند، درخواست به بخش frontend گوگل میرسد که ابتدا در حافظه پنهان Cloud CDN به دنبال پاسخی برای درخواست کاربر میگردد. اگر frontend پاسخی ذخیرهشده پیدا کند، آن را برای کاربر ارسال میکند. به این اتفاق، موفقیت در حافظه پنهان میگویند.
در غیر این صورت، اگر frontend نتواند پاسخ ذخیرهشدهای برای درخواست پیدا کند، مستقیماً درخواستی را به backend ارسال میکند. اگر پاسخ به آن درخواست قابل ذخیره باشد، frontend پاسخ را در حافظه پنهان Cloud CDN ذخیره میکند تا بتوان از حافظه پنهان برای درخواستهای بعدی استفاده کرد.
۸. وبسایت را بهروزرسانی کنید
بهروزرسانی الگوی نمونه
قالبهای نمونه موجود قابل ویرایش نیستند. با این حال، با توجه به اینکه نمونههای شما بدون وضعیت هستند و تمام پیکربندی از طریق اسکریپت راهاندازی انجام میشود، فقط در صورتی که بخواهید تصویر اصلی تنظیمات الگو را تغییر دهید، باید قالب نمونه را تغییر دهید. اکنون، یک تغییر ساده برای استفاده از یک نوع ماشین بزرگتر ایجاد کرده و آن را به بیرون فشار میدهید.
نمونهی frontend را که به عنوان پایهی الگوی نمونه عمل میکند، بهروزرسانی کنید. در طول بهروزرسانی، یک فایل روی نسخهی بهروزرسانیشدهی تصویر الگوی نمونه قرار میدهید، سپس الگوی نمونه را بهروزرسانی میکنید، الگوی جدید را منتشر میکنید و تأیید میکنید که فایل روی نمونههای گروه نمونهی مدیریتشده وجود دارد.
شما میتوانید نوع ماشین قالب نمونه خود را با تغییر از نوع ماشین استاندارد f1-micro به یک نوع ماشین سفارشی با 4 vCPU و 3840MiB RAM تغییر دهید.
در Cloud Shell، دستور زیر را برای تغییر نوع دستگاه نمونه frontend اجرا کنید:
gcloud compute instances set-machine-type frontend --machine-type custom-4-3840
الگوی نمونه جدید را ایجاد کنید:
gcloud compute instance-templates create fancy-fe-new \
--source-instance=frontend \
--source-instance-zone=us-central1-a
الگوی نمونهی بهروزرسانیشده را به گروه نمونهی مدیریتشده منتقل کنید:
gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
--version template=fancy-fe-new
وضعیت بهروزرسانی را پیگیری کنید:
watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig
زمانی که بیش از یک نمونه در وضعیت RUNNING داشتید، ACTION را روی None تنظیم کردید و INSTANCE_TEMPLATE را به عنوان نام الگوی جدید ( fancy-fe-new ) تنظیم کردید، نام یکی از ماشینهای فهرست شده را برای استفاده در دستور بعدی کپی کنید.
برای خروج از فرآیند نظارت، Control+S (در مکینتاش، Command+S ) را فشار دهید.
برای بررسی اینکه آیا ماشین مجازی از نوع ماشین جدید (custom-4-3840) استفاده میکند یا خیر، دستور زیر را اجرا کنید:
gcloud compute instances describe [VM_NAME] | grep machineType
خروجی مورد انتظار برای مثال:
machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840
ایجاد تغییرات در وبسایت
تیم بازاریابی شما از شما خواسته است که صفحه اصلی سایت خود را تغییر دهید. آنها فکر میکنند که این صفحه باید اطلاعات بیشتری در مورد شرکت شما و آنچه واقعاً میفروشید، ارائه دهد. در این بخش، متنی را به صفحه اصلی اضافه خواهید کرد تا تیم بازاریابی را خوشحال کنید! به نظر میرسد یکی از توسعهدهندگان شما قبلاً تغییرات را با نام فایل index.js.new ایجاد کرده است. میتوانید فایل را در index.js کپی کنید و تغییرات شما باید اعمال شود. برای ایجاد تغییرات مناسب، دستورالعملهای زیر را دنبال کنید.
دستورات زیر را اجرا کنید، فایل بهروزرسانیشده را در نام صحیح کپی کنید و سپس محتویات آن را برای تأیید تغییرات چاپ کنید:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
کد حاصل باید به این شکل باشد:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1
},
paper: {
width: "800px",
margin: "0 auto",
padding: theme.spacing(3, 2)
}
}));
export default function Home() {
const classes = useStyles();
return (
<div className={classes.root}>
<Paper className={classes.paper}>
<Typography variant="h5">
Fancy Fashion & Style Online
</Typography>
<br />
<Typography variant="body1">
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
Start shopping Fancy items now!
</Typography>
</Paper>
</div>
);
}
شما کامپوننتهای React را بهروزرسانی کردهاید، اما برای تولید فایلهای استاتیک باید برنامه React را بسازید. دستور زیر را اجرا کنید تا برنامه React ساخته شود و آن را در دایرکتوری عمومی monolith کپی کنید:
cd ~/monolith-to-microservices/react-app npm install && npm run-script build
سپس، کد را دوباره به مخزن ذخیرهسازی ابری خود ارسال کنید.
cd ~ rm -rf monolith-to-microservices/*/node_modules gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/
تغییرات را با بهروزرسانیهای غلتان اعمال کنید
اکنون میتوانید همه موارد را مجبور به راهاندازی مجدد کنید تا بهروزرسانی اعمال شود.
gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
--max-unavailable=100%
تقریباً 30 ثانیه پس از صدور دستور راهاندازی مجدد با عملکرد چرخشی صبر کنید تا به نمونهها زمان پردازش داده شود و سپس وضعیت گروه نمونه مدیریتشده را بررسی کنید تا نمونهها در لیست ظاهر شوند.
watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig
پس از نمایش موارد در لیست، با فشار دادن Control+S ( Command+S در مکینتاش) از دستور watch خارج شوید.
برای تأیید اینکه سرویس به عنوان سالم فهرست شده است، موارد زیر را اجرا کنید:
watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global
خروجی مثال:
---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
healthStatus:
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
ipAddress: 10.128.0.7
port: 8080
- healthState: HEALTHY
instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
ipAddress: 10.128.0.11
port: 8080
kind: compute#backendServiceGroupHealth
پس از نمایش موارد در لیست، با فشار دادن Control+S ( Command+S در مکینتاش) از دستور watch خارج شوید.
برای نامعتبر کردن محتوای ذخیره شده در حافظه پنهان (cache) در شبکه تحویل محتوا و اطمینان از نمایش محتوای جدید، دستور زیر را اجرا کنید:
gcloud compute url-maps invalidate-cdn-cache fancy-map \
--path "/*"
از طریق http://[LB_IP] به وبسایت بروید که در آن [LB_IP] آدرس IP مشخص شده برای متعادلکننده بار است که با دستور زیر قابل دسترسی است:
gcloud compute forwarding-rules list --global
اکنون باید تغییرات جدید وبسایت قابل مشاهده باشد.

شبیهسازی شکست
برای تأیید صحت عملکرد بررسی سلامت، وارد یک نمونه شوید و سرویسها را متوقف کنید. برای یافتن نام نمونه، دستور زیر را اجرا کنید:
gcloud compute instance-groups list-instances fancy-fe-mig
از آنجا، پوسته را به یکی از نمونهها، که INSTANCE_NAME یکی از نمونههای موجود در لیست است، ایمن کنید:
gcloud compute ssh [INSTANCE_NAME]
در این مورد، از supervisorctl برای متوقف کردن برنامه استفاده کنید.
sudo supervisorctl stop nodeapp; sudo killall node
از نمونه خارج شوید.
exit
عملیات تعمیر را رصد کنید.
watch -n 5 gcloud compute operations list \ --filter='operationType~compute.instances.repair.*'
به خروجی مثال زیر توجه کنید:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP repair-1568314034627-5925f90ee238d-fe645bf0-7becce15 compute.instances.repair.recreateInstance us-central1-a/instances/fancy-fe-1vqq 200 DONE 2019-09-12T11:47:14.627-07:00
پس از مشاهدهی تعمیر، برای خروج از دستور watch، Control+C (در مکینتاش Command+S ) را فشار دهید. در این مرحله، گروه نمونهی مدیریتشده، نمونه را برای تعمیر، مجدداً ایجاد میکند.
۹. تمیز کردن
پس از آماده شدن، سادهترین راه برای پاکسازی تمام فعالیتهای انجام شده، حذف پروژه است. حذف پروژه، متعادلکننده بار، نمونهها، قالبها و موارد دیگری را که در طول codelab ایجاد شدهاند، حذف میکند تا اطمینان حاصل شود که هیچ هزینه تکراری غیرمنتظرهای رخ نمیدهد. دستور زیر را در Cloud Shell اجرا کنید، که در آن PROJECT_ID شناسه کامل پروژه است، نه فقط نام پروژه.
gcloud projects delete [PROJECT_ID]
با وارد کردن "Y" در صورت درخواست، حذف را تأیید کنید.
۱۰. تبریک میگویم!
شما وبسایت خود را در Compute Engine مستقر، مقیاسپذیر و بهروزرسانی کردید. اکنون با Compute Engine، گروههای نمونه مدیریتشده، متعادلسازی بار و بررسیهای سلامت، تجربه دارید!