تطوير InnerLoop باستخدام Cloud Workstations مع NodeJS

1. نظرة عامة

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

ما سوف تتعلمه

ستتعلم في هذا التمرين المعملي طُرق التطوير باستخدام حاويات في Google Cloud، بما في ذلك:

  • إنشاء تطبيق Nodejs للمبتدئين
  • إعداد تطبيق Nodejs لتطوير الحاوية
  • ترميز خدمة CRUD Rest بسيطة
  • النشر في GKE
  • تصحيح الأخطاء في حالة الخطأ
  • استخدام نقطة الإيقاف / السجلات
  • تغييرات شائعة في النشر مرة أخرى على GKE
  • اختياري: دمج CloudSQL للحفاظ على ثبات البيانات في الخلفية

58a4cdd3ed7a123a.png

2. الإعداد والمتطلبات

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

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بالكامل. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء محرِّر Cloudshell

تم تصميم هذا الدرس التطبيقي واختباره للاستخدام مع Google Cloud Shell Editor. للوصول إلى المحرر،

  1. انتقِل إلى مشروع Google على https://console.cloud.google.com.
  2. في أعلى يسار الشاشة، انقر على رمز محرِّر Cloud Shell

8560cc8d45e8c112.png

  1. سيتم فتح جزء جديد في أسفل النافذة.
  2. انقر على الزر Open Editor (فتح المحرر).

9e504cb98a6a8005.png

  1. سيتم فتح المحرِّر مع ظهور مستكشف على اليمين ومحرِّر في المنطقة الوسطى
  2. ستظهر أيضًا لوحة طرفية في أسفل الشاشة.
  3. إذا لم تكن الوحدة الطرفية مفتوحة، يمكنك استخدام مجموعة المفاتيح "ctrl+ " لفتح نافذة طرفية جديدة.

إعداد gcloud

في Cloud Shell، اضبط رقم تعريف مشروعك والمنطقة التي تريد نشر التطبيق فيها. حفظها كمتغيّرات PROJECT_ID وREGION

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

توفير البنية الأساسية المستخدمة في هذا التمرين المعملي

ستنشر في هذا التمرين المعملي الرمز البرمجي في GKE والوصول إلى البيانات المخزنة في قاعدة بيانات CloudSQL. يعمل النص البرمجي للإعداد أدناه على إعداد هذه البنية الأساسية من أجلك.

  1. نزِّل النص البرمجي للإعداد واجعله قابلاً للتنفيذ.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/setup_with_cw.sh
chmod +x setup_with_cw.sh
  1. فتح ملف setup_with_cw.sh وتعديل قيم كلمات المرور التي يتم ضبطها حاليًا على changeME
  2. يمكنك تشغيل النص البرمجي للإعداد للوصول إلى مجموعة GKE وقاعدة بيانات CloudSQL ستستخدمها في هذا التمرين المعملي.
./setup_with_cw.sh &

مجموعة محطات العمل السحابية

  1. افتح Cloud Workstations في Cloud Console. انتظِر إلى أن تصبح المجموعة في حالة READY.

305e1a3d63ac7ff6.png

إنشاء إعداد محطات العمل

  1. إذا تم إلغاء ربط جلسة Cloud Shell، انقر على "إعادة الاتصال" ثم قم بتشغيل الأمر gcloud cli لتعيين معرّف المشروع. استبدِل رقم تعريف المشروع النموذجي أدناه برقم تعريف مشروع qwiklabs قبل تشغيل الأمر.
gcloud config set project qwiklabs-gcp-project-id
  1. عليك تنزيل النص البرمجي أدناه وتشغيله في الوحدة الطرفية لإنشاء إعدادات Cloud Workstations.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
  1. تحقَّق من النتائج ضمن قسم "الإعدادات". سيستغرق الانتقال إلى حالة "جاهز" دقيقتين.

c8f0b8662fdb827e.png

  1. افتح Cloud Workstations في Console وأنشئ مثيلاً جديدًا.

a53adeeac81a78c8.png

  1. غيِّر الاسم إلى my-workstation واختَر الإعدادات الحالية: codeoss-js.

675d83f30c1319df.png

  1. تحقَّق من النتائج ضمن قسم "محطات العمل".

bf67586e6695852.png

تشغيل محطة العمل

  1. ابدأ تشغيل محطة العمل وشغِّلها. سيستغرق بدء محطة العمل بضع دقائق.

a9ad54f4b4b668e9.png

  1. يمكنك السماح بملفات تعريف الارتباط التابعة لجهات خارجية من خلال النقر على الرمز في شريط العناوين. 1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

  1. انقر على "الموقع الإلكتروني لا يعمل؟".

36a84c0e2e3b85b.png

  1. انقر على "السماح بملفات تعريف الارتباط".

2259694328628fba.png

  1. بعد تشغيل محطة العمل، ستظهر حزمة Code OSS IDE. انقر على "وضع علامة تم". في صفحة "البدء"، الأول هو برنامج IDE لمحطة العمل

94874fba9b74cc22.png

3- إنشاء تطبيق بدء Nodejs جديد

في هذا القسم، عليك إنشاء تطبيق Nodejs جديد.

  1. افتح نافذة Terminal جديدة.

c31d48f2e4938c38.png

  1. في Cloud Shell، أنشِئ دليلاً جديدًا باسم "mynodejsapp".
mkdir mynodejsapp

انقر على الزر "السماح" إذا رأيت هذه الرسالة، وذلك كي تتمكن من نسخها ولصقها في محطة العمل.

58149777e5cc350a.png

  1. يمكنك التغيير إلى هذا الدليل وفتحه كمساحة عمل. سيؤدي هذا إلى إعادة تحميل المحرّر من خلال إنشاء إعداد مساحة عمل في المجلد الذي تم إنشاؤه حديثًا.
cd mynodejsapp && code-oss-cloud-workstations -r --folder-uri="$PWD"
  1. افتح وحدة طرفية جديدة مرة أخرى. تثبيت عقدة وNPM باستخدام NVM.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
        
        # This loads nvm bash_completion
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  

nvm install stable

nvm alias default stable

4. إنشاء تطبيق جديد للمبتدئين

  1. إعداد التطبيق

يمكنك إنشاء ملف package.json من خلال تنفيذ الأمر التالي.

npm init
    Choose the `entry point: (index.js) src/index.js` and leave default values for the rest of the parameters. This will create the `package.json` file with following contents
{
  "name": "mynodejsapp",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
  1. إضافة نقطة إدخال

افتح ملف package.json وعدِّله في بيئة التطوير المتكاملة (IDE) لتضمين أمر البدء في النص البرمجي "start": "node src/index.js",. بعد إجراء التغيير، من المفترض أن تبدو النصوص البرمجية على النحو التالي مقتطف الرمز أدناه:

"scripts": {
    "start": "node src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  1. إضافة تبعية Express

الرمز الذي سنضيفه يستخدم أيضًا express، لذا دعنا نضيف هذه التبعية إلى ملف package.json هذا. لذلك بعد إجراء كل التغييرات، من المفترض أن يظهر ملف package.json على النحو الموضّح أدناه.

{
 "name": "mynodejsapp",
 "version": "1.0.0",
 "description": "",
 "main": "src/index.js",
 "scripts": {
   "start": "node src/index.js",
   "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "",
 "license": "ISC",
 "dependencies": {
   "express": "^4.17.3"
 }
}
  1. إنشاء ملف index.js

أنشئ دليل مصدر باسم src من خلال اختيار "مجلد جديد" في عرض المستكشف.

eb507d48f283ce46.png

إنشاء ملف src/index.js

3e3e6e6062e501fc.png

مع التعليمة البرمجية التالية

const express = require('express');
const app = express();
const PORT = 8080;

app.get('/', (req, res) => {
    var message="Greetings from Node";
    res.send({ message: message });
  });

app.listen(PORT, () => {
  console.log(`Server running at: http://localhost:${PORT}/`);

});

يُرجى العلم أنّه تم ضبط المنفذ على القيمة 8080.

إنشاء ملفات بيانات

توفّر شركة Skaffold أدوات متكاملة لتبسيط عملية تطوير الحاويات. في هذه الخطوة، ستقوم بتهيئة Skaffold الذي سينشئ تلقائيًا ملفات KAML الأساسية لـ kubernetes. نفِّذ الأمر أدناه لبدء العملية.

نفِّذ الأمر التالي في الوحدة الطرفية

skaffold init --generate-manifests

عندما يُطلب منك ذلك:

  • أدخِل 8080 للمنفذ.
  • أدخِل y لحفظ الإعدادات.

تمت إضافة ملفَين إلى مساحة العمل، skaffold.yaml وdeployment.yaml.

تعديل اسم التطبيق

لا تتطابق القيم التلقائية المضمّنة في الإعداد حاليًا مع اسم التطبيق. عدِّل الملفات للإشارة إلى اسم التطبيق بدلاً من القيم التلقائية.

  1. تغيير الإدخالات في إعداد Skaffold
  • فتح "skaffold.yaml"
  • اختَر اسم الصورة المحدَّد حاليًا على أنّه package-json-image.
  • انقر بزر الماوس الأيمن واختر "تغيير جميع مواضع الورود"
  • اكتب الاسم الجديد كـ mynodejsapp
  1. تغيير الإدخالات في إعدادات Kubernetes
  • فتح ملف deployment.yaml
  • اختَر اسم الصورة المحدَّد حاليًا على أنّه package-json-image.
  • انقر بزر الماوس الأيمن واختر "تغيير جميع مواضع الورود"
  • اكتب الاسم الجديد كـ mynodejsapp

لاحِظ أنّه في الملف skaffold.yaml، يستخدم القسم build العلامة buildpacks لوضع التطبيق. لا يحتوي هذا الرمز على Dockerfile ولا يحتاج المطوّر إلى أيّ معرفة ببروتوكول Docker لنشر هذا التطبيق.

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

5- التعرّف على عملية التطوير

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

تتكامل خدمة Cloud Code مع Saffold لتبسيط عملية التطوير. عند النشر على GKE باتّباع الخطوات التالية، ستنشئ Cloud Code وSkaffold صورة الحاوية تلقائيًا وترسلها إلى Container Registry ثم تنشر تطبيقك على GKE. يحدث هذا وراء الكواليس في استخلاص التفاصيل بعيدًا عن تدفق المطور. تُحسّن Cloud Code أيضًا عملية التطوير من خلال توفير إمكانات تقليدية لتصحيح الأخطاء والمزامنة من أجل التطوير المستند إلى الحاوية.

تسجيل الدخول إلى Google Cloud

  1. انقر على رمز رمز السحابة الإلكترونية واختَر "تسجيل الدخول إلى Google Cloud":

1769afd39be372ff.png

  1. انقر على "المتابعة لتسجيل الدخول".

923bb1c8f63160f9.png

  1. تحقَّق من النتائج في الوحدة الطرفية وافتح الرابط:

517fdd579c34aa21.png

  1. سجِّل الدخول باستخدام بيانات اعتماد الطلاب في Qwiklabs.

db99b345f7a8e72c.png

  1. حدد "السماح":

a5376553c430ac84.png

  1. انسخ رمز إثبات الهوية وارجع إلى علامة التبويب "محطة العمل".

6719421277b92eac.png

  1. الصق رمز التحقق واضغط على Enter.

e9847cfe3fa8a2ce.png

إضافة مجموعة Kubernetes

  1. إضافة مجموعة

62a3b97bdbb427e5.png

  1. اختَر Google Kubernetes Engine:

9577de423568bbaa.png

  1. اختيار مشروع

c5202fcbeebcd41c.png

  1. اختَر "mycluster" تم إنشاؤه في الإعداد الأولي.

33863e94d1c5045f.png

  1. تظهر المجموعة الآن في قائمة مجموعات Kubernetes ضمن Cloud Code. يمكنك التنقّل واستكشاف المجموعة من هنا.

7e5f50662d4eea3c.png

ضبط رقم تعريف المشروع الحالي باستخدام gcloud cli

  1. انسخ رقم تعريف المشروع الخاص بهذا التمرين المعملي من صفحة Qwiklabs.

fcff2d10007ec5bc.png

  1. من الوحدة الطرفية، شغِّل الأمر gcloud cli لضبط رقم تعريف المشروع. استبدِل نموذج رقم تعريف المشروع قبل تشغيل الأمر. استبدِل رقم تعريف المشروع قبل تشغيل الأمر أدناه.
gcloud config set project qwiklabs-gcp-project-id

النشر على Kubernetes

  1. في الجزء السفلي من "محرِّر Cloud Shell"، اختَر Cloud Code ⁠

c5dd5a749136407b.png

  1. في اللوحة التي تظهر في أعلى الصفحة ضمن "جلسات التطوير"، اختَر تشغيل على Kubernetes. إذا طُلب منك ذلك، اختَر "نعم" لاستخدام سياق Kubernetes الحالي.

7da53b9480e8eb0d.png

  1. عند تشغيل الأمر لأول مرة سيظهر موجه في أعلى الشاشة يسألك عما إذا كنت تريد سياق kubernetes الحالي، حدد "نعم" قبول السياق الحالي واستخدامه.

a6e58a7f0d117391.png

  1. بعد ذلك، سيتم عرض طلب يسأل عن قاعدة بيانات المسجّلين في الحاوية المطلوب استخدامها. اضغط على مفتاح Enter لقبول القيمة التلقائية المقدَّمة.

13236a26c8dbe84f.png

  1. اختَر علامة التبويب "الإخراج" في الجزء السفلي وKubernetes: تشغيل/تصحيح الأخطاء في القائمة المنسدلة لعرض مستوى التقدّم والإشعارات.

606ff9cdebc03dff.png

  1. اختَر "Kubernetes: تشغيل/تصحيح الأخطاء - مفصّل" في القائمة المنسدلة للقناة على اليسار لعرض تفاصيل إضافية وسجلات البث المباشر من الحاويات.

ab45d2574f4f2478.png

  1. يمكنك الرجوع إلى طريقة العرض المبسّطة من خلال اختيار "Kubernetes: Run/Debug". من القائمة المنسدلة
  2. عند الانتهاء من عملية الإنشاء والاختبار، تعرض علامة التبويب "الإخراج" ما يلي: Resource deployment/mynodejsapp status completed successfully، ويظهر عنوان URL: "عنوان URL تمت إعادة توجيهه من تطبيق تجريبي للخدمة: http://localhost:8080"
  3. في الوحدة الطرفية لرمز السحابة الإلكترونية، مرِّر مؤشر الماوس فوق عنوان URL في الإخراج (http://localhost:8080)، ثم في نصيحة الأداة التي تظهر، اختَر "متابعة الرابط".

سيكون الرد:

{"message":"Greetings from Node"}

إعادة التحميل السريع

  1. الانتقال إلى src/index.js تعديل رمز رسالة الترحيب إلى 'Hello from Node'

لاحظ على الفور أنّه في نافذة Output، عرض Kubernetes: Run/Debug، يزامن المُشاهد الملفات المعدّلة مع الحاوية في Kubernetes.

Update initiated
File sync started for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
File sync succeeded for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Update succeeded
  1. في حال التبديل إلى الملف الشخصي "Kubernetes: Run/Debug - Detailed"، ستلاحظ أنّ الملف سيتعرّف على التغييرات في الملفات ويعيد تشغيل العقدة.
files modified: [src/index.js]
Copying files:map[src/index.js:[/workspace/src/index.js]]togcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Syncing 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Watching for changes...
[mynodejsapp]
[mynodejsapp]> mynodejsapp@1.0.0 start /workspace
[mynodejsapp]> node src/index.js
[mynodejsapp]
[mynodejsapp]Server running at: http://localhost:8080/
  1. يُرجى إعادة تحميل صفحة المتصفّح للاطّلاع على النتائج المعدّلة.

تصحيح الأخطاء

  1. الانتقال إلى عرض تصحيح الأخطاء وإيقاف سلسلة المحادثات الحالية 647213126d7a4c7b.png
  2. انقر على Cloud Code في القائمة في أسفل الشاشة واختَر Debug on Kubernetes لتشغيل التطبيق في وضع "debug".

dbd0c6cfd9e9d0e9.png

  • في عرض Kubernetes Run/Debug - Detailed لنافذة Output، لاحظ أن skaffold سينشر هذا التطبيق في وضع تصحيح الأخطاء.
  • سيستغرق إنشاء التطبيق ونشره بضع دقائق. ستلاحظ إرفاق برنامج تصحيح أخطاء هذه المرة.
Port forwarding pod/mynodejsapp-6bbcf847cd-vqr6v in namespace default, remote port 9229 -> http://127.0.0.1:9229
[mynodejsapp]Debugger attached.
  1. يغيِّر شريط الحالة السفلي لونه من الأزرق إلى البرتقالي للإشارة إلى أنّه في وضع تصحيح الأخطاء.

d1224f12cd659995.png

  1. في طريقة العرض "Kubernetes Run/Debug"، ستلاحظ بدء حاوية قابلة لتصحيح الأخطاء.
**************URLs*****************
Forwarded URL from service mynodejsapp-service: http://localhost:8080
Debuggable container started pod/mynodejsapp-deployment-6bc7598798-xl9kj:mynodejsapp (default)
Update succeeded
***********************************

استخدام نقاط الإيقاف

  1. فتح src/index.js
  2. حدِّد العبارة التي نصّها var message="Hello from Node";.
  3. أضف نقطة توقف إلى هذا السطر بالنقر على المساحة الفارغة على يمين رقم السطر. سيظهر مؤشر أحمر للإشارة إلى ضبط نقطة الإيقاف.
  4. أعد تحميل المتصفح ولاحظ أن برنامج تصحيح الأخطاء يوقف العملية عند نقطة التوقف ويسمح لك بالتحقيق في متغيرات التطبيق وحالته التي تعمل عن بُعد في GKE.
  5. انقر للأسفل في قسم "المتغيّرات" حتى تعثر على المتغيّر "message".
  6. نفِّذ الخط من خلال الضغط على الخطوة فوق 7cfdee4fd6ef5c3a.png.
  7. يُرجى ملاحظة القيمة الحالية للتغيير في متغير "message" إلى "Hello from Node"
  8. انقر مرّتين على اسم المتغيّر "target". وفي النافذة المنبثقة، غيِّر القيمة إلى قيمة مختلفة، مثل "Hi from Node".
  9. انقر على الزر "متابعة" في لوحة تحكم تصحيح الأخطاء.
  10. يمكنك مراجعة الردّ في متصفّحك الذي يعرض الآن القيمة المعدّلة التي أدخلتها للتو.
  11. إيقاف "تصحيح الأخطاء" بالضغط على زر الإيقاف 647213126d7a4c7b.png وإزالة نقطة الإيقاف من خلال النقر على نقطة الإيقاف مرة أخرى.

6- تطوير خدمة CRUD Rest بسيطة

في هذه المرحلة، تم ضبط تطبيقك بالكامل للتطوير المجمّع، وقد اطّلعت على خطوات سير عمل التطوير الأساسي باستخدام Cloud Code. في الأقسام التالية، يمكنك ممارسة ما تعلمته من خلال إضافة نقاط نهاية خدمة REST المتصلة بقاعدة بيانات مُدارة في Google Cloud.

إعداد التبعيات

يستخدم رمز التطبيق قاعدة بيانات للاحتفاظ بباقي بيانات الخدمة. تأكَّد من توفُّر الاعتماديات من خلال إضافة ما يلي في ملف package.json.

  1. أضف تبعيتين إضافيتين pg وsequelize إلى ملف package.json لإنشاء تطبيق CRUD Postgres. نشر التغييرات سيظهر قسم التبعيات على هذا النحو.
    "dependencies": {
    "express": "^4.17.3",
    "pg": "^8.8.0",
    "sequelize": "^6.25.7"
  }

ترميز خدمة REST

  1. إضافة رمز تطبيق CRUD إلى هذا التطبيق
wget -O app.zip https://github.com/GoogleCloudPlatform/container-developer-workshop/raw/main/labs/nodejs/app.zip

unzip app.zip

يحتوي هذا الرمز على

  • المجلد models مع نموذج الكيان لـ item.
  • controllers بالرمز الذي يجري عمليات CRUD
  • توجيه مجلد يوجِّه أنماط عناوين URL معيّنة إلى مكالمات مختلفة
  • مجلد الضبط يحتوي على تفاصيل اتصال قاعدة البيانات
  1. يُرجى العلم أنّ إعداد قاعدة البيانات في ملف db.config.js يشير إلى متغيّرات البيئة التي يجب توفيرها للاتصال بقاعدة البيانات. عليك أيضًا تحليل الطلب الوارد لترميز عناوين URL.
  2. أضف مقتطف الرمز التالي في src/index.js لتتمكن من الاتصال برمز CRUD من ملف JavaScript الرئيسي مباشرة قبل القسم الأخير الذي يبدأ بـ app.listen(PORT, () => {
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(
 bodyParser.urlencoded({
   extended: true,
 })
)
const db = require("../app/models");
db.sequelize.sync();
require("../app/routes/item.routes")(app);
  1. عدِّل عملية النشر في ملف deployment.yaml لإضافة متغيّرات البيئة لتوفير معلومات اتصال قاعدة البيانات.

عدِّل إدخال المواصفات في نهاية الملف ليتطابق مع التعريف التالي.

    spec:
      containers:
      - name: mynodejsapp
        image: mynodejsapp
        env:
        - name: DB_HOST
          value: ${DB_INSTANCE_IP}        
        - name: DB_PORT
          value: "5432"  
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: database
  1. استبدل القيمة DB_HOST بعنوان قاعدة البيانات
export DB_INSTANCE_IP=$(gcloud sql instances describe mytest-instance \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")

envsubst < deployment.yaml > deployment.new && mv deployment.new deployment.yaml

نشر التطبيق والتحقّق من صحته

  1. في الجزء السفلي من "محرِّر Cloud Shell"، اختَر Cloud Code ثم اختَر Debug on Kubernetes في أعلى الشاشة.
  2. عند الانتهاء من عملية الإنشاء والاختبار، تعرض علامة التبويب "الإخراج" ما يلي: Resource deployment/mynodejsapp status completed successfully، ويظهر عنوان URL: "عنوان URL تمت إعادة توجيهه من الخدمة mynodejsapp: http://localhost:8080"
  3. يمكنك إضافة بعض العناصر.

من Cloudshell Terminal، شغِّل الأوامر أدناه

URL=localhost:8080
curl -X POST $URL/items -d '{"itemName":"Body Spray", "itemPrice":3.2}' -H "Content-Type: application/json"
curl -X POST $URL/items -d '{"itemName":"Nail Cutter", "itemPrice":2.5}' -H "Content-Type: application/json"
  1. اختبر GET عن طريق تشغيل $URL/items في المتصفح. يمكنك أيضًا تشغيل الضفير من سطر الأوامر
curl -X GET $URL/items
  1. اختبار الحذف: حاول الآن حذف عنصر عن طريق تشغيل الأمر أدناه. غيِّر قيمة معرّف السلعة إذا لزم الأمر.
curl -X DELETE $URL/items/1
    This throws an error message
{"message":"Could not delete Item with id=[object Object]"}

تحديد المشكلة وحلّها

  1. يعمل التطبيق في وضع تصحيح الأخطاء. لذا استخدم نقاط التوقف للعثور على المشكلة. إليك بعض النصائح:
  • نعلم أنّ هناك خطأ في أمر DELETE لأنّه لا يؤدي إلى عرض النتيجة المطلوبة. لذلك يمكنك تحديد نقطة الإيقاف باستخدام الطريقة itemcontroller.js->exports.delete.
  • يمكنك تنفيذ عملية التنفيذ خطوة بخطوة ومراقبة المتغيّرات في كل خطوة لملاحظة قيم المتغيّرات المحلية في النافذة اليمنى.
  • لمراقبة قيم معيّنة مثل request.params، أضِف هذا المتغيّر إلى نافذة المشاهدة.
  1. لاحِظ أنّ القيمة المخصّصة للدالة id هي undefined. غيِّر الرمز لحلّ المشكلة.

سيبدو مقتطف الرمز الثابت على النحو التالي.

// Delete a Item with the specified id in the request
exports.delete = (req, res) => {
    const id = req.params.id;
  1. بعد إعادة تشغيل التطبيق، اختبره مرة أخرى من خلال محاولة الحذف.
  2. أوقِف جلسة تصحيح الأخطاء بالنقر على المربّع الأحمر في شريط أدوات تصحيح الأخطاء 647213126d7a4c7b.png.

7. تنظيف

تهانينا لقد أنشأت في هذا التمرين المعملي تطبيق Nodejs جديد من البداية وتهيئته ليعمل في وضع النشر النشط باستخدام الحاويات. ثم نشرت تطبيقك وصحّحته على مجموعة GKE بعيدة وفقًا لمسار المطوّرين نفسه المتوفّر في حِزم التطبيقات التقليدية.

لتنظيف البيانات بعد الانتهاء من التمرين المعملي:

  1. حذف الملفات المستخدمة في التمرين المعملي
cd ~ && rm -rf mynodejsapp && rm -f setup.sh
  1. حذف المشروع لإزالة جميع البنية التحتية والموارد ذات الصلة