استضافة تطبيق ويب على Google Cloud باستخدام GCE

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

ما ستتعرَّف عليه

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

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

إعداد بيئة ذاتية

إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، يجب إنشاء حساب. تسجيل الدخول إلى وحدة تحكُّم Google Cloud Platform (console.cloud.google.com) وإنشاء مشروع جديد:

لقطة شاشة من 2016-02-10 الساعة 12:45:26.png

عذرًا! وسيُشار إليه لاحقًا في هذا الدرس التطبيقي بعنوان PROJECT_ID.

بعد ذلك، ستحتاج إلى تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

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

يكون المستخدمون الجدد لخدمة Google Cloud Platform مؤهَّلين للاستفادة من فترة تجريبية مجانية تبلغ 300 دولار أمريكي.

تفعيل واجهة برمجة تطبيقات Compute Engine

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

Google Cloud Shell

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

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

لتفعيل Google Cloud Shell، من وحدة تحكّم مطوّري البرامج، انقر على الزر في أعلى يسار الصفحة (من المفترض أن تستغرق إدارة الحسابات والاتصال بضع لحظات فقط):

تفعيلCloudShell.png

انقر على الزر &بدء؛ Cloud Shell &&quot:

لقطة شاشة يوم 14-06-2017 الساعة 10.13.43 مساءً.png

بعد الاتصال بواجهة السحابة الإلكترونية، من المفترض أن ترى أنه قد تمت المصادقة عليك وأن المشروع قد سبق وتم ضبطه على PROJECT_ID :

gcloud auth list

مخرجات الأوامر

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

مخرجات الأوامر

[core]
project = <PROJECT_ID>

تضبط Cloud Shell أيضًا بعض متغيّرات البيئة تلقائيًا والتي قد تكون مفيدة عند تشغيل الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

مخرجات الأوامر

<PROJECT_ID>

إذا لم يتم إعداد المشروع لسبب ما، فما عليك سوى إصدار الأمر التالي :

gcloud config set project <PROJECT_ID>

هل تبحث عن PROJECT_ID؟ تحقق من رقم التعريف الذي استخدمته في خطوات الإعداد أو ابحث عنه في لوحة بيانات وحدة التحكم:

Project_ID.png

ملاحظة مهمة: وأخيرًا، يمكنك ضبط المنطقة التلقائية وإعدادات المشروع:

gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. اطّلع على مزيد من المعلومات في وثائق المناطق والمناطق؛

إنشاء حزمة GCS

سنستخدم حزمة Google Cloud Storage للحصول على الرمز المضمَّن بالإضافة إلى نصوصنا البرمجية الناشئة. من داخل Cloud Shell، نفِّذ ما يلي لإنشاء حزمة GCS جديدة:

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

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

انقر على الزر أدناه لنسخ نسخة طبق الأصل من مستودع الرموز في المشروع، بالإضافة إلى فتح Cloud Shell و"محرّر الرموز" المدمج.

في موجه أوامر Cloud Shell، شغِّل الإصدار الأولي للرمز للسماح بتشغيل التطبيق محليًا. قد يستغرق الأمر بضع دقائق لتشغيل هذا النص البرمجي.

./setup.sh

لنتّخذ العناية الواجبة ونختبر تطبيقنا وتنفيذ الأمر التالي لبدء خادم الويب:

cd microservices
npm start

إخراج:

Products microservice listening on port 8092!
Frontend microservice listening on port 8090!
Orders microservice listening on port 8091!

يمكنك معاينة تطبيقك بالنقر على رمز معاينة الويب واختيار "&نقل" والمنفذ"&;وإدخال منفذ خدمة الواجهة الأمامية: 8090. اختَر &اقتباس تغييرات ومعاينة.

من المُفتَرض أن تفتح نافذة جديدة حيث يمكنك مشاهدة الواجهة الأمامية لـ Fancy Store أثناء اللعب!

يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني وإيقاف عملية خادم الويب، اضغط على CTRL+C في نافذة الوحدة الطرفية.

الآن بعد أن تم إنشاء بيئة مطوّري البرامج للعمل، حان الوقت لبدء نشر بعض أمثلة Compute Engine. الخطوات التالية:

  1. إنشاء نص برمجي لبدء التشغيل لضبط المثيلات
  2. نسخ رمز المصدر وتحميله إلى Google Cloud Storage
  3. نشر مثيل Compute Engine لاستضافة الخدمات المصغرة للخلفية
  4. يُرجى إعادة ضبط رمز الواجهة الأمامية لاستخدام مثيل الخدمات المصغّرة في الخلفية.
  5. نشر مثيل Compute Engine لاستضافة خدمة الواجهة الأمامية الصغيرة
  6. إعداد الشبكة للسماح بالاتصال

إنشاء النص البرمجي لبدء التشغيل

حتى يتم ضبط المثيلات تلقائيًا بالطريقة التي نريدها، سنستخدم نصًا برمجيًا لبدء التشغيل سيوجّه المثيل إلى ما يجب فعله في كل مرة يتم فيها تشغيله. ضمن "محرّر الرموز" في Cloud Shell، انتقِل إلى المجلد monolith-to-microservices وأنشئ ملفًا باسم "startup-script.sh".

داخل هذا الملف الجديد، الصق الرمز التالي. سنُعدِّل بعض الرموز بعد لصقها.

#!/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/

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

  • يتم تثبيت وكيل التسجيل. يجمع الوكيل السجلّات تلقائيًا من syslog.
  • تثبيت Node.js والمشرف. يعمل المشرف على التطبيق كبرنامج خفي.
  • استنساخ رمز مصدر التطبيق من مجموعة بيانات GCS ودلوعات التثبيت.
  • لضبط المشرف لتشغيل التطبيق. يتأكّد المشرف من إعادة تشغيل التطبيق في حال خروجه بشكل غير متوقّع أو إيقافه بواسطة مشرف أو عملية. وتُرسِل الملف أيضًا التطبيق's stdout وstderr إلى سجلّ النظام ليجمعه وكيل التسجيل.

والآن انسخ ملف Start-script.sh الذي تم إنشاؤه إلى حزمة GCS التي تم إنشاؤها سابقًا:

gsutil cp startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID

يمكن الوصول إلى هذا الآن على: https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh. [BUCKET_NAME] يمثل اسم حزمة Cloud Storage. وسيكون هذا الموقع الإلكتروني مرئيًا فقط للمستخدمين المصرّح لهم وحسابات الخدمة تلقائيًا، وبالتالي لن تتمكّن من الوصول إليه باستخدام متصفّح ويب. ستتمكّن مثيلات Google Compute Engine تلقائيًا من الوصول إلى هذه البيانات من خلال حساب الخدمة.

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

عند تشغيل المثيلات، سيسحب المشرف رمزًا من حزمة GCS حتى نتمكن من تخزين بعض متغيرات الإعداد داخل ملف ".env'" للرمز.

انسخ الرمز المستنسخ إلى حزمة GCS:

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 الذي تم ضبطه لاستخدام النص البرمجي المحدَّد مسبقًا للتشغيل، والذي يتم أيضًا وضع علامة عليه كمثيل "backend" لنتمكن من تطبيق قواعد جدار ناري محدّدة عليه لاحقًا:

gcloud compute instances create backend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=backend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh

إعداد الربط بالخلفية

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

يمكنك استرداد عنوان 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' "، ثم انتقِل إلى مجلد واحد ضِمن الخدمات الدقيقة → test-app. من قائمة "محرّر الرموز"، اختَر عرض ← تبديل الملفات المخفية لكي تتمكّن من رؤية الملف ".env&#39؛

عدِّل الملف ".env'" بحيث يشير إلى عنوان IP الخارجي للخلفية. [BACKEND_ADDRESS] أدناه هو عنوان IP الخارجي لمثيل الخلفية الذي تم تحديده من خلال الأمر gcloud أعلاه.

REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8091/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8092/api/products

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

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/

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

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

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 

إعداد الشبكة

إنشاء قواعد الجدار الناري للسماح بالوصول إلى المنفذ 8090 للواجهة الأمامية، ومنافذ 8091-8092 للخلفية. تستخدم أوامر الجدار الناري هذه العلامات التي تم تخصيصها أثناء إنشاء المثيل للتطبيق.

gcloud compute firewall-rules create fw-fe \
    --allow tcp:8090 \
    --target-tags=frontend
gcloud compute firewall-rules create fw-be \
    --allow tcp:8091-8092 \
    --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

انتقل إلى http://[FRONTEND_ADDRESS]:8090 للوصول إلى موقع الويب، حيث [FRONTEND_ADDRESS] هو EXTERNAL_IP المحدد أعلاه. قد يستغرق الأمر بضع دقائق لبدء المثيل وتهيئته.

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

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

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

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

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

لإنشاء نموذج المثيل، سنستخدم المثيلات الحالية التي تم إنشاؤها سابقًا. أولاً، يجب إيقاف كلتا الحالتين:

gcloud compute instances stop frontend
gcloud compute instances stop backend

ويمكننا بعد ذلك إنشاء نموذج المثيل من المثيلات المصدر:

gcloud compute instance-templates create fancy-fe \
    --source-instance=frontend \
    --source-instance-zone=us-central1-a
gcloud compute instance-templates create fancy-be \
    --source-instance=backend \
    --source-instance-zone=us-central1-a

تأكَّد من إنشاء نماذج المثيلات:

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

بالنسبة إلى تطبيقنا، تعمل الخدمة الواجهة الأمامية الصغيرة على المنفذ 8090، بينما تعمل الخدمات الخلفية الخلفية على المنفذ 8091 للطلبات ومنفذ 8092 للمنتجات. ونظرًا لأن هذه المنافذ غير قياسية، سنحدد المنافذ المحددة لتحديدها. المنافذ المُسماة هي البيانات الوصفية لزوج المفتاح/القيمة التي تمثل اسم الخدمة والمنفذ الذي يتم تشغيله عليه. يمكن تخصيص المنافذ المُعنوَنة لمجموعة مثيلات، ما يعني أن الخدمة متاحة في جميع المثيلات ضمن هذه المجموعة. يتم استخدام هذه المعلومات من خلال خدمة موازنة حمل HTTP التي سيتم ضبطها لاحقًا.

gcloud compute instance-groups set-named-ports fancy-fe-mig \ 
    --named-ports frontend:8090
gcloud compute instance-groups set-named-ports fancy-be-mig \
    --named-ports orders:8091,products:8092

ضبط المعالجة التلقائية

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

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

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

gcloud compute health-checks create http fancy-fe-hc \
    --port 8090 \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
    --port 8091 \
    --request-path=/api/orders \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3

يمكنك إنشاء قاعدة جدار ناري للسماح لاستقصاءات التحقق من الصحة بالاتصال بالخدمات الصغيرة على المنافذ 8090-8091:

gcloud compute firewall-rules create allow-health-check \
    --allow tcp:8090-8091 \
    --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

محاكاة المحاكاة

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

gcloud compute instance-groups list-instances fancy-fe-mig

بعد ذلك، أدخِل 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

بعد ملاحظة عملية الإصلاح، اضغط على Ctrl+C للخروج من أمر الساعة. في هذه المرحلة، ستعيد مجموعة المثيلات المُدارة إنشاء المثيل لإصلاحه.

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

https://cloud.google.com/load-balance/docs/load-balance-overview.

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

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

  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 8090
gcloud compute http-health-checks create fancy-be-orders-hc \
  --request-path /api/orders \
  --port 8091
gcloud compute http-health-checks create fancy-be-products-hc \
  --request-path /api/products \
  --port 8092

إنشاء خدمات خلفية تستهدف الزيارات المتوازنة التحميل. ستستخدم هذه الخدمات الخلفية عمليات التحقّق من الصحة والمنافذ المُسماة التي أنشأناها.

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-a \
  --global
gcloud compute backend-services add-backend fancy-be-orders \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-a \
  --global
gcloud compute backend-services add-backend fancy-be-products \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-a \
  --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، غيِّر الملف إلى مجلد app-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 باستخدام محرِّر النصوص المفضّل لديك (مثل nano) للتوجيه إلى عنوان IP العام لجهاز موازنة الحمل. [LB_IP] يمثل عنوان IP الخارجي لمثيل الخلفية الذي تم تحديده أعلاه.

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

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

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%

اختبار الموقع الإلكتروني

تحقَّق من حالة مجموعة المثيلات المُدارة إلى أن تظهر المثيلات في القائمة:

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

بعد ظهور العناصر في القائمة، عليك الخروج من أمر الساعة بالضغط على Ctrl+C.

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

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: 8090
  - 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: 8090
  kind: compute#backendServiceGroupHealth

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

gcloud compute forwarding-rules list --global

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

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

لإنشاء سياسة القياس التلقائي، يمكنك تنفيذ ما يلي ضمن 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

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

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

تعديل نموذج المثيل

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

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

ابدأ تشغيل مثيل frontend، إذا لم يكن قيد التشغيل من قبل:

gcloud compute instances start frontend

Secure Shell في المثيل:

gcloud compute ssh frontend

في المثيل، لننشئ ملفًا لإثبات أنه تم تعديله:

echo "Updated" > ~/updated_proof

الخروج من المثيل:

exit

إيقاف المثيل:

gcloud compute instances stop frontend

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

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

مراقبة حالة التحديث:

gcloud compute instance-groups managed list-instances fancy-fe-mig

بعد أن يكون المثيل ضمن الحالة RUNNING مع ضبط INSTANCE_FORM على fancy-fe-new، سجِّل الدخول إلى المثيل المُنشأ حديثًا وتحقّق لمعرفة ما إذا كان الملف "update_مقاومة&#39؛ حيث يكون [VM_NAME] هو المثيل الذي تم إنشاؤه حديثًا:

gcloud compute ssh [VM_NAME]

إذا كان الملف "update_protection' " متاحًا على مثيلات المجموعة المُدارة، تم إرسال هذا التعديل بنجاح.

إجراء تغييرات على المواقع الإلكترونية

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

بعد ذلك، سنعيد إرسال هذا الرمز إلى حزمة 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

وستتم إعادة تشغيل المثيلات مع إعادة تشغيل المخزن المؤقت حتى لا تتأثر إمكانية الوصول. راقِب جولات المثيلات من خلال وحدة التحكّم. وأثناء التحديث، ستتغير الحالة، وبعد اكتمالها ستظهر مجموعة المثيلات المُدارة على أنها جاهزة ضمن Compute Engine -> Instance Groups:

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

gcloud projects delete [PROJECT_ID]

أكِّد الحذف عن طريق إدخال &&;Y" عند مطالبتك.

لقد نجحت في نشر موقعك الإلكتروني وتوسيعه وتحديثه على GCE. أنت الآن على دراية بـ Compute Engine و"المثيلات المُدارة" و"موازنة الحمل" و"عمليات التحقق من الصحة".