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

1. مقدمه

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

چیزی که یاد خواهید گرفت

در انتهای نرم افزار کد، نمونه هایی در داخل گروه های نمونه مدیریت شده برای ارائه به روز رسانی خودکار، تعادل بار، مقیاس خودکار و به روز رسانی های چرخشی برای وب سایت خود خواهید داشت.

پیش نیازها

2. تنظیم محیط

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

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

  1. در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورت‌حساب را در Cloud Console فعال کنید .

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

Compute Engine API را فعال کنید

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

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

gcloud services enable compute.googleapis.com

پوسته ابری

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Cloud Shell ، یک محیط خط فرمان در حال اجرا در Cloud استفاده خواهید کرد.

این ماشین مجازی مبتنی بر دبیان با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. این بدان معنی است که تمام چیزی که برای این کد لبه نیاز دارید یک مرورگر است (بله، روی کروم بوک کار می کند).

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

b532b2f19ab85dda.png

Screen Shot 2017-06-14 at 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، دستور زیر را برای ایجاد یک سطل Cloud Storage جدید اجرا کنید:

gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID

3. کلون کردن مخزن منبع

شما از وب‌سایت تجارت الکترونیک موجود Fancy Store بر اساس مخزن monolith-to-microservices به عنوان پایه وب سایت خود استفاده خواهید کرد. شما کد منبع را از مخزن خود کلون می کنید تا بتوانید روی جنبه های استقرار در 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!

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

6634c06dd0b9172c.png

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

abf2ca314bf80d03.png

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

4. نمونه های Compute Engine را ایجاد کنید

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

  1. یک اسکریپت راه اندازی برای پیکربندی نمونه ها ایجاد کنید.
  2. کد منبع را شبیه سازی کنید و آن را در فضای ذخیره سازی ابری آپلود کنید.
  3. یک نمونه موتور محاسباتی را برای میزبانی میکروسرویس های باطن اجرا کنید.
  4. برای استفاده از نمونه microservices، کد frontend را مجدداً پیکربندی کنید.
  5. یک نمونه Compute Engine را برای میزبانی microservice 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 که به طور خودکار گزارش ها را از syslog جمع آوری می کند
  • نصب Node.js و Supervisor که برنامه را به صورت دیمون اجرا می کند
  • شبیه سازی کد منبع برنامه از سطل فضای ذخیره سازی ابری و نصب وابستگی ها
  • پیکربندی Supervisor که برنامه را اجرا می‌کند، اطمینان حاصل می‌کند که در صورت خروج غیرمنتظره یا متوقف شدن برنامه توسط مدیر یا فرآیند، برنامه مجدداً راه‌اندازی می‌شود و stdout و stderr برنامه را به syslog ارسال می‌کند تا عامل Logging جمع‌آوری کند.

اکنون فایل startup-script.sh ایجاد شده را در سطل Cloud Storage که قبلا ایجاد کرده اید کپی کنید:

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' کد ذخیره کنید.

کد کلون شده را در سطل Cloud Storage کپی کنید:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

استقرار نمونه پشتیبان

اولین نمونه ای که شما مستقر خواهید کرد، نمونه پشتیبان است که سفارشات و ریزسرویس های محصولات را در خود جای می دهد.

دستور زیر را در Cloud Shell اجرا کنید تا یک نمونه f1-micro بسازید که برای استفاده از اسکریپت راه اندازی قبلی ایجاد شده شما پیکربندی شده و به عنوان نمونه پشتیبان برچسب گذاری شده است تا بتوانید قوانین فایروال خاصی را بعداً روی آن اعمال کنید:

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

پیکربندی اتصال به باطن

قبل از استقرار بخش جلویی برنامه، باید پیکربندی را به‌روزرسانی کنید تا به پشتیبانی که مستقر کرده‌اید اشاره کند.

آدرس IP خارجی بک‌اند را که می‌توانید از دستور زیر در تب EXTERNAL_IP برای نمونه پشتیبان مشاهده کنید، بازیابی کنید:

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 بروید. از منوی ویرایشگر کد، View > Toggle Hidden Files را انتخاب کنید تا فایل .env را ببینید.

e7314ceda643e16.png

فایل .env را ویرایش کنید تا به آدرس IP خارجی باطن اشاره کند. [BACKEND_ADDRESS] در زیر نشان‌دهنده آدرس IP خارجی نمونه پشتیبان است که از دستور قبلی در ابزار 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

کد برنامه را در سطل Cloud Storage کپی کنید:

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 

پیکربندی شبکه

قوانین فایروال را ایجاد کنید تا اجازه دسترسی به پورت 8080 را برای قسمت جلویی و پورت های 8081 و 8082 را برای باطن فراهم کنید. دستورات فایروال از تگ های اختصاص داده شده در هنگام ایجاد نمونه برای برنامه استفاده می کنند.

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 خارجی صفحه اصلی را تعیین کنید. آدرس را می توان با جستجوی 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 

هنگامی که خروجی مشابه زیر را مشاهده کردید، وب سایت باید آماده باشد. برای لغو فرمان ساعت، Control+C ( Command+C در مکینتاش) را در خط فرمان فشار دهید.

80dc8721dc08d7e4.png

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

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

a11460a1fffb07d8.png

5. گروه های نمونه مدیریت شده ایجاد کنید

برای اینکه برنامه شما مقیاس شود، گروه‌های نمونه مدیریت شده ایجاد می‌شوند و از نمونه‌های frontend و backend به عنوان الگوهای نمونه استفاده می‌کنند.

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

الگوی نمونه را از نمونه منبع ایجاد کنید

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

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

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

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

برای برنامه شما، microservice frontend روی پورت 8080 اجرا می شود و microservices backend برای سفارشات روی پورت 8081 و برای محصولات درگاه 8082 اجرا می شود. با توجه به اینکه این پورت ها غیر استاندارد هستند، شما پورت های نامگذاری شده را برای شناسایی آنها مشخص می کنید. پورت‌های نام‌گذاری‌شده متاداده‌های جفت کلید: ارزش هستند که نشان‌دهنده نام سرویس و پورتی هستند که روی آن اجرا می‌شود. پورت های نامگذاری شده را می توان به یک گروه نمونه اختصاص داد که نشان می دهد این سرویس در همه نمونه های گروه در دسترس است. این اطلاعات توسط بار متعادل کننده استفاده می شود که بعداً آن را پیکربندی خواهید کرد.

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

تنظیم خودکار درمان

برای بهبود در دسترس بودن خود برنامه و تأیید پاسخگویی آن، می توانید یک خط مشی درمان خودکار برای گروه های نمونه مدیریت شده پیکربندی کنید.

یک خط‌مشی درمان خودکار به بررسی سلامت مبتنی بر برنامه برای تأیید اینکه یک برنامه مطابق انتظار پاسخ می‌دهد، متکی است. بررسی اینکه یک برنامه پاسخ می‌دهد دقیق‌تر از تأیید اینکه یک نمونه در حالت RUNNING است، که رفتار پیش‌فرض است، دقیق‌تر است.

یک بررسی سلامتی ایجاد کنید که اگر نمونه سه بار متوالی به عنوان ناسالم برای قسمت جلویی و باطن بازگردد، آن را تعمیر کند:

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

یک قانون فایروال ایجاد کنید تا پروب های بررسی سلامت به میکروسرویس های پورت های 8080 و 8081 متصل شوند:

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

برای نظارت بر نمونه‌های موجود در گروه، با کد لبه ادامه دهید تا مقداری زمان برای بهبود خودکار در نظر گرفته شود. بعداً، یک شکست در آزمایش اتوهیلینگ را شبیه‌سازی خواهید کرد.

6. ایجاد تعادل بار

برای تکمیل گروه‌های نمونه مدیریت‌شده ما، از HTTP(S) Load Balancing برای ارائه ترافیک به میکروسرویس‌های frontend و backend و استفاده از نقشه‌برداری برای ارسال ترافیک به سرویس‌های backend مناسب بر اساس قوانین مسیریابی استفاده می‌کنید. این یک آدرس IP واحد و متعادل برای همه سرویس ها را نشان می دهد.

برای اطلاعات بیشتر درباره گزینه‌های متعادل‌سازی بار موجود در Google Cloud، به نمای کلی Load Balancing مراجعه کنید.

ایجاد تعادل بار HTTP(S).

Google Cloud انواع مختلفی از تعادل بار را ارائه می دهد، اما شما از HTTP(S) Load Balancing برای ترافیک خود استفاده خواهید کرد. ساختار بار HTTP(S) به صورت زیر است:

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

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 ثابت جدید دارید، باید کد موجود در قسمت جلویی را به‌روزرسانی کنید تا به آدرس جدید اشاره کند به جای آدرس زودگذری که قبلاً استفاده می‌شد و به نمونه پشتیبان اشاره می‌کرد.

در 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 را با ویرایشگر متن دلخواه خود (مانند نانو گنو) ویرایش کنید تا به آدرس IP عمومی متعادل کننده بار اشاره کند. [LB_IP] نشان دهنده آدرس IP خارجی نمونه پشتیبان است.

REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products

React-app را بازسازی کنید، که کد ظاهری را به روز می کند.

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 ثانیه صبر کنید تا به نمونه‌ها زمان داده شود تا پردازش شوند. سپس، وضعیت گروه نمونه مدیریت شده را بررسی کنید تا نمونه ها در لیست ظاهر شوند.

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_ADDRESS مشخص شده برای متعادل کننده بار است که با دستور زیر می توانید آن را پیدا کنید:

gcloud compute forwarding-rules list --global

7. Scaling Compute Engine

تاکنون دو گروه نمونه مدیریت شده ایجاد کرده اید که هر کدام دارای دو نمونه است. پیکربندی کاملاً کاربردی است، اما یک پیکربندی ایستا بدون در نظر گرفتن بار. اکنون، یک خط‌مشی مقیاس‌بندی خودکار بر اساس استفاده ایجاد می‌کنید تا به‌طور خودکار هر گروه نمونه مدیریت‌شده را مقیاس‌بندی کنید.

تغییر اندازه خودکار با استفاده

برای ایجاد خط مشی مقیاس خودکار، دستورات زیر را در 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

اکنون، زمانی که کاربر محتوا را از متعادل‌کننده بار درخواست می‌کند، درخواست به یک فرانت‌اند Google می‌رسد، که ابتدا در حافظه پنهان Cloud CDN برای پاسخ به درخواست کاربر جستجو می‌کند. اگر frontend یک پاسخ کش پیدا کند، پاسخ ذخیره شده را برای کاربر ارسال می کند. به آن ضربه کش می گویند.

در غیر این صورت، اگر frontend نتواند یک پاسخ ذخیره شده برای درخواست پیدا کند، آنگاه درخواستی را مستقیماً به باطن ارسال می کند. اگر پاسخ به آن درخواست قابل ذخیره‌سازی باشد، بخش frontend پاسخ را در حافظه پنهان Cloud CDN ذخیره می‌کند تا از کش برای درخواست‌های بعدی استفاده شود.

8. وب سایت را به روز کنید

در حال به روز رسانی الگوی نمونه

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

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

شما نوع ماشین الگوی نمونه خود را با تغییر از نوع ماشین استاندارد f1-micro به نوع ماشین سفارشی با 4 vCPU و 3840 MiB 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

هنگامی که بیش از 1 نمونه در وضعیت RUNNING دارید، ACTION روی هیچ ، و با تنظیم INSTANCE_TEMPLATE به عنوان نام الگوی جدید ( fancy-fe-new )، نام یکی از ماشین های فهرست شده را برای استفاده در دستور بعدی کپی کنید.

Control+S ( Command+S در مکینتاش) برای خروج از فرآیند ساعت.

موارد زیر را اجرا کنید تا ببینید آیا ماشین مجازی از نوع ماشین جدید (custom-4-3840) استفاده می‌کند، جایی که [VM_NAME] نمونه جدید ایجاد شده است:

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 خارج شوید.

برای بی اعتبار کردن محتوای حافظه پنهان در شبکه تحویل محتوا و اطمینان از نمایش محتوای جدید، موارد زیر را اجرا کنید:

gcloud compute url-maps invalidate-cdn-cache fancy-map \
    --path "/*"

وب سایت را از طریق http://[LB_IP] مرور کنید که در آن [LB_IP] IP_ADDRESS مشخص شده برای متعادل کننده بار است که با دستور زیر می توانید آن را پیدا کنید:

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

بعد از اینکه تعمیر متوجه شد، Control+C ( Command+S در مکینتاش) را برای خروج از فرمان ساعت انجام دهید. در این مرحله، گروه نمونه مدیریت شده، نمونه را دوباره ایجاد می کند تا آن را تعمیر کند.

9. پاکسازی کنید

پس از آماده شدن، ساده ترین راه برای پاکسازی تمام فعالیت های انجام شده، حذف پروژه است. حذف پروژه باعث حذف متعادل‌کننده بار، نمونه‌ها، الگوها و موارد دیگر می‌شود که در طول برنامه کد ایجاد شده‌اند تا اطمینان حاصل شود که هیچ هزینه‌های تکراری غیرمنتظره‌ای رخ نمی‌دهد. موارد زیر را در Cloud Shell اجرا کنید، جایی که PROJECT_ID شناسه کامل پروژه است، نه تنها نام پروژه.

gcloud projects delete [PROJECT_ID]

در صورت درخواست، با وارد کردن "Y" حذف را تأیید کنید.

10. تبریک می گویم!

شما وب سایت خود را در Compute Engine مستقر، مقیاس و به روز کردید. اکنون با Compute Engine، گروه‌های نمونه مدیریت‌شده، متعادل‌سازی بار و بررسی سلامت تجربه دارید!