توسعه محلی با توابع ابری برای Node.js با استفاده از کد ویژوال استودیو

۱. مرور کلی

Google Cloud Functions یک پلتفرم محاسباتی بدون سرور مبتنی بر رویداد است. Cloud Functions به شما امکان می‌دهد بدون نگرانی در مورد تأمین منابع یا مقیاس‌پذیری برای رسیدگی به نیازهای متغیر، کد خود را بنویسید.

توابع ابری نوشته شده با جاوا اسکریپت در محیط Node.js در پلتفرم ابری گوگل اجرا می‌شوند. می‌توانید تابع ابری خود را در هر محیط استاندارد Node.js اجرا کنید تا قابلیت حمل و آزمایش محلی را فعال کنید.

پیاده روی

در این آزمایشگاه کد، شما یک تابع ابری برای Node.js ایجاد خواهید کرد که گزارش می‌دهد آیا دمای مشخص شده قابل قبول است یا خیلی گرم است. شما تابع ابری خود را با استفاده از Visual Studio Code روی دستگاه محلی خود ایجاد، آزمایش و اشکال‌زدایی خواهید کرد. در نهایت، تابع خود را در پلتفرم ابری گوگل مستقر خواهید کرد.

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

  • چارچوب توابع برای Node.js.
  • یک تابع HTTP Cloud را به صورت محلی ایجاد و آزمایش کنید.
  • اشکال‌زدایی یک تابع HTTP از دستگاه محلی شما.
  • یک تابع HTTP را از دستگاه محلی خود مستقر کنید.

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

پیش‌نیازها

هزینه‌ها

اگرچه این آزمایشگاه کد فقط به یک بار فراخوانی یک تابع ابری مستقر نیاز دارد، اما شما همچنان باید برای درک نحوه‌ی عملکرد صورتحساب ، به اطلاعات قیمت‌گذاری API توابع ابری مراجعه کنید.

در حالی که بسیاری از APIهای گوگل را می‌توان بدون هزینه استفاده کرد، استفاده از پلتفرم ابری گوگل (یعنی محصولات و APIهای آن) رایگان نیست. برای استفاده از توابع ابری به یک حساب کاربری فعال نیاز دارید. به خاطر داشته باشید که برخی از محصولات پلتفرم ابری گوگل (GCP) دارای یک سطح "همیشه رایگان" هستند که برای دریافت صورتحساب باید از آن سطح فراتر بروید. برای اهداف آزمایشگاه کد، هر فراخوانی توابع ابری در آن سطح رایگان حساب می‌شود. تا زمانی که در مجموع (در هر ماه) در محدوده آن بمانید، نباید هیچ هزینه‌ای متحمل شوید.

۳. نصب چارچوب توابع برای Node.js

چارچوب توابع برای Node.js یک چارچوب FaaS (تابع به عنوان سرویس) متن‌باز برای نوشتن توابع قابل حمل Node.js است که توسط تیم توابع Google Cloud در اختیار شما قرار گرفته است.

چارچوب توابع به شما امکان می‌دهد توابع سبکی بنویسید که در محیط‌های مختلف اجرا می‌شوند، از جمله:

  • عملکردهای گوگل کلود
  • دستگاه توسعه محلی شما
  • اجرای ابری و اجرای ابری روی GKE
  • محیط‌های مبتنی بر Knative

یک برنامه جدید node.js ایجاد کنید.

npm init

هنگام پذیرش پیش‌فرض‌ها، مطمئن شوید که از index.js به عنوان نقطه ورود برنامه خود استفاده می‌کنید.

حالا فریم‌ورک توابع برای Node.js را نصب کنید.

npm install @google-cloud/functions-framework

فایل package.json خود را باز کنید. تأیید کنید که functions framework به عنوان یک وابستگی، همانطور که در مثال زیر نشان داده شده است، فهرست شده است.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

اکنون چارچوب توابع با موفقیت نصب شده است. اکنون آماده ایجاد تابع ابری خود هستید.

۴. یک تابع HTTP Cloud را به صورت محلی ایجاد و آزمایش کنید

یک تابع ابری محلی ایجاد کنید

در این بخش، شما یک تابع HTTP ایجاد و آزمایش خواهید کرد که به درخواست‌های HTTP پاسخ می‌دهد.

یک فایل جدید به نام index.js در همان دایرکتوری که فایل package.json شما قرار دارد، ایجاد کنید.

موارد زیر را اضافه کنید:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

اکنون آماده آزمایش تابع هستید.

تابع تست در ویژوال استودیو کد

از این نقطه به بعد، این آزمایشگاه کد از ترمینال یکپارچه درون ویژوال استودیو کد استفاده می‌کند.

در ویژوال استودیو کد، یک پنجره ترمینال باز کنید.

دستور زیر را اجرا کنید:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

این دستور یک سرور محلی را راه‌اندازی می‌کند که آماده است تا تابع validateTemperature را هنگام دریافت درخواست HTTP فراخوانی کند.

باید خروجی زیر را در پنجره ترمینال خود مشاهده کنید:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

با کلیک روی آیکون New Terminal plus در پنل پنجره ترمینال، یک پنجره ترمینال دوم در VS Code ایجاد کنید. شما بین این دو پنجره ترمینال جابجا خواهید شد: اولی برای ارائه تابع و دومی برای فراخوانی تابع با استفاده از curl.

bceb65f366d837ae.png

شما می‌توانید با استفاده از منوی کشویی بین پنجره‌های ترمینال جابجا شوید. اگر یک پنجره ترمینال در حال حاضر در حال ارائه یک تابع باشد، لیست کشویی به آن به عنوان node اشاره می‌کند. در غیر این صورت به zsh (یا پوسته‌ای که استفاده می‌کنید) اشاره می‌کند.

در پنجره ترمینال دوم، دستور زیر را اجرا کنید تا یک payload مربوط به دما با مقدار ۵۰ به سرور محلی که تابع validateTemperature را ارائه می‌دهد، ارسال شود.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

شما باید پاسخ زیر را از تابع ابری دریافت کنید:

Temperature OK

در پنجره ترمینال دوم، با ارسال یک payload با عنوان "too high" temperature، همانطور که در زیر نشان داده شده است، دوباره تابع را آزمایش کنید:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

شما باید پاسخ زیر را از تابع ابری دریافت کنید:

Too hot

در نهایت، تابع را با فراخوانی آن با یک payload مفقود شده، آزمایش کنید.

curl -X POST http://localhost:8080

شما باید پاسخ زیر را از تابع ابری دریافت کنید:

Too hot

در حالت ایده‌آل، اگر دمایی ارائه نشود، تابع نباید مقدار «خیلی گرم» را برگرداند. شما یک اشکال در کد کشف کرده‌اید.

با فشردن Ctrl + C در اولین پنجره ترمینال که تابع شما در آن اجرا می‌شود، از اجرای آن جلوگیری کنید.

۵. اشکال‌زدایی یک تابع HTTP از دستگاه محلی شما

پالت فرمان (Command Palette) را در ویژوال استودیو کد باز کنید. اگر از مک استفاده می‌کنید، از Cmd + Shift + P و اگر از ویندوز استفاده می‌کنید، از Ctrl + Shift + P. استفاده کنید.

در پنل فرمان، auto attach تایپ کنید و بالاترین مورد را در لیست انتخاب کنید.

601e542b4ec9f6f9.png

برای این codelab، همانطور که در تصویر زیر نشان داده شده است، گزینه Only With Flag را انتخاب کنید:

b9e6b762d150e62b.png

اکنون با نگه داشتن نشانگر ماوس روی آیکون هشداری که در سمت راست ظاهر می‌شود، پنجره ترمینالی را که در VS Code برای ارائه تابع خود استفاده کردید، مجدداً بارگذاری کنید.

روی Relaunch Terminal کلیک کنید.

37b61e3fb546fc76.png

از پنجره ترمینال بارگذاری مجدد شده، چارچوب توابع را برای ارائه تابع خود با استفاده از دستور زیر دوباره اجرا کنید:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

که در آن، پرچم --inspect به Node.js می‌گوید که به یک کلاینت اشکال‌زدایی گوش دهد. برای اطلاعات بیشتر، لطفاً به مستندات Node در مورد اشکال‌زدایی مراجعه کنید.

توجه داشته باشید که شما به جای node_modules/ @google-cloud /functions-framework از node_modules/ .bin /functions-framework استفاده می‌کنید. برای استفاده از حالت بازرسی، باید از فایل اجرایی که به صورت خودکار با لینک‌های نمادین در /node_modules/.bin ایجاد شده است، استفاده کنید.

این بار باید یک نوار وضعیت نارنجی در VS Code ببینید که نشان می‌دهد اشکال‌زدا متصل شده است.

با کلیک کردن در حاشیه سمت چپ شماره خط، یک نقطه توقف در خط ۳ تعیین کنید.

2fbb4d5916e1dbfa.png

آیکون نقطه توقف باید به رنگ قرمز روشن روشن شود، که نشان می‌دهد این خط کد توسط اشکال‌زدا قابل دسترسی است.

846e6c5993cc87f9.png

در پنجره ترمینال دوم، با اجرای دستور curl زیر، به نقطه توقف (breakpoint) ضربه بزنید.

curl -X POST http://localhost:8080 

خواهید دید که یک هایلایت زرد روی خط ۳ ظاهر می‌شود. این هایلایت نشان می‌دهد که این خط، دستور فعلی است که توسط دیباگر ارزیابی می‌شود.

206c7ed1eb189e90.png

برای تأیید اینکه محتوای متغیر temp undefined است، ماوس را روی آن ببرید، زیرا درخواست، payload مربوط به دما را ارائه نکرده است.

97979025f4bf2842.png

برای اجرای دستور بعدی، روی آیکون گام به گام کلیک کنید.

خواهید دید که دستور فعلی به بخش else دستور if می‌پرد.

cf0e8ce7e0388f98.png

برای این نسخه آزمایشی، می‌توانید فرض کنید که مشخصات، ارسال دمای خوانده شده توسط همه درخواست‌ها را الزامی می‌کند. در صورت عدم ارائه دمای خوانده شده، تابع باید یک استثنا ایجاد کند.

برای قطع اتصال دیباگر، روی دکمه‌ی Disconnect کلیک کنید.

1070d059775ad769.png

در اولین پنجره ترمینال خود، با فشردن Ctrl + C اجرای تابع خود را متوقف کنید.

تابع خود را به‌روزرسانی کنید تا یک عبارت if اضافه کنید تا در صورت تعریف‌نشده بودن دما، مانند زیر، استثنا ایجاد کند:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

در اولین پنجره ترمینال خود، با اجرای دستور زیر بدون استفاده از فلگ –inspect برای جلوگیری از اتصال دیباگر، دوباره اجرای تابع cloud خود را آغاز کنید.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

با اجرای دستور زیر در پنجره ترمینال دوم خود، تأیید کنید که یک استثنا ایجاد شده است:

curl -X POST http://localhost:8080 

باید خروجی زیر را از درخواست خود مشاهده کنید:

Temperature is undefined

در اولین پنجره ترمینال خود، خطای ثبت شده توسط تابع خود را نیز مشاهده خواهید کرد.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

اکنون می‌توانید با فشردن کلیدهای Ctrl + C در اولین پنجره ترمینال، اجرای تابع خود را متوقف کنید.

۶. یک تابع HTTP را از دستگاه محلی خود در Google Cloud مستقر کنید

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

با اجرای دستور زیر، تأیید کنید که از پروژه‌ای که در مرحله ۲ ایجاد کرده‌اید، به صورت محلی استفاده می‌کنید:

gcloud config get-value project

اگر پروژه‌ای که در مرحله ۲ مشخص کردید، پیکربندی فعال نیست، دستور زیر را اجرا کنید:

gcloud config set project <project-name-created-step-2>

در هر پنجره ترمینال، دستور زیر را اجرا کنید:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

که در آن پارامترها به شرح زیر توضیح داده می‌شوند:

  • deploy validateTemperature - زیردستور gcloud برای استقرار یک تابع ابری با نام validateTemperature با یک نقطه ورود به نام validateTemperature
  • --trigger-http - نوع رویداد آغازگر
  • --runtime nodejs12 - زمان اجرای مورد نظر برای این تابع
  • --allow-unauthenticated - اجازه دسترسی عمومی برای فراخوانی تابع را می‌دهد.

از شما خواسته می‌شود که APIهای توابع ابری را فعال کنید. برای فعال کردن APIها، y را تایپ کنید.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

پس از اتمام استقرار، خروجی زیر را مشاهده خواهید کرد:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

در پنجره ترمینال خود، از curl برای فراخوانی این نقطه پایانی عمومی استفاده کنید.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

و با تأیید پاسخ مناسب، تأیید کنید که عملکرد ابری شما با موفقیت مستقر شده است.

Temperature OK

۷. تمیز کردن

برای جلوگیری از هزینه‌های ناخواسته، مثلاً این تابع ابری سهواً بیشتر از تخصیص ماهانه فراخوانی تابع ابری شما در سطح رایگان فراخوانی می‌شود، می‌توانید تابع ابری یا پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید حذف کنید.

برای حذف تابع ابری، به کنسول ابری تابع ابری در آدرس https://console.cloud.google.com/functions/ بروید. مطمئن شوید پروژه‌ای که در مرحله ۲ ایجاد کرده‌اید، پروژه انتخاب شده فعلی است.

تابع validateTemperature که در مرحله 6 پیاده‌سازی کردید را انتخاب کنید. سپس روی Delete کلیک کنید.

4dada486485a935a.png

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به آدرس https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و گزینه حذف را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.

۸. تبریک می‌گویم!

تبریک می‌گویم که این آزمایشگاه کد را تکمیل کردید. می‌توانید اطلاعات بیشتری در مورد نحوه پشتیبانی Cloud Functions از زمان اجرای Node.js و نحوه اشکال‌زدایی محلی با Cloud Functions کسب کنید.

آنچه ما پوشش داده‌ایم

  • چارچوب توابع برای Node.js.
  • یک تابع HTTP Cloud را به صورت محلی ایجاد و آزمایش کنید.
  • اشکال‌زدایی یک تابع HTTP از دستگاه محلی شما.
  • یک تابع HTTP را از دستگاه محلی خود مستقر کنید.