১. ভূমিকা
সর্বশেষ হালনাগাদ: ২০২০-০৫-০৫
মাইক্রোসার্ভিসেস ব্যাটল এরিনা
কখনো কি এমন বরফ ছোড়াছুড়ির খেলায় অংশ নিয়েছেন যেখানে আপনি ঘুরে ঘুরে মজা করে অন্যদের দিকে বরফের গোলা ছুঁড়ে মারেন? যদি না নিয়ে থাকেন, তবে কোনো একদিন চেষ্টা করে দেখুন! কিন্তু এখন শারীরিকভাবে আঘাত পাওয়ার ঝুঁকি নেওয়ার পরিবর্তে, আপনি একটি ছোট, নেটওয়ার্কে প্রবেশযোগ্য সার্ভিস (একটি মাইক্রোসার্ভিস) তৈরি করতে পারেন যা অন্য মাইক্রোসার্ভিসগুলোর বিরুদ্ধে এক মহাকাব্যিক যুদ্ধে অংশ নেবে। আর যেহেতু আমরা এই মাইক্রোসার্ভিস যুদ্ধটি Spring I/O-তে আয়োজন করছি, তাই আমাদের মাইক্রোসার্ভিসগুলো বরফের গোলার পরিবর্তে হ্যাম ছুঁড়বে।
আপনি হয়তো ভাবছেন... কিন্তু একটি মাইক্রোসার্ভিস কীভাবে অন্য মাইক্রোসার্ভিসগুলোর দিকে জামোন (এক প্রকার স্যান্ডউইচ) ছুঁড়ে মারে? একটি মাইক্রোসার্ভিস নেটওয়ার্ক রিকোয়েস্ট (সাধারণত HTTP-এর মাধ্যমে) গ্রহণ করতে এবং রেসপন্স ফেরত পাঠাতে পারে। এখানে একটি "অ্যারেনা ম্যানেজার" থাকে, যা আপনার মাইক্রোসার্ভিসকে অ্যারেনার বর্তমান অবস্থা পাঠিয়ে দেয় এবং এরপর আপনার মাইক্রোসার্ভিসটি কী করতে হবে তা নির্দিষ্ট করে একটি কমান্ডের মাধ্যমে সাড়া দেয়।
অবশ্যই লক্ষ্য হলো জেতা, কিন্তু এই যাত্রাপথে আপনি গুগল ক্লাউডে মাইক্রোসার্ভিস তৈরি ও স্থাপন করা সম্পর্কেও শিখবেন।
এটি কীভাবে কাজ করে
আপনি আপনার পছন্দের যেকোনো প্রযুক্তি ব্যবহার করে একটি মাইক্রোসার্ভিস তৈরি করবেন (অথবা জাভা, কোটলিন বা স্কালা স্টার্টার থেকে বেছে নিতে পারেন) এবং তারপর মাইক্রোসার্ভিসটি গুগল ক্লাউডে ডেপ্লয় করবেন। ডেপ্লয় করার পর, আপনি একটি ফর্ম পূরণ করে আপনার মাইক্রোসার্ভিসটির ইউআরএল আমাদের জানাবেন এবং তারপর আমরা সেটিকে এরিনাতে যুক্ত করে দেব।
একটি নির্দিষ্ট লড়াইয়ের জন্য ময়দানে সকল খেলোয়াড় থাকে। স্প্রিং আই/ও ব্রিজ সম্মেলনের নিজস্ব একটি ময়দান থাকবে। প্রতিটি খেলোয়াড় একটি মাইক্রোসার্ভিসের প্রতিনিধিত্ব করে, যা ঘুরে বেড়ায় এবং অন্য খেলোয়াড়দের দিকে হ্যাম ছুঁড়ে মারে।
প্রায় প্রতি সেকেন্ডে একবার আমাদের এরিনা ম্যানেজার আপনার মাইক্রোসার্ভিসকে কল করবে এবং এরিনার বর্তমান অবস্থা (খেলোয়াড়রা কোথায় আছে) পাঠাবে, এবং আপনার মাইক্রোসার্ভিস কী করতে হবে তার জন্য একটি কমান্ড দিয়ে সাড়া দেবে। এরিনার মধ্যে আপনি সামনে এগোতে, বামে বা ডানে ঘুরতে, অথবা একটি জামোন ছুঁড়তে পারেন। ছোঁড়া জামোনটি খেলোয়াড় যেদিকে মুখ করে আছে, সেই দিকে সর্বোচ্চ তিন ঘর পর্যন্ত যাবে। যদি একটি জামোন অন্য কোনো খেলোয়াড়কে "আঘাত" করে, তবে নিক্ষেপকারী এক পয়েন্ট পায় এবং আঘাতপ্রাপ্ত খেলোয়াড় এক পয়েন্ট হারায়। খেলোয়াড়ের বর্তমান সংখ্যা অনুযায়ী এরিনার আকার স্বয়ংক্রিয়ভাবে সামঞ্জস্য করা হয়।
তিনজন কাল্পনিক খেলোয়াড় নিয়ে আখড়াটি দেখতে এইরকম:

উদাহরণ যুদ্ধ জামোন এরিনা
আবর্তনশীল সংঘাত
খেলার মাঠে একাধিক খেলোয়াড় পরস্পরবিরোধী কাজ করার চেষ্টা করতে পারে। উদাহরণস্বরূপ, দুজন খেলোয়াড় একই ঘরে যাওয়ার চেষ্টা করতে পারে। কোনো বিরোধের ক্ষেত্রে, সবচেয়ে দ্রুত প্রতিক্রিয়া জানানো মাইক্রোসার্ভিসটি বিজয়ী হয়।
যুদ্ধ দেখা
প্রতিযোগিতায় আপনার মাইক্রোসার্ভিসটি কেমন করছে তা দেখতে লাইভ এরিনাটি দেখুন !
যুদ্ধ এপিআই
আমাদের এরিনা ম্যানেজারের সাথে কাজ করার জন্য, আপনার মাইক্রোসার্ভিসকে এরিনাতে অংশগ্রহণের জন্য একটি নির্দিষ্ট এপিআই (API) ইমপ্লিমেন্ট করতে হবে। এরিনা ম্যানেজার আপনার দেওয়া ইউআরএল-এ একটি HTTP POST-এর মাধ্যমে নিম্নলিখিত JSON কাঠামোসহ এরিনার বর্তমান অবস্থা পাঠাবে:
{
"_links": {
"self": {
"href": "https://YOUR_SERVICE_URL"
}
},
"arena": {
"dims": [4,3], // width, height
"state": {
"https://A_PLAYERS_URL": {
"x": 0, // zero-based x position, where 0 = left
"y": 0, // zero-based y position, where 0 = top
"direction": "N", // N = North, W = West, S = South, E = East
"wasHit": false,
"score": 0
}
... // also you and the other players
}
}
}
আপনার HTTP রেসপন্সের স্ট্যাটাস কোড অবশ্যই 200 (OK) হতে হবে এবং এর রেসপন্স বডিতে আপনার পরবর্তী পদক্ষেপটি উল্লেখ থাকবে, যা নিম্নলিখিতগুলির মধ্যে যেকোনো একটির একটিমাত্র বড় হাতের অক্ষর দিয়ে এনকোড করা থাকবে:
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
এইটুকুই! চলুন ক্লাউড রান-এ একটি মাইক্রোসার্ভিস ডেপ্লয় করার প্রক্রিয়াটি দেখে নেওয়া যাক। ক্লাউড রান হলো মাইক্রোসার্ভিস এবং অন্যান্য অ্যাপ্লিকেশন চালানোর জন্য ব্যবহৃত একটি গুগল ক্লাউড পরিষেবা।
২. গুগল ক্লাউডে লগইন করুন
ক্লাউড রান-এ আপনার মাইক্রোসার্ভিস ডেপ্লয় করতে হলে আপনাকে গুগল ক্লাউডে লগইন করতে হবে। আমরা আপনার অ্যাকাউন্টে একটি ক্রেডিট যোগ করে দেব এবং আপনাকে কোনো ক্রেডিট কার্ডের তথ্য দিতে হবে না। সাধারণত GSuite অ্যাকাউন্টের পরিবর্তে একটি ব্যক্তিগত অ্যাকাউন্ট (যেমন gmail.com) ব্যবহার করা কম ঝামেলাপূর্ণ, কারণ কখনও কখনও GSuite অ্যাডমিনরা তাদের ব্যবহারকারীদের গুগল ক্লাউডের কিছু নির্দিষ্ট ফিচার ব্যবহার করতে বাধা দেন। এছাড়াও, আমরা যে ওয়েব কনসোলটি ব্যবহার করব, সেটি ক্রোম বা ফায়ারফক্সে খুব ভালোভাবে কাজ করলেও সাফারিতে সমস্যা হতে পারে।
৩. আপনার মাইক্রোসার্ভিস স্থাপন করা
আপনি যেকোনো প্রযুক্তি ব্যবহার করে আপনার মাইক্রোসার্ভিস তৈরি করতে পারেন এবং যেকোনো জায়গায় তা স্থাপন করতে পারেন, যতক্ষণ পর্যন্ত তা সর্বজনীনভাবে অ্যাক্সেসযোগ্য থাকে এবং ব্যাটল এপিআই (Battle API) মেনে চলে। কিন্তু কাজটি সহজ করার জন্য, আমরা আপনাকে একটি নমুনা সার্ভিস থেকে শুরু করতে এবং ক্লাউড রান-এ (Cloud Run) তা স্থাপন করতে সাহায্য করব।
শুরু করার জন্য আপনার নমুনা বেছে নিন
দুটি ব্যাটল মাইক্রোসার্ভিস স্যাম্পল রয়েছে যা থেকে আপনি শুরু করতে পারেন:
জাভা ও স্প্রিং বুট | ||
কোটলিন ও স্প্রিং বুট |
কোন স্যাম্পলটি দিয়ে শুরু করবেন তা ঠিক করার পর, উপরের "Deploy on Cloud Run" বোতামটিতে ক্লিক করুন। এটি ক্লাউড শেল (ক্লাউডের একটি ভার্চুয়াল মেশিনের ওয়েব-ভিত্তিক কনসোল) চালু করবে, যেখানে সোর্সটি ক্লোন করা হবে, তারপর একটি ডেপ্লয়েবল প্যাকেজ (একটি ডকার কন্টেইনার ইমেজ) হিসেবে বিল্ড করা হবে, যা পরবর্তীতে গুগল কন্টেইনার রেজিস্ট্রি- তে আপলোড করা হয় এবং তারপর ক্লাউড রান- এ ডেপ্লয় করা হয়।
জিজ্ঞাসা করা হলে us-central1 অঞ্চলটি উল্লেখ করুন।
নিচের স্ক্রিনশটটিতে মাইক্রোসার্ভিস বিল্ড এবং ডিপ্লয়মেন্টের জন্য ক্লাউড শেল আউটপুট দেখানো হয়েছে।

Verify the microservice works
ক্লাউড শেলে আপনি আপনার সদ্য ডেপ্লয় করা মাইক্রোসার্ভিসে একটি রিকোয়েস্ট পাঠাতে পারেন, যেখানে YOUR_SERVICE_URL এর জায়গায় আপনার সার্ভিসের URL-টি বসাতে হবে (যা ক্লাউড শেলে "Your application is now live here" লাইনের পরে থাকে):
curl -d '{
"_links": {
"self": {
"href": "https://foo.com"
}
},
"arena": {
"dims": [4,3],
"state": {
"https://foo.com": {
"x": 0,
"y": 0,
"direction": "N",
"wasHit": false,
"score": 0
}
}
}
}' -H "Content-Type: application/json" -X POST -w "\n" \
https://YOUR_SERVICE_URL
আপনি প্রতিক্রিয়া স্ট্রিং হিসেবে F, L, R, অথবা T দেখতে পাবেন।
৪. অ্যারেনাতে অন্তর্ভুক্তির জন্য অনুরোধ করুন
এরিনাতে অন্তর্ভুক্ত হতে হলে আপনাকে #battle-jamon চ্যানেলে আপনার নাম, ক্লাউড রান সার্ভিস ইউআরএল এবং ঐচ্ছিকভাবে আপনার অ্যাভাটার / প্রোফাইল ফটোর জন্য গিটহাব ইউজারনেম সহ একটি মেসেজ পাঠাতে হবে। আমরা তথ্যগুলো যাচাই করে নিলেই আপনার প্লেয়ারটি এরিনাতে প্রদর্শিত হবে।
৫. পরিবর্তনসমূহ তৈরি ও প্রয়োগ করুন
পরিবর্তন করার আগে আপনাকে ক্লাউড শেলে GCP প্রজেক্ট এবং আপনার ব্যবহৃত স্যাম্পল সম্পর্কে কিছু তথ্য সেটআপ করতে হবে। প্রথমে আপনার GCP প্রজেক্টগুলোর তালিকা করুন:
gcloud projects list
সম্ভবত আপনার একটিই প্রজেক্ট আছে। প্রথম কলাম থেকে PROJECT_ID কপি করে নিচের কমান্ডে পেস্ট করুন ( YOUR_PROJECT_ID এর জায়গায় আপনার আসল প্রজেক্ট আইডি বসান), যাতে একটি এনভায়রনমেন্ট ভ্যারিয়েবল সেট করা যায় যা আমরা পরবর্তী কমান্ডগুলোতে ব্যবহার করব:
export PROJECT_ID=YOUR_PROJECT_ID
এখন আপনার ব্যবহৃত স্যাম্পলটির জন্য আরেকটি এনভায়রনমেন্ট ভেরিয়েবল সেট করুন, যাতে পরবর্তী কমান্ডগুলোতে আমরা সঠিক ডিরেক্টরি এবং সার্ভিসের নাম উল্লেখ করতে পারি:
# Copy and paste ONLY ONE of these export SAMPLE=java-springboot export SAMPLE=kotlin-springboot
এখন, আপনি ক্লাউড শেল-এর ভেতর থেকে আপনার মাইক্রোসার্ভিসের সোর্স এডিট করতে পারবেন। ক্লাউড শেল ওয়েব-ভিত্তিক এডিটরটি খোলার জন্য, এই কমান্ডটি চালান:
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
এরপর পরিবর্তন করার জন্য আরও নির্দেশাবলী দেখতে পাবেন।

স্যাম্পল প্রজেক্টটি এডিটরসহ ক্লাউড শেলে খোলা আছে।
আপনার পরিবর্তনগুলি সংরক্ষণ করার পরে, ক্লাউড শেলে অ্যাপ্লিকেশনটি চালু করুন:
cd cloudbowl-microservice-game/samples/$SAMPLE ./mvnw spring-boot:run
অ্যাপ্লিকেশনটি চালু হয়ে গেলে, একটি নতুন ক্লাউড শেল ট্যাব খুলুন এবং curl ব্যবহার করে পরিষেবাটি পরীক্ষা করুন:
curl -d '{
"_links": {
"self": {
"href": "https://foo.com"
}
},
"arena": {
"dims": [4,3],
"state": {
"https://foo.com": {
"x": 0,
"y": 0,
"direction": "N",
"wasHit": false,
"score": 0
}
}
}
}' -H "Content-Type: application/json" -X POST -w "\n" \
http://localhost:8080
যখন আপনি আপনার পরিবর্তনগুলো ডেপ্লয় করার জন্য প্রস্তুত হবেন, তখন ক্লাউড শেলে pack কমান্ড ব্যবহার করে আপনার প্রজেক্টটি বিল্ড করুন। এই কমান্ডটি বিল্ডপ্যাকস (Buildpacks) ব্যবহার করে প্রজেক্টের ধরন শনাক্ত করে, সেটিকে কম্পাইল করে এবং ডেপ্লয়যোগ্য আর্টিফ্যাক্ট (একটি ডকার কন্টেইনার ইমেজ) তৈরি করে।
pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path ~/cloudbowl-microservice-game/samples/$SAMPLE \ --builder gcr.io/buildpacks/builder
এখন যেহেতু আপনার কন্টেইনার ইমেজটি তৈরি হয়ে গেছে, সেটিকে গুগল কন্টেইনার রেজিস্ট্রি-তে পুশ করার জন্য (ক্লাউড শেল-এ) ডকার কমান্ডটি ব্যবহার করুন, যাতে পরবর্তীতে ক্লাউড রান সেটিকে অ্যাক্সেস করতে পারে:
docker push gcr.io/$PROJECT_ID/$SAMPLE
এখন ক্লাউড রান-এ নতুন সংস্করণটি স্থাপন করুন:
gcloud run deploy $SAMPLE\
--project=$PROJECT_ID\
--platform=managed\
--region=us-central1\
--image=gcr.io/$PROJECT_ID/$SAMPLE\
--memory=512Mi\
--allow-unauthenticated
এখন এরিনা আপনার নতুন সংস্করণটি ব্যবহার করবে!
৬. অভিনন্দন
অভিনন্দন, আপনি সফলভাবে এমন একটি মাইক্রোসার্ভিস তৈরি ও স্থাপন করেছেন যা অন্যান্য মাইক্রোসার্ভিসের সাথে পাল্লা দিতে পারে! শুভকামনা!
শেখা চালিয়ে যান
রেফারেন্স নথি
৭. প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
আমার মাইক্রোসার্ভিসটি এরিনাতে দেখা যাচ্ছে না কেন?
চূড়ান্ত লড়াইটা কেমন চলছে?
চূড়ান্ত যুদ্ধের আগে আখড়াটি কীভাবে কাজ করে?
আমি কীভাবে জিতব?
আমি কি স্থানীয়ভাবে উন্নয়ন করতে পারি?