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

1. ভূমিকা

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

এই কোডল্যাবটি কোটলিনে একটি সহজ নিবন্ধন অ্যাপ্লিকেশন সেট আপ করার মাধ্যমে কাজ করে যা GCP পরিষেবাগুলির ব্যবহার প্রদর্শন করে যার মধ্যে রয়েছে: ক্লাউড পাব/সাব এবং ক্লাউড এসকিউএল

তুমি কী তৈরি করবে

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

তুমি কি শিখবে

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

তোমার যা লাগবে

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

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

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

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

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

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

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

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

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

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLpGtQd5Q55

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

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

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

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

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

  1. ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

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

  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) ইনস্ট্যান্স এবং ডাটাবেস তৈরি করুন

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

প্রথমে, ক্লাউড SQL অ্যাডমিন API সক্রিয় করুন।

$ gcloud services enable sqladmin.googleapis.com

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

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

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

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

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

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

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

প্রথমে, আমরা প্রকল্পের জন্য স্ক্যাফোল্ডিং কোড তৈরি করতে 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 প্রকল্প সেটআপের পাশাপাশি স্ক্যাফোল্ডিং কোড তৈরি করে। নিম্নলিখিত বিভাগগুলিতে একটি কার্যকর অ্যাপ্লিকেশন তৈরি করার জন্য প্রয়োজনীয় কোড সম্পাদনাগুলি বর্ণনা করা হয়েছে।

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

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

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

cce293b40119c37b.png সম্পর্কে

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

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

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

রেজিস্ট্রেশন-কোডেল্যাব/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 সত্তা হবে এবং ফর্মের মাধ্যমে জমা দেওয়া নিবন্ধকদের আমাদের মধ্যবর্তী প্রতিনিধিত্ব হিসেবেও কাজ করবে।

ডেমো প্যাকেজে, দুটি নতুন ফাইল যোগ করুন: একটি 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/ PubSubTemplate ব্যবহার করে Pub/Sub টপিকে পাঠানো হয়, যা স্প্রিং ক্লাউড GCP Pub/Sub ইন্টিগ্রেশনের একটি সুবিধাজনক ক্লাস যা ক্লাউড Pub/Sub এর সাথে ইন্টারঅ্যাক্ট শুরু করার জন্য প্রয়োজনীয় বয়লারপ্লেট কোডকে ন্যূনতম করে।
  • /registrants : ডাটাবেসে সফলভাবে নিবন্ধিত সকল নিবন্ধককে প্রদর্শন করে। এই তথ্যটি MySQL ইনস্ট্যান্স থেকে পুনরুদ্ধার করা হয়েছে যা আমরা পূর্ববর্তী ধাপে তৈরি করেছি স্প্রিং ডেটা রিপোজিটরি ব্যবহার করে।

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

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 অবজেক্ট ম্যাপার বিন যোগ করা হচ্ছে

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

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

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

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

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

চূড়ান্ত ধাপে, আমরা Pub/Sub বিষয় থেকে নিবন্ধকদের তথ্য প্রক্রিয়াকরণ করব এবং তথ্যটি ক্লাউড MySQL ডাটাবেসে সংরক্ষণ করব। এটি আবেদনটি সম্পূর্ণ করবে, আপনাকে ফর্মের মাধ্যমে নতুন নিবন্ধকদের জমা দিতে এবং /registrants এন্ডপয়েন্টের মাধ্যমে সমস্ত নিবন্ধিত ব্যবহারকারীদের দেখতে দেবে।

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

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 টিপে অ্যাপ্লিকেশনটি বন্ধ করুন।

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

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

ক্লাউড মাইএসকিউএল ইনস্ট্যান্স মুছে ফেলা হচ্ছে

$ gcloud sql instances delete codelab-instance

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

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

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

আপনি এখন একটি স্প্রিং কোটলিন অ্যাপ্লিকেশন লেখা সম্পন্ন করেছেন যা ক্লাউড পাব/সাব এবং ক্লাউড এসকিউএল (মাইএসকিউএল) এর সাথে একীভূত হয়।

আরও জানুন

লাইসেন্স

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