استضافة تطبيق ويب وتوسيع نطاقه في 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، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

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

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

b532b2f19ab85dda.png

لقطة شاشة يوم 14-06-2017 في الساعة 10.13.43 مساءً.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 لفتح محرِّر الرموز.

انتقِل إلى مجلد "النظام الأحادي إلى الخدمات المصغَّرة". انقر على ملف >. ملف جديد وإنشاء ملف باسم start-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/

ينفِّذ النص البرمجي لبدء التشغيل المهام التالية:

  • تثبيت وكيل التسجيل، الذي يجمع تلقائيًا السجلات من سجلّ النظام
  • تثبيت Node.js والمشرف، الذي يشغّل التطبيق كبرنامج خفي
  • استنساخ رمز مصدر التطبيق من حزمة Cloud Storage وتثبيت الموارد التابعة
  • إعداد المشرف الذي يشغّل التطبيق، ويضمن إعادة تشغيل التطبيق في حال خروجه بشكل غير متوقّع أو في حال إيقافه من قِبل المشرف أو عمليات المعالجة، وإرسال الملف القياسي والمفتاح القياسي للتطبيق إلى سجلّ النظام كي يجمعه وكيل التسجيل

يمكنك الآن نسخ ملف start-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 > التفاعل مع التطبيق. من قائمة "محرر الرموز"، حدد عرض > فعِّل الملفات المخفية للاطّلاع على ملف .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

احفظ الملف.

استخدِم الأمر التالي لإعادة إنشاء Interactive-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- إنشاء مجموعات النُسخ الافتراضية المُدارة

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

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

إنشاء نموذج مثيل من مثيل المصدر

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

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

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

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

ضبط الاستعادة التلقائية

لتحسين مدى توفّر التطبيق نفسه والتحقّق من استجابته، يمكنك ضبط سياسة الشفاء التلقائي لمجموعات المثيلات المُدارة.

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

يمكنك إنشاء فحص صحي لإصلاح المثيل إذا عاد ثلاث مرات متتالية على أنه غير صحي للواجهة الأمامية والخلفية:

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

أنشِئ مطابقة مسار للسماح لمسارات /واجهات برمجة التطبيقات/الطلبات و /واجهة برمجة التطبيقات/المنتجات بتوجيه كل منهما إلى الخدمات ذات الصلة.

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، يمكنك التغيير إلى مجلد Interactive-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

إعادة إنشاء تطبيق التفاعل الذي سيعدِّل رمز الواجهة الأمامية

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. توسيع نطاق محرّك الحوسبة

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

تغيير الحجم تلقائيًا عن طريق الاستخدام

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

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

من هناك، أدرج بروتوكول آمن في أحد المثيلات، حيث يكون INSTANCE_NAME أحد الأمثلة في القائمة:

gcloud compute ssh [INSTANCE_NAME]

في هذه الحالة، استخدم المشرف لإيقاف التطبيق.

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