استضافة تطبيق ويب وتوسيع نطاقه في 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.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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.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 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" أثناء العمل.

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

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

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

بالنسبة إلى تطبيقك، تعمل الخدمة المصغّرة للواجهة الأمامية على المنفذ 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 ثانية تقريبًا بعد إصدار الأمر rolling-action restart لمنح المثيلات وقتًا للمعالجة. بعد ذلك، تحقَّق من حالة مجموعة المثيلات المُدارة إلى أن تظهر المثيلات في القائمة.

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 وحدات معالجة مركزية افتراضية وذاكرة وصول عشوائي بسعة 3840 ميغابايت.

في 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 ونسخه إلى الدليل العام المتكامل:

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 ومجموعات المثيلات المُدارة وموازنة التحميل وعمليات التحقّق من الصحة.