NodeJS এর ​​সাথে InnerLoop ডেভেলপমেন্ট

১. সংক্ষিপ্ত বিবরণ

এই ল্যাবটি এমন সব ফিচার ও সক্ষমতা প্রদর্শন করে, যা কন্টেইনারাইজড পরিবেশে NodeJS অ্যাপ্লিকেশন তৈরির দায়িত্বে থাকা সফটওয়্যার ইঞ্জিনিয়ারদের জন্য ডেভেলপমেন্ট ওয়ার্কফ্লোকে সহজ ও সাবলীল করার উদ্দেশ্যে ডিজাইন করা হয়েছে। সাধারণ কন্টেইনার ডেভেলপমেন্টের জন্য ব্যবহারকারীকে কন্টেইনার এবং কন্টেইনার বিল্ড প্রসেসের খুঁটিনাটি বিষয়গুলো বুঝতে হয়। এছাড়াও, ডেভেলপারদের প্রায়শই তাদের কাজের ধারাবাহিকতা ভেঙে দূরবর্তী পরিবেশে অ্যাপ্লিকেশন পরীক্ষা ও ডিবাগ করার জন্য IDE থেকে বেরিয়ে যেতে হয়। এই টিউটোরিয়ালে উল্লিখিত টুলস এবং প্রযুক্তিগুলোর সাহায্যে ডেভেলপাররা তাদের IDE না ছেড়েই কন্টেইনারাইজড অ্যাপ্লিকেশন নিয়ে কার্যকরভাবে কাজ করতে পারবেন।

আপনি যা শিখবেন

এই ল্যাবে আপনি GCP-তে কন্টেইনার ব্যবহার করে ডেভেলপ করার পদ্ধতিগুলো শিখবেন, যার মধ্যে অন্তর্ভুক্ত রয়েছে:

  • একটি স্টার্টার Nodejs অ্যাপ্লিকেশন তৈরি করা
  • কন্টেইনার ডেভেলপমেন্টের জন্য নোডজেএস অ্যাপ্লিকেশন কনফিগার করা
  • একটি সাধারণ CRUD রেস্ট সার্ভিস কোডিং করা
  • GKE-তে স্থাপন করা হচ্ছে
  • একটি ত্রুটিপূর্ণ অবস্থা ডিবাগ করা
  • ব্রেকপয়েন্ট / লগ ব্যবহার করা
  • GKE-তে পরিবর্তনগুলি হট ডিপ্লয় করা হচ্ছে
  • ঐচ্ছিক: ব্যাকএন্ড ডেটা সংরক্ষণের জন্য ক্লাউডএসকিউএল (CloudSQL) একীভূত করা

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না, এবং আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে প্রজেক্ট আইডি অবশ্যই অনন্য হতে হবে এবং এটি অপরিবর্তনীয় (একবার সেট করার পর পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এবং এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়), তাই যদি এটি আপনার পছন্দ না হয়, তবে এলোমেলোভাবে অন্য একটি তৈরি করুন, অথবা, আপনি নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এরপর প্রজেক্ট তৈরি হয়ে গেলে এটি "স্থির" হয়ে যায়।
  • তৃতীয় আরেকটি ভ্যালু আছে, যা হলো প্রজেক্ট নম্বর এবং কিছু এপিআই এটি ব্যবহার করে। এই তিনটি ভ্যালু সম্পর্কে আরও জানতে ডকুমেন্টেশন দেখুন।
  1. এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর যাতে কোনো বিলিং না হয়, সেজন্য রিসোর্সগুলো বন্ধ করতে কোডল্যাবের শেষে দেওয়া যেকোনো "ক্লিন-আপ" নির্দেশাবলী অনুসরণ করুন। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউডশেল এডিটর শুরু করুন

এই ল্যাবটি গুগল ক্লাউড শেল এডিটর-এর সাথে ব্যবহারের জন্য ডিজাইন ও পরীক্ষা করা হয়েছে। এডিটরটি অ্যাক্সেস করতে,

  1. আপনার গুগল প্রজেক্টটি https://console.cloud.google.com -এ অ্যাক্সেস করুন।
  2. উপরের ডান কোণায় ক্লাউড শেল এডিটর আইকনে ক্লিক করুন

8560cc8d45e8c112.png

  1. আপনার জানালার নিচের দিকে একটি নতুন কাচ খুলবে।
  2. ওপেন এডিটর বোতামে ক্লিক করুন

9e504cb98a6a8005.png

  1. এডিটরটি ডানদিকে একটি এক্সপ্লোরার এবং মাঝখানে এডিটর সহ খুলবে।
  2. স্ক্রিনের নীচে একটি টার্মিনাল পেইনও থাকা উচিত।
  3. টার্মিনাল খোলা না থাকলে, নতুন টার্মিনাল উইন্ডো খোলার জন্য `ctrl+` কী-সংমিশ্রণটি ব্যবহার করুন।

gcloud সেট আপ করুন

ক্লাউড শেলে, আপনার প্রজেক্ট আইডি এবং যে অঞ্চলে আপনার অ্যাপ্লিকেশনটি ডেপ্লয় করতে চান, তা সেট করুন। এগুলোকে PROJECT_ID এবং REGION ভেরিয়েবল হিসেবে সেভ করুন।

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

GKE ক্লাস্টার এবং ডাটাবেস সেট আপ করুন

  1. সেটআপ স্ক্রিপ্টটি ডাউনলোড করে এটিকে এক্সিকিউটেবল করুন।
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/setup.sh
chmod +x setup.sh

এই ল্যাবে ব্যবহৃত অবকাঠামো সরবরাহ করুন।

এই ল্যাবে আপনি GKE-তে কোড ডেপ্লয় করবেন এবং স্প্যানার ডেটাবেসে সংরক্ষিত ডেটা অ্যাক্সেস করবেন। নিচের সেটআপ স্ক্রিপ্টটি আপনার জন্য এই পরিকাঠামো প্রস্তুত করে দেবে।

  1. setup.sh ফাইলটি খুলুন এবং বর্তমানে CHANGEME-এ সেট করা পাসওয়ার্ডগুলির মান সম্পাদনা করুন।
  2. এই ল্যাবে ব্যবহারের জন্য একটি GKE ক্লাস্টার এবং একটি CloudSQL ডেটাবেস স্থাপন করতে সেটআপ স্ক্রিপ্টটি চালান।
./setup.sh
  1. ক্লাউড শেলে, mynodejsapp নামে একটি নতুন ডিরেক্টরি তৈরি করুন।
mkdir mynodejsapp
  1. এই ডিরেক্টরিতে যান এবং এটিকে একটি ওয়ার্কস্পেস হিসেবে খুলুন। এটি নতুন তৈরি হওয়া ফোল্ডারটিতে একটি ওয়ার্কস্পেস কনফিগারেশন তৈরি করে এডিটরটি রিলোড করবে।
cd mynodejsapp && cloudshell workspace .
  1. NVM ব্যবহার করে Node এবং NPM ইনস্টল করুন।
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/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 default values for the rest of the parameters. This will create the 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. একটি প্রবেশপথ যোগ করুন

এই ফাইলটি সম্পাদনা করে স্ক্রিপ্টে "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": "Your Name",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.4"
  }
}
  1. index.js ফাইলটি তৈরি করুন

src নামে একটি সোর্স ডিরেক্টরি তৈরি করুন।

নিম্নলিখিত কোড দিয়ে src/index.js তৈরি করুন।

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 তে সেট করা আছে।

ম্যানিফেস্ট তৈরি করুন

স্ক্যাফোল্ড কন্টেইনার ডেভেলপমেন্ট সহজ করার জন্য সমন্বিত টুল সরবরাহ করে। এই ধাপে আপনি স্ক্যাফোল্ড ইনিশিয়ালাইজ করবেন, যা স্বয়ংক্রিয়ভাবে বেস কুবারনেটিস YAML ফাইল তৈরি করবে। প্রক্রিয়াটি শুরু করতে নিচের কমান্ডটি চালান।

টার্মিনালে নিম্নলিখিত কমান্ডটি চালান।

skaffold init --generate-manifests

জিজ্ঞাসা করা হলে:

  • পোর্টের জন্য 8080 লিখুন।
  • কনফিগারেশন সংরক্ষণ করতে y লিখুন।

ওয়ার্কস্পেসে দুটি ফাইল যোগ করা হয়েছে, যথা, skaffold.yaml এবং deployment.yaml

অ্যাপের নাম আপডেট করুন

কনফিগারেশনে অন্তর্ভুক্ত ডিফল্ট মানগুলো বর্তমানে আপনার অ্যাপ্লিকেশনের নামের সাথে মিলছে না। ডিফল্ট মানগুলোর পরিবর্তে আপনার অ্যাপ্লিকেশনের নাম উল্লেখ করার জন্য ফাইলগুলো আপডেট করুন।

  1. স্ক্যাফোল্ড কনফিগে এন্ট্রি পরিবর্তন করুন
  • skaffold.yaml খুলুন
  • বর্তমানে package-json-image হিসেবে সেট করা ছবির নামটি নির্বাচন করুন।
  • ডান ক্লিক করুন এবং সমস্ত ঘটনা পরিবর্তন করুন নির্বাচন করুন
  • নতুন নাম হিসেবে mynodejsapp টাইপ করুন।
  1. Kubernetes কনফিগে এন্ট্রি পরিবর্তন করুন
  • deployment.yaml ফাইলটি খুলুন
  • বর্তমানে package-json-image হিসেবে সেট করা ছবির নামটি নির্বাচন করুন।
  • ডান ক্লিক করুন এবং সমস্ত ঘটনা পরিবর্তন করুন নির্বাচন করুন
  • নতুন নাম হিসেবে mynodejsapp টাইপ করুন।

লক্ষ্য করুন যে skaffold.yaml ফাইলের build সেকশনে অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করার জন্য buildpacks ব্যবহার করা হয়েছে। এই কোডে কোনো ডকারফাইল (Dockerfile) নেই এবং এই অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করার জন্য ডেভেলপারের ডকার (docker) সম্পর্কে কোনো জ্ঞানের প্রয়োজন নেই।

এছাড়াও, এই স্কাফোল্ড কনফিগারেশনের মাধ্যমে এডিটর এবং চলমান কন্টেইনারের মধ্যে হট সিঙ্ক স্বয়ংক্রিয়ভাবে সক্রিয় হয়ে যায়। হট সিঙ্ক সক্রিয় করার জন্য কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন নেই।

৪. উন্নয়ন প্রক্রিয়াটি পর্যালোচনা করা

এই অংশে আপনি ক্লাউড কোড প্লাগইন ব্যবহার করে কয়েকটি ধাপ অনুসরণ করার মাধ্যমে মৌলিক প্রক্রিয়াগুলো শিখবেন এবং আপনার স্টার্টার অ্যাপ্লিকেশনের কনফিগারেশন ও সেটআপ যাচাই করবেন।

ক্লাউড কোড আপনার ডেভেলপমেন্ট প্রক্রিয়াকে সুবিন্যস্ত করতে স্ক্যাফোল্ডের সাথে সমন্বিত হয়। যখন আপনি পরবর্তী ধাপগুলোতে GKE-তে ডিপ্লয় করবেন, ক্লাউড কোড এবং স্ক্যাফোল্ড স্বয়ংক্রিয়ভাবে আপনার কন্টেইনার ইমেজ তৈরি করবে, সেটিকে একটি কন্টেইনার রেজিস্ট্রি-তে পুশ করবে এবং তারপর আপনার অ্যাপ্লিকেশনটি GKE-তে ডিপ্লয় করবে। এই পুরো প্রক্রিয়াটি নেপথ্যে সম্পন্ন হয়, যা ডেভেলপারের কাজের ধারা থেকে খুঁটিনাটি বিষয়গুলো আড়াল করে রাখে। এছাড়াও, ক্লাউড কোড কন্টেইনার-ভিত্তিক ডেভেলপমেন্টে প্রচলিত ডিবাগ এবং হটসিঙ্ক সুবিধা প্রদান করে আপনার ডেভেলপমেন্ট প্রক্রিয়াকে আরও উন্নত করে।

কুবারনেটিসে ডিপ্লয় করুন

  1. Cloud Shell Editor-এর নিচের প্যানে, Cloud Code নির্বাচন করুন।

fdc797a769040839.png

  1. উপরে প্রদর্শিত প্যানেলে, ‘Run on Kubernetes’ নির্বাচন করুন। অনুরোধ করা হলে, বর্তমান Kubernetes কনটেক্সট ব্যবহার করার জন্য ‘Yes’ নির্বাচন করুন।

cfce0d11ef307087.png

  1. প্রথমবার কমান্ডটি চালালে স্ক্রিনের উপরে একটি প্রম্পট আসবে, যেখানে জিজ্ঞাসা করা হবে আপনি বর্তমান কুবারনেটিস কনটেক্সটটি চান কিনা। বর্তমান কনটেক্সটটি গ্রহণ ও ব্যবহার করতে 'Yes' নির্বাচন করুন।

817ee33b5b412ff8.png

  1. এরপর কোন কন্টেইনার রেজিস্ট্রি ব্যবহার করতে হবে তা জানতে চেয়ে একটি প্রম্পট প্রদর্শিত হবে। প্রদত্ত ডিফল্ট মানটি গ্রহণ করতে এন্টার চাপুন।

eb4469aed97a25f6.png

  1. অগ্রগতি এবং বিজ্ঞপ্তি দেখতে নিচের প্যানেলে আউটপুট ট্যাবটি নির্বাচন করুন।

f95b620569ba96c5.png

  1. কন্টেইনারগুলো থেকে সরাসরি সম্প্রচারিত অতিরিক্ত বিবরণ এবং লগ দেখতে ডানদিকের চ্যানেল ড্রপ-ডাউন থেকে 'Kubernetes: Run/Debug - Detailed' নির্বাচন করুন।

94acdcdda6d2108.png

  1. ড্রপডাউন থেকে 'Kubernetes: Run/Debug' নির্বাচন করে সরলীকৃত ভিউতে ফিরে যান।
  2. যখন বিল্ড এবং টেস্ট সম্পন্ন হয়, তখন আউটপুট ট্যাবে লেখা থাকে: Resource deployment/mynodejsapp status completed successfully , এবং একটি ইউআরএল তালিকাভুক্ত হয়: "Forwarded URL from service demo-app: http://localhost:8080"
  3. ক্লাউড কোড টার্মিনালে, আউটপুটে থাকা URL-টির (http://localhost:8080) উপর মাউস রাখুন এবং তারপরে যে টুল টিপটি প্রদর্শিত হবে, সেখান থেকে 'Open Web Preview' নির্বাচন করুন।

উত্তরটি হবে:

{"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 view-তে যান, তাহলে লক্ষ্য করবেন যে এটি ফাইলের পরিবর্তন শনাক্ত করে এবং নোডটি পুনরায় চালু করে।
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. অ্যাপ্লিকেশনটি debug মোডে চালানোর জন্য নিচের মেনুতে থাকা Cloud Code -এ ক্লিক করুন এবং Debug on Kubernetes নির্বাচন করুন।
  • Kubernetes Run/Debug - Detailed view of Output উইন্ডোতে লক্ষ্য করুন যে, skaffold এই অ্যাপ্লিকেশনটি ডিবাগ মোডে ডেপ্লয় করবে।
  • অ্যাপ্লিকেশনটি বিল্ড এবং ডেপ্লয় হতে কয়েক মিনিট সময় লাগবে। এবার আপনি লক্ষ্য করবেন যে একটি ডিবাগার সংযুক্ত হয়েছে।
Port forwarding pod/mynodejsapp-6bbcf847cd-vqr6v in namespace default, remote port 9229 -> http://127.0.0.1:9229
[mynodejsapp]Debugger attached.
  1. নিচের স্ট্যাটাস বারটির রঙ নীল থেকে কমলায় পরিবর্তিত হলে তা ডিবাগ মোডে থাকার ইঙ্গিত দেয়।
  2. 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="Greetings from Node"; এই স্টেটমেন্টটি খুঁজুন।
  3. লাইন নম্বরের বাম পাশের ফাঁকা জায়গায় ক্লিক করে ওই লাইনে একটি ব্রেকপয়েন্ট যোগ করুন। ব্রেকপয়েন্ট সেট করা হয়েছে তা বোঝাতে একটি লাল ইন্ডিকেটর দেখা যাবে।
  4. আপনার ব্রাউজারটি রিলোড করুন এবং লক্ষ্য করুন যে ডিবাগারটি ব্রেকপয়েন্টে প্রসেসটিকে থামিয়ে দেয় এবং আপনাকে GKE-তে দূরবর্তীভাবে চলমান অ্যাপ্লিকেশনটির ভেরিয়েবল ও অবস্থা খতিয়ে দেখার সুযোগ করে দেয়।
  5. ভেরিয়েবল সেকশনের গভীরে ক্লিক করতে থাকুন যতক্ষণ না "message" ভেরিয়েবলটি খুঁজে পান।
  6. Step over চেপে লাইনটি কার্যকর করুন। 7cfdee4fd6ef5c3a.png
  7. লক্ষ্য করুন "message" ভেরিয়েবলের বর্তমান মান পরিবর্তিত হয়ে "Greetings from Node" হয়েছে।
  8. 'target' ভেরিয়েবলটির উপর ডাবল ক্লিক করুন এবং পপ-আপে এর মান পরিবর্তন করে "Hello from Node"
  9. ডিবাগ কন্ট্রোল প্যানেলে থাকা কন্টিনিউ বাটনে ক্লিক করুন।
  10. আপনার ব্রাউজারে প্রাপ্ত প্রতিক্রিয়াটি পর্যালোচনা করুন, যেখানে এখন আপনার এইমাত্র প্রবেশ করানো হালনাগাদ মানটি দেখাচ্ছে।
  11. স্টপ বাটন টিপে 'ডিবাগ' মোড বন্ধ করুন। 647213126d7a4c7b.png এবং ব্রেকপয়েন্টটিতে আবার ক্লিক করে সেটি সরিয়ে ফেলুন।

৫. একটি সহজ CRUD রেস্ট সার্ভিস তৈরি করা

এই পর্যায়ে আপনার অ্যাপ্লিকেশনটি কন্টেইনারাইজড ডেভেলপমেন্টের জন্য সম্পূর্ণরূপে কনফিগার করা হয়েছে এবং আপনি ক্লাউড কোড ব্যবহার করে বেসিক ডেভেলপমেন্ট ওয়ার্কফ্লোটি সম্পন্ন করেছেন। পরবর্তী বিভাগগুলিতে, আপনি গুগল ক্লাউডের একটি ম্যানেজড ডেটাবেসের সাথে সংযোগকারী রেস্ট সার্ভিস এন্ডপয়েন্ট যুক্ত করার মাধ্যমে আপনার শেখা বিষয়গুলো অনুশীলন করবেন।

নির্ভরতা কনফিগার করুন

অ্যাপ্লিকেশন কোডটি রেস্ট সার্ভিসের ডেটা সংরক্ষণের জন্য একটি ডেটাবেস ব্যবহার করে। package.json ফাইলে নিম্নলিখিতটি যোগ করে ডিপেন্ডেন্সিগুলো উপলব্ধ আছে কিনা তা নিশ্চিত করুন।

  1. পোস্টগ্রেস ব্যবহার করে একটি CRUD অ্যাপ্লিকেশন বিল্ড করার জন্য package.json ফাইলে আরও দুটি ডিপেন্ডেন্সি, pg এবং sequelize যোগ করুন। পরিবর্তনের পর ডিপেন্ডেন্সি সেকশনটি দেখতে এইরকম হবে।
    "dependencies": {
    "express": "^4.16.4",
    "pg": "^8.7.3",
    "sequelize": "^6.17.0"
  }

REST পরিষেবাটি কোড করুন

  1. এই অ্যাপ্লিকেশনে CRUD অ্যাপ্লিকেশন কোড যোগ করুন
wget -O app.zip https://github.com/GoogleCloudPlatform/container-developer-workshop/raw/main/labs/nodejs/app.zip

unzip app.zip

এই কোডটিতে আছে

  • item জন্য এনটিটি মডেল সহ মডেল ফোল্ডার
  • কন্ট্রোলার ফোল্ডারে CRUD অপারেশনগুলো সম্পাদনকারী কোড থাকে।
  • রাউটস ফোল্ডার যা নির্দিষ্ট ইউআরএল প্যাটার্নকে বিভিন্ন কলে রাউট করে
  • ডাটাবেস সংযোগের বিবরণ সহ কনফিগ ফোল্ডার
  1. উল্লেখ্য db.config.js ফাইলের ডাটাবেস কনফিগারেশনটি সেই এনভায়রনমেন্ট ভেরিয়েবলগুলোকে নির্দেশ করে, যেগুলো ডাটাবেসের সাথে সংযোগ স্থাপনের জন্য সরবরাহ করতে হয়। এছাড়াও, ইউআরএল এনকোডিংয়ের জন্য আপনাকে আগত অনুরোধটি পার্স করতে হবে।
  2. আপনার প্রধান জাভাস্ক্রিপ্ট ফাইল থেকে CRUD কোডের সাথে সংযোগ করতে, src/index.js ফাইলে 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 Editor-এর নিচের প্যানে Cloud Code নির্বাচন করুন, তারপর স্ক্রিনের উপরে Debug on Kubernetes নির্বাচন করুন।
  2. যখন বিল্ড এবং টেস্ট সম্পন্ন হয়, তখন আউটপুট ট্যাবে লেখা থাকে: Resource deployment/mynodejsapp status completed successfully , এবং একটি ইউআরএল তালিকাভুক্ত হয়: "Forwarded URL from service mynodejsapp: http://localhost:8080"
  3. কয়েকটি আইটেম যোগ করুন।

ক্লাউডশেল টার্মিনাল থেকে নিচের কমান্ডগুলো চালান।

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. টেস্ট ডিলিট: এখন রান করে একটি আইটেম ডিলিট করার চেষ্টা করুন। প্রয়োজনে আইটেম-আইডি-র মান পরিবর্তন করুন।
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

৬. পরিষ্কার-পরিচ্ছন্নতা

অভিনন্দন! এই ল্যাবে আপনি একেবারে শুরু থেকে একটি নতুন Nodejs অ্যাপ্লিকেশন তৈরি করেছেন এবং এটিকে কন্টেইনারের সাথে হট ডিপ্লয়মেন্ট মোডে কাজ করার জন্য কনফিগার করেছেন। এরপর, প্রচলিত অ্যাপ্লিকেশন স্ট্যাকে পাওয়া ডেভেলপার ফ্লো অনুসরণ করে আপনি আপনার অ্যাপ্লিকেশনটি একটি রিমোট GKE ক্লাস্টারে ডিপ্লয় ও ডিবাগ করেছেন।

ল্যাব শেষ করার পর পরিষ্কার করার জন্য:

  1. ল্যাবে ব্যবহৃত ফাইলগুলো মুছে ফেলুন।
cd ~ && rm -rf mynodejsapp && rm -f setup.sh
  1. সম্পর্কিত সমস্ত অবকাঠামো ও রিসোর্স অপসারণ করতে প্রজেক্টটি ডিলিট করুন।