Google ক্লাউড প্ল্যাটফর্মের সাথে একটি কোটলিন স্প্রিং অ্যাপ্লিকেশন তৈরি করুন৷

১. ভূমিকা

স্প্রিং ফ্রেমওয়ার্ক ৫.০-তে কোটলিনের জন্য বিশেষ সাপোর্ট যুক্ত করা হয়েছে, যা কোটলিন ডেভেলপারদের জন্য স্প্রিং ব্যবহার করা সহজ করে তুলেছে। ফলস্বরূপ, এই পরিবর্তনগুলোর কারণে স্প্রিং ক্লাউড জিসিপি (Spring Cloud GCP) দ্বারা প্রদত্ত গুগল ক্লাউড ইন্টিগ্রেশনগুলোও কোটলিনে নির্বিঘ্নে কাজ করে। এই কোডল্যাবে আপনি দেখতে পাবেন, আপনার কোটলিন অ্যাপ্লিকেশনগুলোতে গুগল ক্লাউড পরিষেবাগুলো ব্যবহার শুরু করা কতটা সহজ!

এই কোডল্যাবটিতে কোটলিনে একটি সাধারণ রেজিস্ট্রেশন অ্যাপ্লিকেশন সেট আপ করার পদ্ধতি দেখানো হয়েছে, যেখানে ক্লাউড পাব/সাব এবং ক্লাউড এসকিউএল-এর মতো জিসিপি (GCP) পরিষেবাগুলির ব্যবহার প্রদর্শন করা হয়েছে।

আপনি যা তৈরি করবেন

এই কোডল্যাবে, আপনি একটি কোটলিন স্প্রিং বুট অ্যাপ্লিকেশন সেটআপ করবেন যা নিবন্ধনকারীর তথ্য গ্রহণ করে, সেটিকে একটি ক্লাউড পাব/সাব টপিকে প্রকাশ করে এবং একটি ক্লাউড মাইএসকিউএল ডেটাবেসে সংরক্ষণ করে।

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

আপনার কোটলিন স্প্রিং অ্যাপ্লিকেশনে গুগল ক্লাউড পরিষেবাগুলি কীভাবে ইন্টিগ্রেট করবেন।

আপনার যা যা লাগবে

  • একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রকল্প
  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

HTML/CSS ওয়েব অ্যাপ তৈরির অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

গুগল ক্লাউড প্ল্যাটফর্ম পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

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

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

  1. ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। (যদি আপনার আগে থেকে Gmail বা G Suite অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLpGtQd5Q55

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।

  1. এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে।

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

গুগল ক্লাউড শেল

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন। H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

আপনি যদি আগে কখনো ক্লাউড শেল চালু না করে থাকেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন (নিচে দেওয়া আছে) আপনার সামনে আসবে। যদি তাই হয়, তাহলে 'Continue'-তে ক্লিক করুন (এবং আপনি এটি আর কখনো দেখতে পাবেন না)। একবারের জন্য আসা সেই স্ক্রিনটি দেখতে এইরকম:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

ক্লাউড শেলে সংযুক্ত হওয়ার পর আপনি দেখতে পাবেন যে, আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।

  1. আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list

কমান্ড আউটপুট

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. পাব/সাব রিসোর্সের ব্যবস্থা করা

প্রথমে, আমাদের একটি ক্লাউড পাব/সাব টপিক এবং সাবস্ক্রিপশন সেটআপ করতে হবে। এই অ্যাপ্লিকেশনে, আমরা একটি পাব/সাব টপিকে রেজিস্ট্রেশনের তথ্য প্রকাশ করব; এরপর সেই তথ্য টপিকটি থেকে পড়ে একটি ডাটাবেসে সংরক্ষণ করা হবে।

এই টিউটোরিয়ালে, আমরা আমাদের রিসোর্সগুলো প্রোভিশন করার জন্য ক্লাউড শেল-এর উপর নির্ভর করব। উল্লেখ্য যে, গুগল ক্লাউড কনসোলের ক্লাউড পাব/সাব সেকশনের মাধ্যমেও পাব/সাব রিসোর্স কনফিগার করা যেতে পারে।

আপনার ক্লাউড শেল টার্মিনালে, প্রথমে পাব/সাব এপিআই (Pub/Sub API) সক্রিয় করুন।

$ gcloud services enable pubsub.googleapis.com

এরপরে, আমরা এই অ্যাপ্লিকেশনটির জন্য registrations নামে একটি পাব/সাব টপিক তৈরি করব। অ্যাপ্লিকেশনটির মাধ্যমে জমা দেওয়া রেজিস্ট্রেশনের তথ্য এই টপিকে প্রকাশ করা হবে।

$ gcloud pubsub topics create registrations

অবশেষে, টপিকটির জন্য একটি সাবস্ক্রিপশন তৈরি করুন। একটি পাব/সাব সাবস্ক্রিপশন আপনাকে কোনো টপিক থেকে মেসেজ গ্রহণ করতে সক্ষম করে।

$ gcloud pubsub subscriptions create registrations-sub --topic=registrations

আপনি এখন আপনার অ্যাপ্লিকেশনের জন্য একটি ক্লাউড পাব/সাব টপিক এবং সাবস্ক্রিপশন তৈরি করা সম্পন্ন করেছেন।

৪. একটি ক্লাউড SQL (MySQL) ইনস্ট্যান্স এবং ডেটাবেস তৈরি করুন

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

প্রথমে ক্লাউড এসকিউএল অ্যাডমিন এপিআই (Cloud SQL Admin API) সক্রিয় করুন।

$ gcloud services enable sqladmin.googleapis.com

এরপরে, আমরা একটি ক্লাউড এসকিউএল (মাইএসকিউএল) ইনস্ট্যান্স প্রস্তুত করব। এই কমান্ডটি সম্পন্ন হতে কিছুটা সময় লাগতে পারে।

$ gcloud sql instances create codelab-instance --region=us-east1

আপনার ক্লাউড এসকিউএল ইনস্ট্যান্সটি সফলভাবে তৈরি করার পর, আপনার ইনস্ট্যান্সে registrants নামে একটি নতুন ডেটাবেস তৈরি করুন।

$ gcloud sql databases create registrants --instance codelab-instance

আপনি এখন আপনার অ্যাপ্লিকেশনের জন্য ক্লাউড এসকিউএল ইনস্ট্যান্স এবং ডেটাবেস সেটআপ সম্পন্ন করেছেন।

৫. একটি স্প্রিং বুট অ্যাপ্লিকেশন শুরু করুন

আমরা এখন অ্যাপ্লিকেশনটি লেখা শুরু করার জন্য প্রস্তুত। সেটআপ ধাপে বর্ণিত ক্লাউড শেল ব্যবহার করে পরবর্তী পদক্ষেপগুলো সম্পন্ন করা হবে।

প্রথমে, আমরা প্রজেক্টের জন্য স্কাফোল্ডিং কোড তৈরি করতে Initializr ব্যবহার করব। আপনার ক্লাউড শেল উইন্ডোতে, চালান:

$ cd ~
$ curl https://start.spring.io/starter.tgz \
  -d language=kotlin \
  -d bootVersion=2.4.0 \
  -d dependencies=web,data-jpa,integration,cloud-gcp-pubsub,thymeleaf \
  -d baseDir=registrations-codelab | tar -xzvf -
$ cd registrations-codelab

এই কমান্ডটি registrations-codelab/ ডিরেক্টরিতে একটি প্রাথমিক Maven প্রজেক্ট সেটআপ এবং আপনার অ্যাপ্লিকেশনের জন্য স্কাফোল্ডিং কোড তৈরি করে। একটি কার্যকরী অ্যাপ্লিকেশন তৈরি করার জন্য প্রয়োজনীয় কোড সম্পাদনাগুলো নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে।

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

ক্লাউড শেল পরিবেশে কোড পরিবর্তন ও দেখা শুরু করার সবচেয়ে সহজ উপায় হলো এর অন্তর্নির্মিত ক্লাউড শেল কোড এডিটর ব্যবহার করা।

একবার আপনি একটি ক্লাউড শেল ইনস্ট্যান্স খুলে ফেললে, কোড এডিটরটি খোলার জন্য পেন্সিল আইকনে ক্লিক করুন। এডিটরটি আপনাকে ইনিশিয়ালাইজার দ্বারা তৈরি প্রোজেক্ট ফাইলগুলো সরাসরি পরিবর্তন করার সুযোগ দেবে।

cce293b40119c37b.png

৬. ডাটাবেস কনফিগারেশন

প্রথমে, আপনার অ্যাপ্লিকেশনটি এমনভাবে কনফিগার করুন যাতে এটি আপনার সেট আপ করা ক্লাউড MySQL ডেটাবেসের সাথে সংযোগ করতে পারে। Spring Cloud GCP লাইব্রেরিগুলো একটি ক্লাউড MySQL স্টার্টার অফার করে, যা একটি ক্লাউড MySQL ইনস্ট্যান্সের সাথে সংযোগ করার জন্য প্রয়োজনীয় ডিপেন্ডেন্সিগুলো সরবরাহ করে।

প্রজেক্টের pom.xml-এ spring-cloud-gcp-starter-sql-mysql ডিপেন্ডেন্সিটি যোগ করুন:

registrations-codelab/pom.xml

...
<dependencies>

  ... Other dependencies above ...

  <!-- Add the MySQL starter to the list of dependencies -->
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
  </dependency>
</dependencies>

এছাড়াও, আপনার ডাটাবেস কনফিগারেশন বর্ণনা করার জন্য application.properties কনফিগারেশন ফাইলটি পরিবর্তন করতে হবে। নিম্নলিখিত প্রপার্টিগুলো আপনার application.properties ফাইলে কপি করুন।

আপনার ডাটাবেসের ইনস্ট্যান্স সংযোগের নামটি খুঁজুন:

$ gcloud sql instances describe codelab-instance \
  --format 'value(connectionName)'

এর আউটপুটটি application.properties ফাইলে সংযোগের তথ্য কনফিগার করতে ব্যবহৃত হবে।

src/main/resources/application.properties

# Modify this property using the output from the previous command line.
spring.cloud.gcp.sql.instance-connection-name=INSTANCE_CONNECTION_NAME

# Your database name
spring.cloud.gcp.sql.database-name=registrants

# So app starts despite "table already exists" errors.
spring.datasource.continue-on-error=true

# Enforces database initialization
spring.datasource.initialization-mode=always

# Cloud SQL (MySQL) only supports InnoDB, not MyISAM
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
spring.jpa.hibernate.ddl-auto=create-drop

# This is used if you want to connect to a different database instance
# user other than root; not used in codelab.
# spring.datasource.username=root

# This is used to specify the password of the database user;
# not used in codelab.
# spring.datasource.password=password

আপনাকে শুধুমাত্র ইনস্ট্যান্স কানেকশন নেম প্রপার্টিটি অবশ্যই পরিবর্তন করতে হবে। এই ভ্যালুটি অবশ্যই কোলন দ্বারা পৃথক করা অবস্থায়, এই ফরম্যাটে লিখতে হবে: YOUR_GCP_PROJECT_ID:REGION:DATABASE_INSTANCE_NAME

৭. স্ট্যাটিক কন্টেন্ট তৈরি করা

প্রথমে, আমরা আমাদের অ্যাপ্লিকেশনের ফ্রন্টএন্ড তৈরি করব। অ্যাপ্লিকেশনটিতে ব্যক্তিদের নিবন্ধন করার জন্য একটি ফর্ম এবং সফলভাবে নিবন্ধনকারীদের প্রদর্শন করার জন্য একটি ভিউ থাকা উচিত।

হোম পেজের জন্য, রেজিস্ট্রেশন ফর্ম সম্বলিত একটি index.html তৈরি করুন।

src/main/resources/static/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Registration Sample Application</title>
</head>
<body>

<h1>Registration</h1>

<div>
  <nav>
    <a href="/">Home</a><br>
    <a href="/registrants">Registered People</a><br>
  </nav>

  <p>
    This is a demo registration application which sends user information to a Pub/Sub topic and
    persists it into a MySQL database.
  </p>

  <h2>Register Person</h2>
  <div>
    <form action="/registerPerson" method="post">
      First Name: <input type="text" name="firstName" />
      Last Name: <input type="text" name="lastName" />
      Email: <input type="text" name="email" />
      <input type="submit" value="Submit"/>
    </form>
  </div>
</div>

</body>
</html>

এরপরে, আমরা নিবন্ধিত ব্যবহারকারীদের দেখানোর জন্য registrants.html নামে একটি Thymeleaf টেমপ্লেট তৈরি করব। Thymeleaf হলো একটি টেমপ্লেটিং ফ্রেমওয়ার্ক যা আমরা ডাইনামিকভাবে তৈরি HTML নির্মাণ ও পরিবেশন করতে ব্যবহার করি। আপনি দেখবেন যে টেমপ্লেটটি HTML-এর মতোই দেখতে, তবে এতে ডাইনামিক কন্টেন্ট পরিচালনার জন্য কিছু অতিরিক্ত মার্কডাউন এলিমেন্ট রয়েছে। এই টেমপ্লেটটি personsList নামক একটিমাত্র প্যারামিটার গ্রহণ করে, যাতে অ্যাপ্লিকেশনটির মাধ্যমে নিবন্ধিত সমস্ত নিবন্ধিত ব্যবহারকারীর তথ্য থাকে।

src/main/resources/templates/registrants.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>Registrants List</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<h1>Registrants List</h1>
<p>
  This page displays all the people who were registered through the Pub/Sub topic.
  All results are retrieved from the MySQL database.
</p>
<table border="1">
  <tr>
    <th>First Name</th>
    <th>Last Name</th>
    <th>Email</th>
  </tr>
  <tr th:each="person : ${personsList}">
    <td>[[${person.firstName}]]</td>
    <td>[[${person.lastName}]]</td>
    <td>[[${person.email}]]</td>
  </tr>
</table>

</body>
</html>

এই পর্যায়ে, আপনি যাচাই করতে পারেন যে স্ট্যাটিক কন্টেন্টটি পরিবেশিত হচ্ছে।

Maven ব্যবহার করে অ্যাপটি বিল্ড ও রান করুন:

$ ./mvnw spring-boot:run

ক্লাউড শেল উইন্ডোতে প্রিভিউ বোতামে ক্লিক করুন এবং যাচাই করুন যে হোম পেজটি রেন্ডার হচ্ছে। তবে, UI-এর কোনো কার্যকারিতাই কাজ করবে না, কারণ আমাদের একটি ওয়েব কন্ট্রোলার নেই। এটি পরবর্তী ধাপে যোগ করা হবে।

5e38bb0d0e93002e.png

অ্যাপ্লিকেশনটি প্রিভিউ করার পর, অ্যাপ্লিকেশনটি বন্ধ করতে CTRL+C চাপুন।

৮. নিবন্ধিতদের একটি পাব/সাব টপিকে পাঠানো

এই ধাপে, আমরা এমন একটি ফিচার বাস্তবায়ন করব যেখানে ওয়েবফর্মের মাধ্যমে জমা দেওয়া নিবন্ধনকারীদের তথ্য একটি ক্লাউড পাব/সাব টপিকে প্রকাশ করা হবে।

ডেটা ক্লাস যোগ করুন

প্রথমে, আমরা কিছু কোটলিন ডেটা ক্লাস তৈরি করব; এগুলো আমাদের জেপিএ এনটিটি (JPA entities) হবে এবং ফর্মের মাধ্যমে জমা দেওয়া নিবন্ধনকারীদের অন্তর্বর্তীকালীন উপস্থাপনা হিসেবেও কাজ করবে।

ডেমো প্যাকেজে দুটি নতুন ফাইল যোগ করুন: একটি Person ক্লাস এবং একটি Spring Data PersonRepository । এই দুটি ক্লাস আমাদেরকে Spring Data JPA ব্যবহার করে MySQL ডাটাবেস থেকে রেজিস্ট্রেশন এন্ট্রিগুলো সহজে সংরক্ষণ ও পুনরুদ্ধার করতে সাহায্য করবে।

src/main/kotlin/com/example/demo/Person.kt

package com.example.demo

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Entity
data class Person(
    val firstName: String,
    val lastName: String,
    val email: String,
    @Id @GeneratedValue
    var id: Long? = 0)

src/main/kotlin/com/example/demo/PersonRepository.kt

package com.example.demo

import org.springframework.data.repository.CrudRepository

interface PersonRepository : CrudRepository<Person, Long>

ওয়েব কন্ট্রোলার যোগ করুন

এরপরে, আমরা একটি কন্ট্রোলার ক্লাস তৈরি করব যা ফর্ম থেকে নিবন্ধনকারীদের তথ্য প্রসেস করবে এবং পূর্বে তৈরি করা ক্লাউড পাব/সাব টপিকে সেই তথ্য পাঠাবে। এই কন্ট্রোলারটি দুটি এন্ডপয়েন্ট তৈরি করে:

  • /registerPerson : এটি সেই POST এন্ডপয়েন্ট যেখানে নিবন্ধনকারীর তথ্য জমা দেওয়া হয় এবং তারপর Pub/Sub টপিকে পাঠানো হয়। registerPerson(..) ফাংশনে, নিবন্ধনকারীর তথ্য Pub/Sub টপিকে পাঠানো হয় PubSubTemplate ব্যবহার করে, যা Spring Cloud GCP Pub/Sub ইন্টিগ্রেশনের একটি সুবিধাজনক ক্লাস এবং এটি Cloud Pub/Sub-এর সাথে কাজ শুরু করার জন্য প্রয়োজনীয় বয়লারপ্লেট কোড কমিয়ে আনে।
  • /registrants : ডাটাবেসে সফলভাবে নিবন্ধিত সকল নিবন্ধিত ব্যক্তির তথ্য প্রদর্শন করে। এই তথ্যটি পূর্ববর্তী ধাপে তৈরি করা Spring Data রিপোজিটরি ব্যবহার করে MySQL ইনস্ট্যান্স থেকে সংগ্রহ করা হয়।

demo প্যাকেজে নিম্নলিখিত Controller ক্লাসটি তৈরি করুন:

src/main/kotlin/com/example/demo/Controller.kt

package com.example.demo

import com.google.cloud.spring.pubsub.core.PubSubTemplate
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.view.RedirectView

@RestController
class Controller(val pubSubTemplate: PubSubTemplate, val personRepository: PersonRepository) {
  
  // The Pub/Sub topic name created earlier.
  val REGISTRATION_TOPIC = "registrations"

  @PostMapping("/registerPerson")
  fun registerPerson(
    @RequestParam("firstName") firstName: String,
    @RequestParam("lastName") lastName: String,
    @RequestParam("email") email: String): RedirectView {

    pubSubTemplate.publish(
        REGISTRATION_TOPIC,
        Person(firstName, lastName, email))
    return RedirectView("/")
  }

  @GetMapping("/registrants")
  fun getRegistrants(): ModelAndView {
    val personsList = personRepository.findAll().toList()
    return ModelAndView("registrants", mapOf("personsList" to personsList))
  }
}

কন্ট্রোলার ওয়েব ফর্মের মাধ্যমে জমা দেওয়া নিবন্ধকের তথ্য পড়ে এবং তারপর সেই তথ্য পাব/সাব টপিকে প্রকাশ করে।

JSON অবজেক্ট ম্যাপার বিন যোগ করা

আপনি কন্ট্রোলারে হয়তো লক্ষ্য করেছেন যে আমরা পাব/সাব টপিকে একটি স্ট্রিং-এর পরিবর্তে একটি Person অবজেক্ট পাবলিশ করি। এটি সম্ভব কারণ আমরা টপিকে কাস্টম JSON পেলোড পাঠানোর জন্য স্প্রিং ক্লাউড জিসিপি (Spring Cloud GCP) সাপোর্টের সুবিধা নিই — এই লাইব্রেরিগুলো আপনাকে অবজেক্টকে JSON-এ সিরিয়ালাইজ করতে, টপিকে JSON পেলোড পাঠাতে এবং পেলোডটি গৃহীত হলে তা ডিসিরিয়ালাইজ করতে দেয়।

এই বৈশিষ্ট্যটির সুবিধা নিতে হলে, আপনাকে আপনার অ্যাপ্লিকেশন কনটেক্সটে একটি ObjectMapper বিন যোগ করতে হবে। আপনার অ্যাপ্লিকেশন যখন মেসেজ পাঠাবে ও গ্রহণ করবে, তখন অবজেক্টগুলোকে JSON-এ সিরিয়ালাইজ করতে এই ObjectMapper বিনটি ব্যবহৃত হবে। DemoApplication.kt ক্লাসে, JacksonPubSubMessageConverter Spring বিনটি যোগ করুন:

src/main/kotlin/com/example/demo/DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

// new imports to add
import org.springframework.context.annotation.Bean
import com.fasterxml.jackson.databind.ObjectMapper
import com.google.cloud.spring.pubsub.support.converter.JacksonPubSubMessageConverter

@SpringBootApplication
class DemoApplication {
  // This bean enables serialization/deserialization of
  // Java objects to JSON for Pub/Sub payloads
  @Bean
  fun jacksonPubSubMessageConverter(objectMapper: ObjectMapper) = 
      JacksonPubSubMessageConverter(objectMapper)
}

fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
}

এই পর্যায়ে, আপনি নিম্নলিখিত কমান্ডটি চালিয়ে অ্যাপ্লিকেশনটি আবার চালানোর চেষ্টা করতে পারেন:

$ ./mvnw spring-boot:run

মূল পৃষ্ঠার ওয়েব ফর্ম থেকে, অ্যাপ্লিকেশনটি এখন আপনার তৈরি করা পাব/সাব টপিকে তথ্য পাঠাবে। তবে, এটি এখনও কোনো দরকারি কাজ করছে না, কারণ আমাদের এখনও সেই পাব/সাব টপিক থেকে তথ্য পড়তে হবে! এই কাজটি পরবর্তী ধাপে সম্পন্ন করা হবে।

৯. পাব/সাব টপিক থেকে নিবন্ধিতদের পড়া

চূড়ান্ত ধাপে, আমরা পাব/সাব টপিক থেকে নিবন্ধনকারীর তথ্য প্রসেস করব এবং সেই তথ্য ক্লাউড মাইএসকিউএল (MySQL) ডেটাবেসে সংরক্ষণ করব। এর মাধ্যমে অ্যাপ্লিকেশনটি সম্পূর্ণ হবে, যা আপনাকে ফর্মের মাধ্যমে নতুন নিবন্ধনকারী যুক্ত করতে এবং /registrants এন্ডপয়েন্টের মাধ্যমে সকল নিবন্ধিত ব্যবহারকারীকে দেখার সুযোগ দেবে।

এই অ্যাপ্লিকেশনটি Spring Integration- এর সুবিধা নেবে, যা মেসেজিং পরিচালনার জন্য অনেক সুবিধাজনক অ্যাবস্ট্রাকশন প্রদান করে। আমরা একটি PubSubInboundChannelAdapter যোগ করব, যা আমাদের Pub/Sub টপিক থেকে মেসেজ পড়তে এবং পরবর্তী প্রক্রিয়াকরণের জন্য সেগুলোকে pubsubInputChannel এ রাখতে সক্ষম করবে। এরপর, pubsubInputChannel এ আসা মেসেজগুলো দিয়ে কল করার জন্য আমরা @ServiceActivator ব্যবহার করে messageReceiver ফাংশনটি কনফিগার করব।

src/main/kotlin/com/example/demo/DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

import org.springframework.context.annotation.Bean
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.cloud.gcp.pubsub.support.converter.JacksonPubSubMessageConverter

// new imports to add
import com.google.cloud.spring.pubsub.core.PubSubTemplate
import com.google.cloud.spring.pubsub.integration.AckMode
import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter
import com.google.cloud.spring.pubsub.support.BasicAcknowledgeablePubsubMessage
import com.google.cloud.spring.pubsub.support.GcpPubSubHeaders
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.integration.annotation.ServiceActivator
import org.springframework.integration.channel.DirectChannel
import org.springframework.messaging.MessageChannel
import org.springframework.messaging.handler.annotation.Header

@SpringBootApplication
class DemoApplication {

  private val REGISTRANT_SUBSCRIPTION = "registrations-sub"

  @Autowired
  private lateinit var personRepository: PersonRepository

  // New Spring Beans to add
  @Bean
  fun pubsubInputChannel() = DirectChannel()

  @Bean
  fun messageChannelAdapter(
      @Qualifier("pubsubInputChannel") inputChannel: MessageChannel,
      pubSubTemplate: PubSubTemplate): PubSubInboundChannelAdapter {

    val adapter = PubSubInboundChannelAdapter(
        pubSubTemplate, REGISTRANT_SUBSCRIPTION)
    adapter.outputChannel = inputChannel
    adapter.ackMode = AckMode.MANUAL
    adapter.payloadType = Person::class.java
    return adapter
  }

  @ServiceActivator(inputChannel = "pubsubInputChannel")
  fun messageReceiver(
      payload: Person,
      @Header(GcpPubSubHeaders.ORIGINAL_MESSAGE) message: BasicAcknowledgeablePubsubMessage) {
    personRepository.save(payload)
    print("Message arrived! Payload: $payload")
    message.ack()
  }

  // ObjectMapper bean from previous step
  @Bean
  fun jacksonPubSubMessageConverter(objectMapper: ObjectMapper) = JacksonPubSubMessageConverter(objectMapper)
}

fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
}

এই পর্যায়ে, আপনি অ্যাপ্লিকেশনটির সেটআপ সম্পন্ন করেছেন। অ্যাপটি সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে, চালান:

$ ./mvnw spring-boot:run

আবার প্রিভিউ বাটনে ক্লিক করুন এবং ফর্মটি পূরণ করে ও জমা দিয়ে একজন ব্যবহারকারী নিবন্ধন করার চেষ্টা করুন।

e0d0b0f0c94120c2.png

নতুন নিবন্ধিত ব্যক্তিটি সারণিতে আছেন কিনা তা যাচাই করতে 'নিবন্ধিত ব্যক্তি' লিঙ্কে ক্লিক করুন।

ab3b980423d0c51.png

অভিনন্দন, আপনার কাজ শেষ! টার্মিনাল উইন্ডোতে CTRL+C চেপে অ্যাপ্লিকেশনটি বন্ধ করুন।

১০. পরিচ্ছন্নতা

আপনার পরিবেশ পরিষ্কার করতে, আপনাকে আপনার তৈরি করা পাব/সাব টপিক এবং ক্লাউড মাইএসকিউএল ইনস্ট্যান্সটি মুছে ফেলতে হবে।

ক্লাউড MySQL ইনস্ট্যান্স মুছে ফেলা

$ gcloud sql instances delete codelab-instance

পাব/সাব রিসোর্স মুছে ফেলা

$ gcloud pubsub subscriptions delete registrations-sub
$ gcloud pubsub topics delete registrations

১১. অভিনন্দন!

আপনি এখন একটি Spring Kotlin অ্যাপ্লিকেশন লেখা সম্পন্ন করেছেন যা Cloud Pub/Sub এবং Cloud SQL (MySQL)-এর সাথে সমন্বিত।

আরও জানুন

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।