میزبانی و مقیاس‌بندی یک برنامه وب در Google Cloud با Compute Engine

۱. مقدمه

روش‌های زیادی برای استقرار وب‌سایت‌ها در Google Cloud وجود دارد که هر راهکار، ویژگی‌ها، قابلیت‌ها و سطوح کنترل متفاوتی را ارائه می‌دهد. Compute Engine سطح عمیقی از کنترل بر زیرساخت مورد استفاده برای اجرای یک وب‌سایت را ارائه می‌دهد، اما در مقایسه با راهکارهایی مانند Google Kubernetes Engine، App Engine یا سایر موارد، به مدیریت عملیاتی کمی بیشتری نیز نیاز دارد. با Compute Engine، شما کنترل دقیقی بر جنبه‌های زیرساخت، از جمله ماشین‌های مجازی، متعادل‌کننده بار و موارد دیگر دارید. امروز، یک برنامه نمونه - وب‌سایت تجارت الکترونیک Fancy Store - را مستقر خواهید کرد تا نشان دهید که چگونه می‌توان یک وب‌سایت را با Compute Engine مستقر و به راحتی مقیاس‌بندی کرد.

آنچه یاد خواهید گرفت

در پایان این آزمایشگاه کد، شما نمونه‌هایی (instance) درون گروه‌های نمونه مدیریت‌شده خواهید داشت تا بتوانید از قابلیت‌هایی مانند ترمیم خودکار، متعادل‌سازی بار، مقیاس‌بندی خودکار و به‌روزرسانی‌های لحظه‌ای برای وب‌سایت خود استفاده کنید.

پیش‌نیازها

۲. تنظیمات محیطی

تنظیم محیط خودتنظیم

  1. وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب Gmail یا Google Workspace ندارید، باید یکی ایجاد کنید .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعمل‌های بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش می‌دهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

فعال کردن API موتور محاسباتی

در مرحله بعد، باید رابط برنامه‌نویسی کاربردی موتور محاسبات (Compute Engine API) را فعال کنید. فعال کردن یک رابط برنامه‌نویسی کاربردی (API) مستلزم پذیرش شرایط خدمات و مسئولیت صدور صورتحساب برای API است.

در Cloud Shell، برای فعال کردن Compute Engine API، موارد زیر را اجرا کنید:

gcloud services enable compute.googleapis.com

پوسته ابری

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

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

  1. برای فعال کردن Cloud Shell از کنسول Cloud، کافیست روی Activate Cloud Shell کلیک کنید. a8460e837e9f5fda.png (فقط چند لحظه طول می‌کشد تا آماده شود و به محیط متصل شود).

b532b2f19ab85dda.png

اسکرین شات 2017-06-14 ساعت 10.13.43 PM.png

پس از اتصال به 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 جستجو کنید:

2485e00c1223af09.png

Cloud Shell همچنین برخی از متغیرهای محیطی را به طور پیش‌فرض تنظیم می‌کند که ممکن است هنگام اجرای دستورات بعدی مفید باشند.

echo $GOOGLE_CLOUD_PROJECT

خروجی دستور

<PROJECT_ID>
  1. در نهایت، منطقه پیش‌فرض و پیکربندی پروژه را تنظیم کنید.
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!

با کلیک روی آیکون پیش‌نمایش وب و انتخاب «پیش‌نمایش روی پورت ۸۰۸۰»، پیش‌نمایش برنامه خود را مشاهده کنید.

6634c06dd0b9172c.png

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

abf2ca314bf80d03.png

می‌توانید پس از مشاهده وب‌سایت، این پنجره را ببندید. برای متوقف کردن فرآیند وب سرور، Control+C (در مکینتاش Command+C ) را در پنجره ترمینال فشار دهید.

۴. ایجاد نمونه‌های موتور محاسباتی

حالا که محیط توسعه‌دهنده‌ی فعال خود را دارید، می‌توانید برخی از نمونه‌های Compute Engine را مستقر کنید! در مراحل زیر، شما:

  1. یک اسکریپت راه‌اندازی برای پیکربندی نمونه‌ها ایجاد کنید.
  2. کد منبع را کپی کنید و آن را در فضای ذخیره‌سازی ابری بارگذاری کنید.
  3. یک نمونه از Compute Engine را برای میزبانی میکروسرویس‌های backend مستقر کنید.
  4. کد frontend را برای استفاده از نمونه میکروسرویس‌های backend مجدداً پیکربندی کنید.
  5. یک نمونه از Compute Engine را برای میزبانی میکروسرویس frontend مستقر کنید.
  6. شبکه را طوری پیکربندی کنید که امکان ارتباط برقرار شود.

ایجاد اسکریپت راه اندازی

یک اسکریپت راه‌اندازی برای دستور دادن به نمونه که هر بار شروع به کار می‌کند، استفاده می‌شود. به این ترتیب، نمونه‌ها به طور خودکار پیکربندی می‌شوند.

برای باز کردن ویرایشگر کد، روی آیکون مداد در نوار ابزار Cloud Shell کلیک کنید.

به پوشه‌ی monolith-to-microservices بروید. روی File > New File کلیک کنید و فایلی به نام startup-script.sh ایجاد کنید.

439553c934139b82.png

در فایل جدید، کد زیر را قرار دهید، که برخی از آنها را پس از قرار دادن ویرایش خواهید کرد:

#!/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 را ببینید.

e7314ceda643e16.png

فایل .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 ) را در خط فرمان فشار دهید.

80dc8721dc08d7e4.png

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

سعی کنید به صفحات محصولات و سفارشات بروید، که آنها هم باید کار کنند.

a11460a1fffb07d8.png

۵. ایجاد گروه‌های نمونه مدیریت‌شده

برای اینکه برنامه شما قابلیت مقیاس‌پذیری داشته باشد، گروه‌های نمونه مدیریت‌شده ایجاد می‌شوند و از نمونه‌های 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) به شرح زیر ساختار یافته است:

  1. یک قانون ارسال، درخواست‌های ورودی را به یک پروکسی HTTP هدف هدایت می‌کند.
  2. پروکسی HTTP هدف، هر درخواست را با یک نقشه URL بررسی می‌کند تا سرویس backend مناسب برای درخواست را تعیین کند.
  3. سرویس backend هر درخواست را بر اساس ظرفیت سرویس‌دهی، منطقه و سلامت نمونه backendهای متصل به آن، به یک backend مناسب هدایت می‌کند. سلامت هر نمونه backend با استفاده از بررسی سلامت HTTP تأیید می‌شود. اگر سرویس backend برای استفاده از بررسی سلامت HTTPS یا HTTP/2 پیکربندی شده باشد، درخواست در مسیر خود به نمونه backend رمزگذاری می‌شود.
  4. جلسات بین متعادل‌کننده بار و نمونه می‌توانند از پروتکل 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 &amp; 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

اکنون باید تغییرات جدید وب‌سایت قابل مشاهده باشد.

b081b8e885bf0723.png

شبیه‌سازی شکست

برای تأیید صحت عملکرد بررسی سلامت، وارد یک نمونه شوید و سرویس‌ها را متوقف کنید. برای یافتن نام نمونه، دستور زیر را اجرا کنید:

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، گروه‌های نمونه مدیریت‌شده، متعادل‌سازی بار و بررسی‌های سلامت، تجربه دارید!