نشر موقع إلكتروني باستخدام Cloud Run

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

باستخدام Cloud Run، بفضل تنفيذ Google Cloud لمنصة Knative، يمكنك إدارة موقعك الإلكتروني ونشره بدون أي تكاليف عامة تحتاج إليها لعمليات النشر المستندة إلى الجهاز الافتراضي أو Kubernetes. لا يقتصر ذلك على نهج أبسط من منظور الإدارة، ولكنه يمنحك أيضًا القدرة على التوسّع إلى الصفر في حال عدم تلقّي أي طلبات في موقعك الإلكتروني.

ولا يوفِّر Cloud Run التطوير بدون خادم إلى الحاويات فحسب، بل يمكن أيضًا تشغيله إما في مجموعات Google Kubernetes Engine (GKE) أو على نظام أساسي مُدار بالكامل كخدمة (PaaS) مُقدَّمة من Cloud Run. ستختبر السيناريو الثاني في هذا الدرس التطبيقي حول الترميز.

يوضِّح المخطَّط التالي مسار النشر واستضافة Cloud Run. ستبدأ بصورة docker التي يتم إنشاؤها باستخدام Cloud Build، والتي يتم تشغيلها في Cloud Shell. ويمكنك بعد ذلك نشر هذه الصورة على Cloud Run باستخدام أمر في Cloud Shell.

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

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

  • كيفية إنشاء صورة docker باستخدام Cloud Build وتحميلها إلى gcr.io
  • كيفية نشر صور docker إلى Cloud Run
  • كيفية إدارة عمليات نشر Cloud Run
  • كيفية إعداد نقطة نهاية لتطبيق على Cloud Run

العناصر التي سيتم إنشاؤها

  • موقع إلكتروني ثابت يتم تشغيله داخل حاوية docker
  • إصدار لهذه الحاوية متوفّر في حاويات السجلّ
  • نشر Cloud Cloud لموقعك الإلكتروني الثابت

الأشياء التي تحتاج إليها

  • حساب على Google مع حق الوصول الإداري لإنشاء مشاريع أو مشروع بدور مالك المشروع

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

إذا لم يكن لديك حساب على Google، عليك إنشاء حساب. ثم سجِّل الدخول إلى Google Cloud Console وانقر على المشروع &gt؛ إنشاء مشروع.

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

بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud وتفعيل واجهة برمجة تطبيقات Cloud Run.

تفعيل Cloud Run API

انقر على قائمة التنقل ☰ > APIs & Services > لوحة البيانات> تفعيل واجهات برمجة التطبيقات والخدمات. .

ابحث عن "Cloud Run API," ثم انقر على Cloud Run API > Enable.

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

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

Cloud Shell

في حين يمكن تشغيل Google Cloud وCloud Run عن بُعد من الكمبيوتر المحمول، يمكنك استخدام Cloud Shell، وهو عبارة عن بيئة سطر أوامر يتم تشغيلها في Google Cloud. يتم ضبط البيئة مسبقًا باستخدام كل مكتبات العملاء وأُطر العمل التي تحتاجها.

يتم تحميل هذا الجهاز الافتراضي الذي يعمل بنظام التشغيل 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

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

ونظرًا لأنك تنشر موقعًا إلكترونيًا حاليًا، عليك فقط استنساخ المصدر من مستودعك، حتى تتمكن من التركيز على إنشاء صور docker والنشر على Cloud Run.

شغِّل الأوامر التالية لإنشاء نسخة طبق الأصل من المستودع في مثيل Cloud Shell والتغيير إلى الدليل المناسب. وستثبِّت أيضًا تبعيات Node.js بحيث يمكنك اختبار تطبيقك قبل النشر.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

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

ابدأ العناية اللازمة واختبر التطبيق. شغّل الأمر التالي لبدء خادم الويب:

cd ~/monolith-to-microservices/monolith
npm start

إخراج:

Monolith listening on port 8080!

يمكنك معاينة تطبيقك بالنقر على معاينة الويب واختيار معاينة على المنفذ 8080.

سيؤدّي ذلك إلى فتح نافذة جديدة يمكنك من خلالها الاطّلاع على أداء متجرك الفعلي.

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

الآن وقد أصبحت ملفات المصدر جاهزة، حان وقت إرساء تطبيقك.

وعادةً ما يكون عليك اتخاذ نهج من خطوتين ينطوي على إنشاء حاوية docker ودفعها إلى قاعدة بيانات المسجّلين لتخزين الصورة التي تسحبها GKE منها. ومع ذلك، يمكنك جعل الحياة أسهل باستخدام Cloud Build لإنشاء حاوية docker ووضع الصورة في Registry Registry باستخدام أمر واحد. لعرض العملية اليدوية لإنشاء ملف docker ودفعه، يُرجى الاطِّلاع على Quickstart للحصول على حاوية الحاويات.

يعمل Cloud Build على ضغط الملفات من الدليل ونقلها إلى حزمة Cloud Storage. بعد ذلك، تستغرِق عملية الإصدار جميع الملفات من الحزمة وتستخدم dockerfile، الموجودة في الدليل نفسه لتشغيل عملية إنشاء docker. بما أنك حددت علامة --tag باستخدام المضيف على أنه gcr.io لصورة docker، سيتم إرسال صورة docker الناتجة إلى سجلّ الحاويات.

أولاً، يجب التأكد من تفعيل Cloud Build API. شغّل الأمر التالي لتفعيلها:

gcloud services enable cloudbuild.googleapis.com

بعد تفعيل واجهة برمجة التطبيقات، شغِّل الأمر التالي في Cloud Shell لبدء عملية الإصدار:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

تستغرق هذه العملية بضع دقائق، ولكن بعد اكتمالها، ستظهر مخرجات في الوحدة الطرفية تشبه ما يلي:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

لعرض سجلّ الإصدار أو مشاهدة العملية في الوقت الفعلي، يمكنك الانتقال إلى Cloud Console، ثم النقر على قائمة التنقّل ☰ > Cloud Build > History (السجلّ). ستظهر لك قائمة بجميع الإصدارات السابقة، ولكن يجب أن يكون هناك فقط جميع الإصدار الذي أنشأته.

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

الآن بعد أن أنشأت موقعًا على الويب وأرسلته إلى حاوية الحاويات، حان وقت النشر في Cloud Run.

هناك طريقتان للنشر في Cloud Run:

  • Cloud Run (مُدار بالكامل) هو نموذج PaaS حيث تتم إدارة دورة حياة الحاوية بأكملها. وستستخدم هذه الطريقة في الدرس التطبيقي حول الترميز.
  • Cloud Run for Anthos هو Cloud Cloud مزوّد بطبقة إضافية من التحكّم تتيح لك جلب مجموعاتك ومجموعاتك GKE. لمزيد من المعلومات، يُرجى الاطِّلاع على إعداد Cloud Run for Anthos على Google Cloud.

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

سطر الأوامر

شغّل الأمر التالي لنشر التطبيق:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

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

لأغراض الاختبار، يمكنك السماح بالطلبات التي لم تتم مصادقتها للتطبيق. أدخِل y عند ظهور رسالة المطالبة.

التحقُّق من النشر

للتحقّق من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي. قد يستغرق Pod status بضع لحظات: Running:

gcloud run services list

اختر [1] Cloud Run (مُدار بالكامل).

إخراج:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

تعرض لك النتائج عدة عناصر. يمكنك الاطّلاع على عملية النشر الخاصة بك، بالإضافة إلى المستخدم الذي نشرها (عنوان بريدك الإلكتروني) وعنوان URL الذي يمكنك استخدامه للدخول إلى التطبيق. يبدو أنه تم إنشاء كل شيء بنجاح.

افتح عنوان URL المقدَّم في قائمة الخدمات في متصفح الويب الذي تستخدمه، ويفترض أن يظهر لك الموقع الإلكتروني نفسه الذي عاينته محليًا.

والآن، انشر تطبيقك مرة أخرى، ولكن هذه المرة، عدِّل إحدى المعلمات.

ووفقًا للإعدادات التلقائية، سيكون لكل تطبيق Cloud Run قيمة مزامنة تبلغ 80، وهو ما يعني أن كل مثيل حاوية سوف يعرض ما يصل إلى 80 طلبًا في المرة الواحدة. وهذا خروج كبير عن دوال الوظائف كخدمة (FaaS)، حيث يتعامل مثيل واحد مع طلب واحد في كل مرة.

أعد نشر صورة الحاوية نفسها بقيمة مزامنة 1 (لأغراض الاختبار فقط) وشاهد ما يحدث.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

أجب عن الأسئلة اللاحقة كما فعلت في المرة الأولى. وبعد نجاح الأمر، تحقق من Cloud Console للاطّلاع على النتيجة.

من لوحة بيانات Cloud Cloud، انقر على خدمة الصغيرة لمعرفة التفاصيل.

انقر على علامة التبويب النُسخ السابقة. من المفترض أن تظهر لك نسختان من مراجعاتك. انقر على monolith-00002 وراجِع التفاصيل. ومن المفترض أن تلاحظ انخفاض قيمة المزامنة إلى 1.

]

على الرغم من أن هذا الإعداد كافٍ للاختبار، إلا أنه في معظم سيناريوهات الإنتاج، سيكون لديك حاويات تتيح الطلبات المتزامنة المتعددة.

يمكنك الآن استعادة المزامنة الأصلية بدون إعادة النشر. يمكنك ضبط قيمة التزامن على القيمة التلقائية وهي 80 أو 0، ما سيؤدي إلى إزالة أي قيود على المزامنة وضبطها على الحد الأقصى التلقائي (الذي يكون 80 في وقت الكتابة).

شغّل الأمر التالي في Cloud Shell لتعديل النسخة الحالية:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

لاحظ أنه تم إنشاء مراجعة أخرى، وتمت إعادة توجيه الزيارات، وأن المزامنة تعود إلى 80.

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

يبدو أن أحد مطوّري البرامج قد أنشأ التغييرات باستخدام اسم الملف 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 run build:monolith

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

شغّل الأمر التالي لتشغيل Cloud Build جديد بإصدار صورة محدَّث من 2.0.0:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

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

اكتملت التغييرات، ويشعر فريق التسويق بالرضا عن آخر المستجدّات! حان وقت تحديث الموقع الإلكتروني بدون مقاطعة المستخدمين.

يتعامل Cloud Run مع كل عملية نشر كنسخة جديدة، والتي سيتم نشرها على الإنترنت، ثم إعادة توجيه الزيارات إليها.

اتّبِع المجموعات التالية من التعليمات لتعديل موقعك الإلكتروني.

سطر الأوامر

من سطر الأوامر، يمكنك إعادة نشر الخدمة لتعديل الصورة إلى إصدار جديد باستخدام الأمر التالي:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

التحقُّق من النشر

تحقّق من صحة تحديث النشر من خلال تشغيل الأمر التالي:

gcloud run services describe monolith --platform managed 

تظهر النتيجة على النحو التالي:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

ستلاحظ أن خدمتك تستخدم الآن أحدث إصدار من صورتك تم نشره في نسخة جديدة.

للتحقُّق من التغييرات، انتقِل إلى عنوان URL الخارجي لخدمة Cloud Run مرة أخرى ولاحظ أنه تم تعديل عنوان تطبيقك.

شغّل الأمر التالي لإدراج الخدمات وعرض عنوان IP إذا نسيته:

gcloud run services list

من المفترض أن يعرض موقعك الإلكتروني الآن النص الذي أضفته إلى مكوّن الصفحة الرئيسية.

حذف صور سجلّ الحاويات

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

حذف عناصر Cloud Build من Cloud Storage

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

حذف خدمة Cloud Run

gcloud run services delete monolith --platform managed

لقد نشرت موقعك الإلكتروني ووسّعته وعدّلته باستخدام Cloud Run.

مزيد من المعلومات