استضافة تطبيق ويب وتوسيع نطاقه في Google Cloud باستخدام Compute Engine

1. مقدمة

تتوفّر طرق عديدة لنشر المواقع الإلكترونية على Google Cloud، ويقدّم كل حلّ ميزات وإمكانات ومستويات تحكّم مختلفة. توفّر خدمة Compute Engine مستوى تحكّم كبيرًا في البنية الأساسية المستخدَمة لتشغيل موقع إلكتروني، ولكنّها تتطلّب أيضًا إدارة تشغيلية أكبر قليلاً مقارنةً بحلول مثل Google Kubernetes Engine أو App Engine أو غيرها. باستخدام Compute Engine، يمكنك التحكّم بدقة في جوانب البنية الأساسية، بما في ذلك الأجهزة الافتراضية وموازنة الحمل وغير ذلك. اليوم، ستنشر تطبيقًا نموذجيًا، وهو موقع Fancy Store الإلكتروني للتجارة الإلكترونية، لتوضيح كيفية نشر موقع إلكتروني وتوسيع نطاقه بسهولة باستخدام Compute Engine.

أهداف الدورة التعليمية

في نهاية هذا الدرس التطبيقي حول الترميز، سيكون لديك آلات افتراضية داخل مجموعات مثيلات مُدارة لتوفير الإصلاح الذاتي، وموازنة الحمل، والقياس التلقائي، والتحديثات المتجدّدة لموقعك الإلكتروني.

المتطلبات الأساسية

2. إعداد البيئة

إعداد بيئة الاختبار الذاتي

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

96a9c957bc475304.pngb9a10ebdf5b5a448.pnga1e3c01a38fa61c2.png

تذكَّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.

لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن وُجدت تكلفة على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

تفعيل Compute Engine API

بعد ذلك، عليك تفعيل Compute Engine API. يتطلّب تفعيل واجهة برمجة التطبيقات قبول بنود الخدمة وتحمّل مسؤولية الفوترة الخاصة بواجهة برمجة التطبيقات.

في Cloud Shell، نفِّذ ما يلي لتفعيل Compute Engine API:

gcloud services enable compute.googleapis.com

Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي حول الترميز Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

يتم تحميل هذا الجهاز الظاهري المستند إلى Debian بجميع أدوات التطوير التي تحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يعني ذلك أنّ كل ما تحتاج إليه لهذا الدرس التطبيقي حول الترميز هو متصفّح (نعم، يمكن استخدامه على جهاز Chromebook).

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell a8460e837e9f5fda.png (يستغرق توفير البيئة والاتصال بها بضع لحظات فقط).

b532b2f19ab85dda.pngScreen 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 Storage

سنستخدم حزمة Cloud Storage لتخزين الرمز البرمجي الذي تم إنشاؤه، بالإضافة إلى نصوص بدء التشغيل. في Cloud Shell، نفِّذ الأمر التالي لإنشاء حزمة جديدة في Cloud Storage:

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

3- إنشاء نسخة طبق الأصل من مستودع الرمز المصدر

ستستخدم موقع Fancy Store الإلكتروني الحالي للتجارة الإلكترونية استنادًا إلى مستودع البيانات من البنية المتكاملة إلى الخدمات المصغّرة كأساس لموقعك الإلكتروني. ستنسخ الرمز المصدر من المستودع لتتمكّن من التركيز على جوانب النشر في Compute Engine. في وقت لاحق، ستجري تعديلاً بسيطًا على الرمز البرمجي لتوضيح سهولة إجراء التعديلات على Compute Engine.

يمكنك تلقائيًا استنساخ مستودع الرموز البرمجية في المشروع، بالإضافة إلى فتح Cloud Shell ومحرّر الرموز البرمجية المضمّن، من خلال الرابط التالي: الفتح في 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

من المفترض أن يؤدي ذلك إلى فتح نافذة جديدة يمكنك فيها رؤية الواجهة الأمامية لـ Fancy Store أثناء العمل.

abf2ca314bf80d03.png

يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني. لإيقاف عملية خادم الويب، اضغط على Control+C (Command+C على جهاز Macintosh) في نافذة الوحدة الطرفية.

4. إنشاء آلات Compute Engine الافتراضية

بعد إعداد بيئة المطوّرين، يمكنك الآن نشر بعض مثيلات Compute Engine. في الخطوات التالية، ستتمكّن مما يلي:

  1. أنشئ نصًا برمجيًا للتشغيل من أجل إعداد الآلات الافتراضية.
  2. استنساخ رمز المصدر وتحميله إلى Cloud Storage
  3. نشر مثيل Compute Engine لاستضافة الخدمات المصغّرة للخادم الخلفي
  4. أعِد ضبط رمز الواجهة الأمامية للاستفادة من مثيل الخدمات المصغّرة للواجهة الخلفية.
  5. نشر مثيل Compute Engine لاستضافة الخدمة المصغّرة للواجهة الأمامية
  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، الذي يشغّل التطبيق كبرنامج خفي
  • استنساخ رمز المصدر للتطبيق من حزمة Cloud Storage وتثبيت التبعيات
  • إعداد Supervisor، الذي يشغّل التطبيق، لضمان إعادة تشغيل التطبيق إذا تم إغلاقه بشكل غير متوقّع أو أوقفه مشرف أو عملية، وإرسال stdout وstderr الخاصين بالتطبيق إلى syslog ليجمعها عامل التسجيل

الآن، انسخ ملف 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] اسم حزمة Cloud Storage. لن يتمكّن من الاطّلاع على هذا المحتوى بشكل تلقائي سوى المستخدمين المصرّح لهم وحسابات الخدمة، لذا لن يكون بإمكانك الوصول إليه من خلال متصفّح الويب. ستتمكّن آلات Compute Engine الافتراضية تلقائيًا من الوصول إلى هذا المشروع من خلال حسابات الخدمة.

نسخ الرمز إلى حزمة Cloud Storage

عند تشغيل الآلات الافتراضية، يتم استرداد الرمز من حزمة Cloud Storage حتى تتمكّن من تخزين بعض متغيرات الإعداد في ملف ‎.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. من قائمة "محرّر الرموز"، اختَر عرض > تبديل الملفات المخفية للاطّلاع على الملف .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، ما سيؤدي إلى تعديل رمز الواجهة الأمامية:

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/

نشر مثيل الواجهة الأمامية

بعد إعداد الرمز، يمكنك نشر مثيل الواجهة الأمامية. نفِّذ ما يلي لنشر مثيل الواجهة الأمامية باستخدام أمر مشابه للأمر السابق، ولكن يتم تصنيف هذا المثيل على أنّه "الواجهة الأمامية" لأغراض جدار الحماية.

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 لمثيل الواجهة الأمامية:

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 على جهاز Macintosh) في موجّه الأوامر لإلغاء أمر الساعة.

80dc8721dc08d7e4.png

انتقِل إلى http://[FRONTEND_ADDRESS]:8080 باستخدام علامة تبويب متصفّح ويب جديدة للوصول إلى الموقع الإلكتروني، حيث يمثّل [FRONTEND_ADDRESS] عنوان EXTERNAL_IP الذي تم تحديده أعلاه.

جرِّب الانتقال إلى صفحتَي "المنتجات" و"الطلبات"، فمن المفترض أن تعمل هاتان الصفحتان أيضًا.

a11460a1fffb07d8.png

5- إنشاء مجموعات مثيلات مُدارة

للسماح بتوسيع نطاق تطبيقك، سيتم إنشاء مجموعات مثيلات مُدارة وستستخدم مثيلات الواجهة الأمامية والخلفية كنماذج مثيلات.

تحتوي مجموعة الأجهزة الافتراضية المُدارة على أجهزة افتراضية متطابقة يمكنك إدارتها ككيان واحد في منطقة واحدة. تحافظ مجموعات مثيلات مُدارة على التوفّر العالي لتطبيقاتك من خلال إبقاء مثيلاتك متاحة بشكل استباقي، أي في حالة RUNNING. ستستخدم مجموعات مثيلات مُدارة للواجهة الأمامية والخلفية من أجل توفير الإصلاح الذاتي وموازنة التحميل وتغيير الحجم التلقائي والتحديثات المتجدّدة.

إنشاء نموذج آلة افتراضية من الآلة الافتراضية المصدر

قبل إنشاء مجموعة مثيلات مُدارة، عليك إنشاء نموذج مثيل سيكون أساس المجموعة. تتيح لك نماذج الآلات الافتراضية تحديد نوع الجهاز أو صورة قرص التمهيد أو صورة الحاوية أو الشبكة أو غير ذلك من خصائص الآلة الافتراضية التي سيتم استخدامها عند إنشاء آلات افتراضية جديدة. يمكنك استخدام نماذج الآلات الافتراضية لإنشاء آلات افتراضية في مجموعة آلات افتراضية مُدارة أو حتى لإنشاء آلات افتراضية فردية.

لإنشاء نموذج الجهاز الافتراضي، استخدِم الأجهزة الافتراضية الحالية التي أنشأتها.

أولاً، يجب إيقاف كلتا النسختين.

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

إنشاء مجموعة مثيلات مُدارة

ستنشئ مجموعتَين من المثيلات المُدارة، واحدة للواجهة الأمامية والأخرى للخلفية. ستستخدم مجموعات المثيلات المُدارة هذه نماذج المثيلات التي تم إنشاؤها سابقًا وسيتم إعدادها لمثيلَين في كل مجموعة في البداية. سيتم تلقائيًا تسمية المثيلات استنادًا إلى "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

بالنسبة إلى تطبيقك، تعمل الخدمة المصغّرة للواجهة الأمامية على المنفذ 8080، وتعمل الخدمات المصغّرة للخلفية على المنفذ 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

تابِع استخدام codelab للسماح لعملية الإصلاح الذاتي بمراقبة الآلات الافتراضية في المجموعة لبعض الوقت. لاحقًا، ستُجري محاكاة لحدوث خطأ لاختبار ميزة الإصلاح الذاتي.

6. إنشاء جهاز موازنة الحمل

بالإضافة إلى مجموعات مثيلات مُدارة، ستستخدم موازنة تحميل HTTP(S) لعرض المحتوى على الخدمات المصغّرة للواجهة الأمامية والخلفية، واستخدام عمليات الربط لإرسال الزيارات إلى خدمات الخلفية المناسبة استنادًا إلى قواعد تحديد المسار. سيؤدي ذلك إلى عرض عنوان IP واحد ومتوازن التحميل لجميع الخدمات.

لمزيد من المعلومات حول خيارات موازنة الحمل المتاحة في Google Cloud، اطّلِع على نظرة عامة على موازنة الحمل.

إنشاء موازنة حمل HTTP(S)

توفّر Google Cloud العديد من الأنواع المختلفة لموازنة الحمل، ولكنّك ستستخدم موازنة الحمل لبروتوكول HTTP(S) لحركة البيانات. يتم تنظيم موازنة حمل HTTP(S) على النحو التالي:

  1. توجّه قاعدة إعادة التوجيه الطلبات الواردة إلى خادم وكيل HTTP مستهدف.
  2. يفحص خادم وكيل HTTP المستهدف كل طلب مقابل خريطة عناوين URL لتحديد خدمة الخلفية المناسبة للطلب.
  3. توجّه خدمة الخلفية كل طلب إلى خلفية مناسبة استنادًا إلى سعة العرض والمنطقة وحالة الجهاز الافتراضي للخلفيات المرفقة. يتم التحقّق من سلامة كل مثيل للخادم الخلفي باستخدام فحص سلامة HTTP. إذا تم ضبط خدمة الخلفية لاستخدام فحص سلامة HTTPS أو HTTP/2، سيتم تشفير الطلب أثناء توجيهه إلى مثيل الخلفية.
  4. يمكن أن تستخدم الجلسات بين موازنة الحمل والمثيل بروتوكول HTTP أو HTTPS أو HTTP/2. إذا كنت تستخدم HTTPS أو HTTP/2، يجب أن يكون لكل مثيل في الخدمات الخلفية شهادة طبقة المقابس الآمنة.

أنشئ فحوصات سلامة سيتم استخدامها لتحديد المثيلات القادرة على عرض عدد الزيارات لكل خدمة.

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 باستخدام محرّر النصوص المفضّل لديك (مثل GNU nano) للإشارة إلى عنوان 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/

تعديل مثيلات الواجهة الأمامية

الآن، تريد أن تجلب مثيلات الواجهة الأمامية في مجموعة المثيلات المُدارة الرمز الجديد. تسحب مثيلاتك الرمز عند بدء التشغيل، لذا يمكنك إصدار أمر بإعادة التشغيل المتكرّرة.

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 على جهاز Macintosh).

تأكَّد من أنّ الخدمة مُدرَجة على أنّها سليمة.

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

بعد ظهور العناصر في القائمة، اخرج من الأمر watch بالضغط على Control+C (Command+C على جهاز Macintosh).

يمكن بعد ذلك الوصول إلى التطبيق من خلال http://[LB_IP]، حيث [LB_IP] هو IP_ADDRESS المحدّد لموازنة التحميل، ويمكن العثور عليه باستخدام الأمر التالي:

gcloud compute forwarding-rules list --global

7. توسيع نطاق Compute Engine

حتى الآن، أنشأت مجموعتَي مثيلات مُدارة، تحتوي كل منهما على مثيلَين. الإعدادات تعمل بشكل كامل، ولكنها ثابتة بغض النظر عن الحمل. الآن، عليك إنشاء سياسة قياس تلقائي استنادًا إلى الاستخدام لتغيير حجم كل مجموعة آلات افتراضية مُدارة تلقائيًا.

تغيير الحجم تلقائيًا حسب الاستخدام

لإنشاء سياسة التوسّع التلقائي، نفِّذ الأوامر التالية في Cloud Shell. سيتم إنشاء أداة تغيير الحجم التلقائي في مجموعات المثيلات المُدارة التي تضيف المثيلات تلقائيًا عندما يكون موازن التحميل أعلى من% 60 من الاستخدام وتزيل المثيلات عندما يكون موازن التحميل أقل من% 60 من الاستخدام.

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، وهي خدمة شبكة توصيل المحتوى، لتوفير التخزين المؤقت لخدمة الواجهة الأمامية. لإجراء ذلك، يمكنك تنفيذ الأمر التالي على خدمة الواجهة الأمامية:

gcloud compute backend-services update fancy-fe-frontend \
    --enable-cdn --global

عندما يطلب المستخدم محتوًى من موازن التحميل، يصل الطلب إلى واجهة أمامية من Google، والتي تبحث أولاً في ذاكرة التخزين المؤقت لشبكة Cloud CDN عن ردّ على طلب المستخدم. إذا عثرت الواجهة الأمامية على استجابة مخبّأة، سترسلها إلى المستخدم. ويُطلق على ذلك اسم "نتيجة ذاكرة التخزين المؤقت".

في حال عدم عثور الواجهة الأمامية على ردّ مخزّن مؤقتًا للطلب، يتم إرسال الطلب مباشرةً إلى الواجهة الخلفية. إذا كانت الاستجابة لهذا الطلب قابلة للتخزين مؤقتًا، يخزّن الواجهة الأمامية الاستجابة في ذاكرة التخزين المؤقت لشبكة Cloud CDN كي يمكن استخدام ذاكرة التخزين المؤقت للطلبات اللاحقة.

8. تعديل الموقع الإلكتروني

تعديل نموذج الآلة الافتراضية

لا يمكن تعديل نماذج الآلات الافتراضية الحالية. ومع ذلك، بما أنّ مثيلاتك لا تحتفظ بأي حالة ويتم إجراء جميع عمليات الإعداد من خلال نص برمجي للتشغيل، ما عليك سوى تغيير نموذج الآلة الافتراضية إذا أردت تغيير الصورة الأساسية لإعدادات النموذج نفسها. الآن، ستجري تغييرًا بسيطًا لاستخدام نوع جهاز أكبر وتطرح هذا التغيير.

عدِّل مثيل الواجهة الأمامية الذي يشكّل أساس نموذج المثيل. أثناء عملية التحديث، ستضع ملفًا على الإصدار المعدَّل من صورة نموذج الآلة الافتراضية، ثم ستعدِّل نموذج الآلة الافتراضية، وتطرح النموذج الجديد، وتتأكّد من أنّ الملف متوفّر على مثيلات مجموعة الآلات الافتراضية المُدارة.

عليك تعديل نوع الجهاز في نموذج الجهاز من خلال التبديل من نوع الجهاز العادي f1-micro إلى نوع جهاز مخصّص يتضمّن 4 وحدات معالجة مركزية افتراضية وذاكرة وصول عشوائي بسعة 3840MiB.

في Cloud Shell، نفِّذ الأمر التالي لتعديل نوع الجهاز الخاص بمثيل الواجهة الأمامية:

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 على جهاز Macintosh) للخروج من عملية المراقبة.

نفِّذ الأمر التالي لمعرفة ما إذا كانت الآلة الافتراضية تستخدم نوع الجهاز الجديد (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

بعد ذلك، أرسِل الرمز إلى حزمة Cloud Storage مرة أخرى.

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 على جهاز Macintosh).

نفِّذ ما يلي للتأكّد من أنّ الخدمة مُدرَجة على أنّها سليمة:

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 على جهاز Macintosh).

لإبطال صحة المحتوى المخزَّن مؤقتًا في شبكة توصيل المحتوى وضمان عرض محتوى جديد، نفِّذ ما يلي:

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

من هناك، يمكنك استخدام Secure Shell في إحدى الآلات الافتراضية، حيث يكون 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 على جهاز Macintosh) للخروج من أمر المراقبة. في هذه المرحلة، تعيد مجموعة الأجهزة الافتراضية المُدارة إنشاء الجهاز الافتراضي لإصلاحه.

9. تَنظيم

بعد الانتهاء، أسهل طريقة لتنظيف جميع الأنشطة التي تم تنفيذها هي حذف المشروع. يؤدي حذف المشروع إلى حذف موازن التحميل والآلات الافتراضية والنماذج وغير ذلك من العناصر التي تم إنشاؤها أثناء الدرس التطبيقي حول الترميز لضمان عدم حدوث أي رسوم متكررة غير متوقعة. نفِّذ ما يلي في Cloud Shell، حيث يكون PROJECT_ID هو رقم تعريف المشروع الكامل، وليس اسم المشروع فقط.

gcloud projects delete [PROJECT_ID]

أكِّد الحذف من خلال إدخال "Y" عندما يُطلب منك ذلك.

10. تهانينا!

لقد نشرت موقعك الإلكتروني ووسّعت نطاقه وعدّلته على Compute Engine. أصبحت الآن لديك خبرة في استخدام Compute Engine ومجموعات الأجهزة الافتراضية المُدارة وموازنة الحمل وعمليات فحص الحالة.