توسعه InnerLoop با استفاده از ایستگاه های کاری ابری با NodeJS

۱. مرور کلی

این آزمایشگاه ویژگی‌ها و قابلیت‌هایی را نشان می‌دهد که برای ساده‌سازی گردش کار توسعه برای مهندسان نرم‌افزاری که وظیفه توسعه برنامه‌های NodeJS در یک محیط کانتینری را بر عهده دارند، طراحی شده‌اند. توسعه کانتینر معمولاً مستلزم آن است که کاربر جزئیات کانتینرها و فرآیند ساخت کانتینر را درک کند. علاوه بر این، توسعه‌دهندگان معمولاً باید جریان خود را بشکنند و از IDE خود خارج شوند تا برنامه‌های خود را در محیط‌های از راه دور آزمایش و اشکال‌زدایی کنند. با ابزارها و فناوری‌های ذکر شده در این آموزش، توسعه‌دهندگان می‌توانند بدون ترک IDE خود، به طور مؤثر با برنامه‌های کانتینری کار کنند.

آنچه یاد خواهید گرفت

در این آزمایشگاه روش‌های توسعه با کانتینرها در Google Cloud را خواهید آموخت، از جمله:

  • ایجاد یک برنامه اولیه Nodejs
  • پیکربندی برنامه Nodejs برای توسعه کانتینر
  • کدنویسی یک سرویس استراحت CRUD ساده
  • استقرار در GKE
  • اشکال‌زدایی یک حالت خطا
  • استفاده از نقاط شکست/گزارش‌ها
  • تغییرات استقرار سریع (Hot Deploying) به GKE برمی‌گردند
  • اختیاری: ادغام CloudSQL برای پایداری backend

58a4cdd3ed7a123a.png

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

ویرایشگر Cloudshell را شروع کنید

این آزمایشگاه برای استفاده با ویرایشگر پوسته ابری گوگل (Google Cloud Shell Editor) طراحی و آزمایش شده است. برای دسترسی به ویرایشگر،

  1. برای دسترسی به پروژه گوگل خود به آدرس https://console.cloud.google.com مراجعه کنید.
  2. در گوشه بالا سمت راست، روی آیکون ویرایشگر پوسته ابری کلیک کنید.

8560cc8d45e8c112.png

  1. یک پنل جدید در پایین پنجره شما باز خواهد شد
  2. روی دکمه باز کردن ویرایشگر کلیک کنید

9e504cb98a6a8005.png

  1. ویرایشگر با یک کاوشگر در سمت راست و ویرایشگر در ناحیه مرکزی باز خواهد شد.
  2. یک پنجره ترمینال نیز باید در پایین صفحه نمایش موجود باشد
  3. اگر ترمینال باز نیست، از ترکیب کلیدهای `ctrl+`` برای باز کردن یک پنجره ترمینال جدید استفاده کنید.

جی کلود را تنظیم کنید

در 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. ایستگاه‌های کاری ابری را در کنسول ابری باز کنید. منتظر بمانید تا کلاستر در وضعیت READY قرار گیرد.

305e1a3d63ac7ff6.png

ایجاد پیکربندی ایستگاه‌های کاری

  1. اگر اتصال Cloud Shell شما قطع شده است، روی "Reconnect" کلیک کنید و سپس دستور 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. نتایج را در بخش تنظیمات تأیید کنید. 2 دقیقه طول می‌کشد تا به وضعیت آماده (READY) برسید.

c8f0b8662fdb827e.png

  1. Cloud Workstations را در کنسول باز کنید و یک نمونه جدید ایجاد کنید.

a53adeeac81a78c8.png

  1. نام را به my-workstation تغییر دهید و پیکربندی موجود را انتخاب کنید: codeoss-js .

675d83f30c1319df.png

  1. نتایج را در بخش Workstations تأیید کنید.

bf67586e6695852.png

ایستگاه کاری را راه اندازی کنید

  1. ایستگاه کاری را شروع و اجرا کنید. شروع به کار ایستگاه کاری چند دقیقه طول خواهد کشید.

a9ad54f4b4b668e9.png

  1. با کلیک روی نماد در نوار آدرس، کوکی‌های شخص ثالث را مجاز کنید. ۱b8923e2943f9bc4.png

fcf9405b6957b7d7.png

  1. روی «سایت کار نمی‌کند؟» کلیک کنید.

36a84c0e2e3b85b.png

  1. روی «اجازه دادن به کوکی‌ها» کلیک کنید.

۲۲۵۹۶۹۴۳۲۸۶۲۸fba.png

  1. پس از راه‌اندازی ایستگاه کاری، خواهید دید که Code OSS IDE ظاهر می‌شود. در صفحه شروع به کار، روی «Mark Done» در صفحه اول IDE ایستگاه کاری کلیک کنید.

۹۴۸۷۴fba9b74cc22.png

۳. ایجاد یک برنامه‌ی آغازین جدید Nodejs

در این بخش، یک برنامه جدید Nodejs ایجاد خواهید کرد.

  1. یک ترمینال جدید باز کنید.

c31d48f2e4938c38.png

  1. در Cloud Shell، یک دایرکتوری جدید با نام mynodejsapp ایجاد کنید.
mkdir mynodejsapp

اگر این پیام را مشاهده کردید، روی دکمه‌ی «اجازه دادن» کلیک کنید تا بتوانید در ایستگاه کاری کپی پیست کنید.

58149777e5cc350a.png

  1. به این پوشه بروید و آن را به عنوان یک فضای کاری باز کنید. این کار ویرایشگر را با ایجاد پیکربندی فضای کاری در پوشه تازه ایجاد شده، مجدداً بارگذاری می‌کند.
cd mynodejsapp && code-oss-cloud-workstations -r --folder-uri="$PWD"
  1. دوباره یک ترمینال جدید باز کنید. Node و 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

۴. یک برنامه‌ی آغازین جدید ایجاد کنید

  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 در اسکریپت "start": "node src/index.js", . پس از تغییر، اسکریپت‌ها باید مانند قطعه کد زیر باشند:

"scripts": {
    "start": "node src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  1. وابستگی اکسپرس را اضافه کنید

کدی که قرار است اضافه کنیم نیز 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 را ایجاد کنید

با انتخاب گزینه New Folder در پنجره اکسپلورر، یک دایرکتوری منبع به نام 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 را راه‌اندازی اولیه خواهید کرد که به طور خودکار فایل‌های YAML پایه kubernetes را ایجاد می‌کند. برای شروع فرآیند، دستور زیر را اجرا کنید.

دستور زیر را در ترمینال اجرا کنید

skaffold init --generate-manifests

وقتی از شما خواسته شد:

  • برای پورت، عدد ۸۰۸۰ را وارد کنید.
  • برای ذخیره تنظیمات، y را وارد کنید.

دو فایل به فضای کاری اضافه می‌شوند، یعنی skaffold.yaml و deployment.yaml

نام برنامه را به‌روزرسانی کنید

مقادیر پیش‌فرض موجود در پیکربندی در حال حاضر با نام برنامه شما مطابقت ندارند. فایل‌ها را به‌روزرسانی کنید تا به جای مقادیر پیش‌فرض، به نام برنامه شما ارجاع دهند.

  1. تغییر ورودی‌ها در پیکربندی Skaffold
  • skaffold.yaml را باز کنید.
  • نام تصویری که در حال حاضر به عنوان package-json-image تنظیم شده است را انتخاب کنید.
  • کلیک راست کرده و گزینه Change All Occurrences را انتخاب کنید.
  • نام جدید را mynodejsapp تایپ کنید.
  1. تغییر ورودی‌ها در پیکربندی Kubernetes
  • فایل deployment.yaml را باز کنید
  • نام تصویری که در حال حاضر به عنوان package-json-image تنظیم شده است را انتخاب کنید.
  • کلیک راست کرده و گزینه Change All Occurrences را انتخاب کنید.
  • نام جدید را mynodejsapp تایپ کنید.

توجه داشته باشید که در فایل skaffold.yaml ، بخش build buildpacks برای کانتینرایز کردن برنامه استفاده می‌کند. این کد Dockerfile ندارد و توسعه‌دهنده برای کانتینرایز کردن این برنامه به هیچ دانشی در مورد docker نیاز ندارد.

همچنین، همگام‌سازی سریع (hot sync) به طور خودکار بین ویرایشگر و کانتینر در حال اجرا توسط این پیکربندی skaffold فعال می‌شود. برای فعال کردن همگام‌سازی سریع نیازی به پیکربندی اضافی نیست.

۵. گام برداشتن در مسیر توسعه

در این بخش، چند مرحله را با استفاده از افزونه Cloud Code طی خواهید کرد تا فرآیندهای اولیه را بیاموزید و پیکربندی و راه‌اندازی برنامه اولیه خود را تأیید کنید.

Cloud Code با skaffold ادغام می‌شود تا فرآیند توسعه شما را ساده‌تر کند. وقتی در مراحل بعدی در GKE مستقر می‌شوید، Cloud Code و Skaffold به طور خودکار تصویر کانتینر شما را می‌سازند، آن را به یک رجیستری کانتینر منتقل می‌کنند و سپس برنامه شما را در GKE مستقر می‌کنند. این اتفاق در پشت صحنه رخ می‌دهد و جزئیات را از جریان توسعه‌دهنده جدا می‌کند. Cloud Code همچنین با ارائه قابلیت‌های اشکال‌زدایی سنتی و همگام‌سازی سریع به توسعه مبتنی بر کانتینر، فرآیند توسعه شما را بهبود می‌بخشد.

وارد فضای ابری گوگل شوید

  1. روی آیکون Cloud Code کلیک کنید و گزینه «ورود به سیستم Google Cloud» را انتخاب کنید:

۱۷۶۹afd39be372ff.png

  1. روی «ادامه برای ورود» کلیک کنید.

۹۲۳bb1c8f63160f9.png

  1. خروجی را در ترمینال بررسی کنید و لینک را باز کنید:

517fdd579c34aa21.png

  1. با اعتبارنامه‌های دانشجویی Qwiklabs خود وارد شوید.

db99b345f7a8e72c.png

  1. گزینه "مجاز" را انتخاب کنید:

a5376553c430ac84.png

  1. کد تأیید را کپی کنید و به برگه Workstation برگردید.

6719421277b92eac.png

  1. کد تأیید را جایگذاری کنید و Enter را بزنید.

e9847cfe3fa8a2ce.png

اضافه کردن کلاستر Kubernetes

  1. اضافه کردن یک خوشه

62a3b97bdbb427e5.png

  1. موتور گوگل کوبرنتیز را انتخاب کنید:

9577de423568bbaa.png

  1. انتخاب پروژه.

c5202fcbeebcd41c.png

  1. "mycluster" که در تنظیمات اولیه ایجاد شده بود را انتخاب کنید.

۳۳۸۶۳e۹۴d1c5045f.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. در پنلی که در بالا و زیر DEVELOPMENT SESSIONS ظاهر می‌شود، گزینه Run on Kubernetes را انتخاب کنید. در صورت درخواست، برای استفاده از زمینه فعلی Kubernetes، گزینه Yes را انتخاب کنید.

7da53b9480e8eb0d.png

  1. اولین باری که دستور را اجرا می‌کنید، پیامی در بالای صفحه ظاهر می‌شود که از شما می‌پرسد آیا می‌خواهید از چارچوب فعلی kubernetes استفاده کنید یا خیر. برای پذیرش و استفاده از چارچوب فعلی، «بله» را انتخاب کنید.

a6e58a7f0d117391.png

  1. در مرحله بعد، پیامی نمایش داده می‌شود که از شما می‌پرسد از کدام رجیستری کانتینر استفاده کنید. برای پذیرش مقدار پیش‌فرض ارائه شده، Enter را فشار دهید.

۱۳۲۳۶a۲۶c۸dbe۸۴f.png

  1. برای مشاهده پیشرفت و اعلان‌ها، برگه «خروجی» را در پنل پایین و Kubernetes: Run/Debug را در منوی کشویی انتخاب کنید.

606ff9cdebc03dff.png

  1. برای مشاهده جزئیات بیشتر و گزارش‌های زنده از کانتینرها، در منوی کشویی سمت راست، گزینه "Kubernetes: Run/Debug - Detailed" را انتخاب کنید.

ab45d2574f4f2478.png

  1. با انتخاب "Kubernetes: Run/Debug" از منوی کشویی، به نمای ساده‌شده برگردید.
  2. وقتی ساخت و آزمایش‌ها انجام شد، در برگه خروجی نوشته می‌شود: Resource deployment/mynodejsapp status completed successfully ، و یک آدرس اینترنتی فهرست شده است: "URL ارسال شده از سرویس demo-app: http://localhost:8080"
  3. در ترمینال Cloud Code، نشانگر ماوس را روی URL موجود در خروجی (http://localhost:8080) نگه دارید و سپس در ابزار نمایش داده شده، گزینه Follow Link را انتخاب کنید.

پاسخ این خواهد بود:

{"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. به نمای اشکال‌زدایی (Debug view) بروید و رشته فعلی را متوقف کنید. ۶۴۷۲۱۳۱۲۶d7a4c7b.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. نوار وضعیت پایین، رنگ خود را از آبی به نارنجی تغییر می‌دهد که نشان می‌دهد در حالت اشکال‌زدایی (Debug mode) است.

d1224f12c659995.png

  1. در نمای Kubernetes Run/Debug ، توجه کنید که یک کانتینر Debuggable آغاز شده است.
**************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. با فشار دادن Step over، خط را اجرا کنید. 7cfdee4fd6ef5c3a.png
  7. مشاهده می‌کنید که مقدار فعلی متغیر "message" به "Hello from Node" تغییر یافته است.
  8. روی متغیر «target» دوبار کلیک کنید و در پنجره باز شده، مقدار آن را به چیزی متفاوت مانند "Hi from Node" تغییر دهید.
  9. روی دکمه ادامه در پنل کنترل اشکال‌زدایی کلیک کنید
  10. پاسخ را در مرورگر خود بررسی کنید که اکنون مقدار به‌روزرسانی‌شده‌ای را که وارد کرده‌اید نشان می‌دهد.
  11. با فشار دادن دکمه توقف، حالت «اشکال‌زدایی» را متوقف کنید ۶۴۷۲۱۳۱۲۶d7a4c7b.png و با کلیک مجدد روی نقطه شکست، آن را حذف کنید.

۶. توسعه یک سرویس ساده CRUD Rest

در این مرحله، برنامه شما به طور کامل برای توسعه کانتینری پیکربندی شده است و شما گردش کار اولیه توسعه را با Cloud Code طی کرده‌اید. در بخش‌های بعدی، آموخته‌های خود را با اضافه کردن نقاط پایانی سرویس REST که به یک پایگاه داده مدیریت‌شده در Google Cloud متصل می‌شوند، تمرین خواهید کرد.

پیکربندی وابستگی‌ها

کد برنامه از یک پایگاه داده برای ذخیره داده‌های سرویس rest استفاده می‌کند. با اضافه کردن موارد زیر در فایل package.json از در دسترس بودن وابستگی‌ها اطمینان حاصل کنید.

  1. دو وابستگی دیگر را به sequelize pg اضافه کنید و به فایل 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
  • پوشه کنترلرها حاوی کدی است که عملیات CRUD را انجام می‌دهد.
  • پوشه مسیرها که الگوهای URL خاص را به فراخوانی‌های مختلف هدایت می‌کند
  • پوشه پیکربندی حاوی جزئیات اتصال به پایگاه داده
  1. توجه داشته باشید که پیکربندی پایگاه داده در فایل db.config.js به متغیرهای محیطی اشاره دارد که برای اتصال به پایگاه داده باید ارائه شوند. همچنین باید درخواست ورودی را برای کدگذاری url تجزیه کنید.
  2. قطعه کد زیر را در src/index.js اضافه کنید تا بتوانید درست قبل از آخرین بخشی که با app.listen(PORT, () => { شروع می‌شود، به کد CRUD از فایل اصلی جاوا اسکریپت خود متصل شوید.
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 ارسال شده از سرویس mynodejsapp: http://localhost:8080"
  3. یکی دو مورد اضافه کنید.

از ترمینال cloudshell، دستورات زیر را اجرا کنید

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. با اجرای دستور $URL/items در مرورگر، GET را آزمایش کنید. همچنین می‌توانید curl را از خط فرمان اجرا کنید.
curl -X GET $URL/items
  1. حذف آزمایشی: اکنون با اجرای دستور زیر سعی کنید یک آیتم را حذف کنید. در صورت لزوم، مقدار item-id را تغییر دهید.
curl -X DELETE $URL/items/1
    This throws an error message
{"message":"Could not delete Item with id=[object Object]"}

شناسایی و رفع مشکل

  1. برنامه در حالت اشکال‌زدایی (Debug mode) اجرا می‌شود. بنابراین از نقاط توقف (breakpoints) برای یافتن مشکل استفاده کنید. در اینجا چند نکته وجود دارد:
  • ما می‌دانیم که مشکلی در DELETE وجود دارد زیرا نتیجه دلخواه را برنمی‌گرداند. بنابراین، شما باید نقطه توقف را در متد itemcontroller.js -> exports.delete تنظیم کنید.
  • اجرای گام به گام را اجرا کنید و متغیرها را در هر مرحله زیر نظر داشته باشید تا مقادیر متغیرهای محلی را در پنجره سمت چپ مشاهده کنید.
  • برای مشاهده مقادیر خاص مانند request.params این متغیر را به پنجره Watch اضافه کنید.
  1. توجه داشته باشید که مقداری که به id اختصاص داده شده است undefined است. برای رفع مشکل، کد را تغییر دهید.

قطعه کد ثابت به این شکل خواهد بود.

// Delete a Item with the specified id in the request
exports.delete = (req, res) => {
    const id = req.params.id;
  1. پس از راه‌اندازی مجدد برنامه، دوباره با تلاش برای حذف، آن را امتحان کنید.
  2. با کلیک روی مربع قرمز در نوار ابزار اشکال‌زدایی، جلسه اشکال‌زدایی را متوقف کنید. ۶۴۷۲۱۳۱۲۶d7a4c7b.png

۷. پاکسازی

تبریک! در این آزمایش شما یک برنامه Nodejs جدید را از ابتدا ایجاد و آن را برای کار در حالت استقرار داغ با کانتینرها پیکربندی کرده‌اید. سپس برنامه خود را طبق همان جریان توسعه‌دهنده‌ای که در پشته‌های برنامه سنتی یافت می‌شود، در یک خوشه GKE از راه دور مستقر و اشکال‌زدایی کرده‌اید.

برای تمیز کردن پس از اتمام آزمایشگاه:

  1. فایل‌های استفاده شده در آزمایشگاه را حذف کنید
cd ~ && rm -rf mynodejsapp && rm -f setup.sh
  1. پروژه را حذف کنید تا تمام زیرساخت‌ها و منابع مرتبط حذف شوند.