1. مقدمة
هناك العديد من الطرق لنشر مواقع الويب في Google Cloud مع توفير كل حل ميزات وإمكانيات ومستويات تحكم مختلفة. يوفّر Compute Engine مستوى عميقًا من التحكّم في البنية الأساسية المستخدمة لإدارة موقع إلكتروني، ولكنه يتطلب أيضًا إدارة تشغيلية أكثر قليلاً مقارنةً بحلول مثل Google Kubernetes Engine أو App Engine أو غير ذلك. باستخدام Compute Engine، يمكنك التحكّم بدقة في جوانب البنية الأساسية، بما في ذلك الأجهزة الافتراضية وجهاز موازنة الحمل والمزيد. اليوم، ستنشر نموذجًا لتطبيق - موقع التجارة الإلكترونية لمتجر Fancy Store - لتوضيح كيف يمكن نشر موقع ويب وتوسيع نطاقه بسهولة باستخدام Compute Engine.
ما ستتعرَّف عليه
- كيفية إنشاء مثيلات Compute Engine
- كيفية إنشاء نماذج المثيلات من المثيلات المصدر
- طريقة إنشاء مجموعات الأجهزة الافتراضية المُدارة
- كيفية إعداد عمليات الفحص الصحي والعلاج التلقائي
- كيفية إنشاء موازنة الحمل لبروتوكول HTTP(S)
- كيفية إنشاء عمليات التحقّق من الصحة لأجهزة موازنة الحمل
- كيفية استخدام شبكة توصيل المحتوى للتخزين المؤقت
في نهاية الدرس التطبيقي حول الترميز، ستكون لديك مثيلات ضمن مجموعات المثيلات المُدارة لتوفير التحديثات التلقائية وموازنة التحميل والقياس التلقائي وطرح التحديثات لموقعك الإلكتروني.
المتطلبات الأساسية
- لإلقاء نظرة عامة على المفاهيم التي سنستخدمها في هذا التمرين المعملي، يرجى الاطلاع على المواد التالية:
- مرحبًا بك في Google Cloud Platform - أساسيات Google Cloud Platform
- بدء استخدام Google Cloud Compute Engine
- بدء استخدام Google Cloud Storage
- البدء: Cloud Shell
2. إعداد البيئة
إعداد بيئة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في 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).
- لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell (من المفترَض أن تستغرق عملية الإعداد والاتصال بالبيئة بضع دقائق فقط).
بعد الربط بتطبيق 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:
تضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، وهو ما قد يكون مفيدًا عند تشغيل الأوامر المستقبلية.
echo $GOOGLE_CLOUD_PROJECT
مخرجات الأمر
<PROJECT_ID>
- أخيرًا، قم بتعيين تهيئة المنطقة الافتراضية والمشروع.
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".
من المفترض أن يؤدي ذلك إلى فتح نافذة جديدة يمكنك من خلالها مشاهدة الواجهة الأمامية لـ Fancy Store بشكل عملي!
يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني. لإيقاف عملية خادم الويب، اضغط على Control+C
(Command+C
على نظام التشغيل Macintosh) في النافذة الطرفية.
4. إنشاء مثيلات Compute Engine
الآن بعد أن أصبحت لديك بيئة عمل مطوّر برامج، يمكنك نشر بعض مثيلات Compute Engine! في الخطوات التالية، عليك تنفيذ ما يلي:
- أنشِئ نصًا برمجيًا لبدء التشغيل لضبط المثيلات.
- استنسِخ رمز المصدر وحمِّله على Cloud Storage.
- انشر نسخة افتراضية من Compute Engine لاستضافة الخدمات المصغّرة في الخلفية.
- عليك إعادة ضبط رمز الواجهة الأمامية لاستخدام مثيل الخدمات المصغّرة في الخلفية.
- انشر مثيل Compute Engine لاستضافة خدمة الواجهة الأمامية الصغيرة.
- اضبط الشبكة للسماح بالاتصال.
إنشاء نص برمجي لبدء التشغيل
سيتم استخدام نص برمجي لبدء التشغيل لإرشاد المثيل بما يجب فعله في كل مرة يتم فيها بدء التشغيل. بهذه الطريقة يتم ضبط المثيلات تلقائيًا.
انقر على رمز القلم الرصاص في شريط Cloud Shell لفتح محرِّر الرموز.
انتقِل إلى مجلد "النظام الأحادي إلى الخدمات المصغَّرة". انقر على ملف >. ملف جديد وإنشاء ملف باسم start-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/
ينفِّذ النص البرمجي لبدء التشغيل المهام التالية:
- تثبيت وكيل التسجيل، الذي يجمع تلقائيًا السجلات من سجلّ النظام
- تثبيت 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.
عدِّل ملف .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) في موجِّه الأوامر لإلغاء أمر الساعة.
تصفح الموقع http://[FRONTEND_ADDRESS]:8080 باستخدام علامة تبويب جديدة في متصفح الويب للوصول إلى الموقع الإلكتروني، حيث [FRONTEND_ADDRESS] هو EXTERNAL_IP المحدد أعلاه.
حاول الانتقال إلى صفحتَي "المنتجات" و"الطلبات" اللتين ينبغي أن تنجح أيضًا.
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) على النحو التالي:
- توجّه قاعدة إعادة التوجيه الطلبات الواردة إلى خادم وكيل HTTP مستهدف.
- يتحقّق خادم وكيل HTTP المستهدَف من كل طلب مقابل عملية ربط عنوان URL لتحديد خدمة الخلفية المناسبة للطلب.
- توجّه خدمة الخلفية كل طلب إلى واجهة خلفية مناسبة استنادًا إلى سعة العرض والمنطقة وحالة الحالة للواجهات الخلفية المرفقة. يتم التحقق من سلامة كل مثيل خلفية باستخدام فحص سلامة HTTP. إذا تمّ ضبط خدمة الخلفية لاستخدام التحقّق من الصحة عبر بروتوكول HTTPS أو HTTP/2، سيتم تشفير الطلب في طريقه إلى المثيل الخلفي.
- يمكن أن تستخدم الجلسات بين جهاز موازنة الحمل والمثيل بروتوكول 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 & 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
من المفترض أن تكون التغييرات الجديدة على الموقع الإلكتروني مرئية الآن.
تعذَّرت محاكاة الأخطاء
للتأكّد من نجاح عملية التحقّق من الصحة، سجِّل الدخول إلى الجهاز الافتراضي وأوقِف الخدمات. للعثور على اسم النسخة الافتراضية، نفِّذ ما يلي:
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 ومجموعات المثيلات المُدارة وموازنة التحميل وعمليات التحقّق من الصحة.