স্প্রিং ইন্টিগ্রেশন এবং Google ক্লাউড পাব/সাবের সাথে মেসেজিং

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

Spring Integration আপনাকে MessageChannels মাধ্যমে Messages আদান-প্রদানের একটি ব্যবস্থা প্রদান করে। এটি বাহ্যিক সিস্টেমের সাথে যোগাযোগের জন্য চ্যানেল অ্যাডাপ্টার ব্যবহার করে।

এই অনুশীলনে, আমরা এমন দুটি অ্যাপ তৈরি করব যা Spring Cloud GCP দ্বারা প্রদত্ত Spring Integration চ্যানেল অ্যাডাপ্টার ব্যবহার করে একে অপরের সাথে যোগাযোগ করে। এই অ্যাডাপ্টারগুলো Spring Integration-কে বার্তা আদান-প্রদানের ব্যাকএন্ড হিসেবে Google Cloud Pub/Sub ব্যবহার করতে সাহায্য করে।

আপনি ক্লাউড শেল এবং ক্লাউড এসডিকে-এর gcloud কমান্ড ব্যবহার করতে শিখবেন।

এই টিউটোরিয়ালটিতে Spring Boot Getting Started গাইড থেকে নমুনা কোড ব্যবহার করা হয়েছে।

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

  • Spring Integration এবং Spring Cloud GCP ব্যবহার করে Google Cloud Pub/Sub-এর মাধ্যমে অ্যাপগুলোর মধ্যে কীভাবে বার্তা আদান-প্রদান করা যায়

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

  • একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রকল্প
  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
  • Vim, EMACs বা Nano-এর মতো প্রচলিত লিনাক্স টেক্সট এডিটরগুলোর সাথে পরিচিতি।

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

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

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

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

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

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

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

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

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

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

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

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

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

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

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

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

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

Google Cloud Pub/Sub টপিকস পৃষ্ঠায় যান।

বিষয় তৈরি করুন- এ ক্লিক করুন।

4c938409dc7169a6.png

টপিকের নাম হিসেবে exampleTopic টাইপ করুন এবং তারপর Create-এ ক্লিক করুন।

e2daeec91537f672.png

টপিকটি তৈরি করার পর, টপিকস পেজেই থাকুন। আপনি এইমাত্র যে টপিকটি তৈরি করেছেন সেটি খুঁজুন, লাইনের শেষে থাকা তিনটি উল্লম্ব ডটে চাপ দিন এবং নিউ সাবস্ক্রিপশন-এ ক্লিক করুন।

975efa26e5054936.png

সাবস্ক্রিপশন নামের টেক্সট বক্সে exampleSubscription টাইপ করুন এবং Create-এ ক্লিক করুন।

f7a91d9e1cb48009.png

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

ক্লাউড শেল চালু হওয়ার পর, আপনি কমান্ড লাইন ব্যবহার করে স্প্রিং ইনিশিয়ালাইজারের সাহায্যে দুটি নতুন স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করতে পারবেন:

$ curl https://start.spring.io/starter.tgz \
  -d bootVersion=3.0.5 \
  -d dependencies=web,integration,cloud-gcp-pubsub \
  -d type=maven-project \
  -d baseDir=spring-integration-sender | tar -xzvf -

$ curl https://start.spring.io/starter.tgz \
  -d bootVersion=3.0.5 \
  -d dependencies=web,integration,cloud-gcp-pubsub \
  -d type=maven-project \
  -d baseDir=spring-integration-receiver | tar -xzvf -

৫. বার্তা পাঠানোর জন্য একটি অ্যাপ্লিকেশন তৈরি করুন

এবার চলুন আমাদের মেসেজ পাঠানোর অ্যাপটি তৈরি করি। মেসেজ পাঠানোর অ্যাপটির ডিরেক্টরিতে যান।

$ cd spring-integration-sender

আমরা চাই আমাদের অ্যাপ একটি চ্যানেলে মেসেজ লিখুক। চ্যানেলে মেসেজটি আসার পর, সেটি আউটবাউন্ড চ্যানেল অ্যাডাপ্টার দ্বারা গৃহীত হবে, যা সেটিকে একটি জেনেরিক Spring মেসেজ থেকে Google Cloud Pub/Sub মেসেজে রূপান্তর করে একটি Google Cloud Pub/Sub টপিকে প্রকাশ করবে।

আমাদের অ্যাপকে কোনো চ্যানেলে লেখার জন্য, আমরা একটি Spring Integration মেসেজিং গেটওয়ে ব্যবহার করতে পারি। vim , emacs বা nano এর মতো কোনো টেক্সট এডিটর ব্যবহার করে, DemoApplication ক্লাসের ভিতরে একটি PubsubOutboundGateway ইন্টারফেস ডিক্লেয়ার করুন।

src/main/java/com/example/demo/DemoApplication.java

...
import org.springframework.integration.annotation.MessagingGateway;

@SpringBootApplication
public class DemoApplication {

  ...

  @MessagingGateway(defaultRequestChannel = "pubsubOutputChannel")
  public interface PubsubOutboundGateway {
    void sendToPubsub(String text);
  }
}

আমাদের কাছে এখন চ্যানেলে বার্তা পাঠানোর একটি ব্যবস্থা আছে, কিন্তু সেই বার্তাগুলো চ্যানেলে আসার পর কোথায় যায়?

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

src/main/java/com/example/demo/DemoApplication.java

...
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import com.google.cloud.spring.pubsub.integration.outbound.PubSubMessageHandler;

import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHandler;

@SpringBootApplication
public class DemoApplication {

  ...

  @Bean
  @ServiceActivator(inputChannel = "pubsubOutputChannel")
  public MessageHandler messageSender(PubSubTemplate pubsubTemplate) {
    return new PubSubMessageHandler(pubsubTemplate, "exampleTopic");
  }
}

@ServiceActivator অ্যানোটেশনটির কারণে inputChannel এর যেকোনো নতুন মেসেজের ক্ষেত্রে এই MessageHandler প্রয়োগ করা হয়। এক্ষেত্রে, আমরা Google Cloud Pub/Sub-এর exampleTopic টপিকে মেসেজটি পাবলিশ করার জন্য আমাদের আউটবাউন্ড চ্যানেল অ্যাডাপ্টার, PubSubMessageHandler কল করছি।

চ্যানেল অ্যাডাপ্টারটি ইনস্টল করা থাকলে, আমরা এখন একটি PubsubOutboundGateway অবজেক্টকে অটো-ওয়্যার করতে এবং এটি ব্যবহার করে একটি চ্যানেলে মেসেজ লিখতে পারি।

src/main/java/com/example/demo/DemoApplication.java

...
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.view.RedirectView;

@SpringBootApplication
public class DemoApplication {

  ...

  @Autowired
  private PubsubOutboundGateway messagingGateway;

  @PostMapping("/postMessage")
  public RedirectView postMessage(@RequestParam("message") String message) {
    this.messagingGateway.sendToPubsub(message);
    return new RedirectView("/");
  }
}

@PostMapping অ্যানোটেশনটির কারণে, আমরা এখন এমন একটি এন্ডপয়েন্ট পেয়েছি যা HTTP POST রিকোয়েস্ট গ্রহণ করতে পারে, তবে এর জন্য DemoApplication ক্লাসটিকে একটি REST কন্ট্রোলার হিসেবে চিহ্নিত করতে এতে @RestController অ্যানোটেশনও যোগ করতে হয়েছে।

src/main/java/com/example/demo/DemoApplication.java

import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {
  ...
}

JAVA_HOME সঠিক সংস্করণে সেট করা আছে কিনা তা নিশ্চিত করুন।

export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

প্রেরক অ্যাপটি চালান।

# Set the Project ID in environmental variable
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`

$ ./mvnw spring-boot:run

অ্যাপটি ৮০৮০ পোর্টে এবং /postMessage এন্ডপয়েন্টে মেসেজযুক্ত POST রিকোয়েস্ট গ্রহণ করছে, কিন্তু আমরা এই বিষয়ে পরে আলোচনা করব।

৬. বার্তা গ্রহণের জন্য একটি অ্যাপ্লিকেশন তৈরি করুন

আমরা এইমাত্র একটি অ্যাপ তৈরি করেছি যা গুগল ক্লাউড পাব/সাব-এর মাধ্যমে বার্তা পাঠায়। এখন, আমরা আরেকটি অ্যাপ তৈরি করব যা সেই বার্তাগুলো গ্রহণ করে সেগুলোকে প্রক্রিয়াজাত করবে।

একটি নতুন ক্লাউড শেল সেশন খুলতে + এ ক্লিক করুন।

9799bee5fea95aa6.png

তারপর, নতুন ক্লাউড শেল সেশনে, রিসিভার অ্যাপের ডিরেক্টরিতে যান:

$ cd spring-integration-receiver

আগের অ্যাপটিতে, মেসেজিং গেটওয়ে ডিক্লারেশন আমাদের জন্য আউটবাউন্ড চ্যানেল তৈরি করে দিত। যেহেতু আমরা মেসেজ গ্রহণ করার জন্য কোনো মেসেজিং গেটওয়ে ব্যবহার করি না, তাই আমাদের নিজস্ব MessageChannel ডিক্লেয়ার করতে হবে যেখানে ইনকামিং মেসেজগুলো এসে পৌঁছাবে।

src/main/java/com/example/demo/DemoApplication.java

...
import org.springframework.context.annotation.Bean;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.messaging.MessageChannel;

@SpringBootApplication
public class DemoApplication {

  ...

  @Bean
  public MessageChannel pubsubInputChannel() {
    return new DirectChannel();
  }
}

Google Cloud Pub/Sub থেকে মেসেজ গ্রহণ করে সেগুলোকে pubsubInputChannel এ রিলে করার জন্য আমাদের ইনবাউন্ড চ্যানেল অ্যাডাপ্টারটির প্রয়োজন হবে।

src/main/java/com/example/demo/DemoApplication.java

...
import com.google.cloud.spring.pubsub.core.PubSubTemplate;
import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter;

import org.springframework.beans.factory.annotation.Qualifier;

@SpringBootApplication
public class DemoApplication {

  ...

  @Bean
  public PubSubInboundChannelAdapter messageChannelAdapter(
      @Qualifier("pubsubInputChannel") MessageChannel inputChannel,
      PubSubTemplate pubSubTemplate) {
    PubSubInboundChannelAdapter adapter =
        new PubSubInboundChannelAdapter(pubSubTemplate, "exampleSubscription");
    adapter.setOutputChannel(inputChannel);

    return adapter;
  }
}

এই অ্যাডাপ্টারটি pubsubInputChannel এর সাথে নিজেকে যুক্ত করে এবং Google Cloud Pub/Sub exampleSubscription সাবস্ক্রিপশন থেকে নতুন বার্তা শোনে।

আমাদের একটি চ্যানেল আছে যেখানে আগত বার্তাগুলো পোস্ট করা হয়, কিন্তু সেই বার্তাগুলো দিয়ে কী করতে হবে?

চলুন, একটি @ServiceActivator ব্যবহার করে সেগুলোকে প্রসেস করি, যেটি pubsubInputChannel এ নতুন মেসেজ এলে ট্রিগার হবে। এক্ষেত্রে, আমরা শুধু মেসেজ পেলোডটি লগ করব।

src/main/java/com/example/demo/DemoApplication.java

...
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.annotation.ServiceActivator;

@SpringBootApplication
public class DemoApplication {

  ...

  private static final Log LOGGER = LogFactory.getLog(DemoApplication.class);

  @ServiceActivator(inputChannel = "pubsubInputChannel")
  public void messageReceiver(String payload) {
    LOGGER.info("Message arrived! Payload: " + payload);
  }
}

JAVA_HOME সঠিক সংস্করণে সেট করা আছে কিনা তা নিশ্চিত করুন।

export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

রিসিভার অ্যাপটি চালান।

$ ./mvnw spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"

এখন আপনি প্রেরক অ্যাপে যে বার্তাগুলো পাঠাবেন, সেগুলো প্রাপক অ্যাপে লগ করা হবে। এটি পরীক্ষা করার জন্য, একটি নতুন ক্লাউড শেল সেশন খুলুন এবং প্রেরক অ্যাপে একটি HTTP POST অনুরোধ পাঠান।

$ curl --data "message=Hello world!" localhost:8080/postMessage

এরপর, যাচাই করুন যে প্রাপকের অ্যাপটি আপনার পাঠানো বার্তাটি লগ করেছে কি না!

INFO: Message arrived! Payload: Hello world!

৭. পরিচ্ছন্নতা

এই অনুশীলনের অংশ হিসেবে তৈরি করা সাবস্ক্রিপশন এবং টপিকটি মুছে ফেলুন।

$ gcloud pubsub subscriptions delete exampleSubscription
$ gcloud pubsub topics delete exampleTopic

৮. সারসংক্ষেপ

আপনি দুটি Spring Boot অ্যাপ সেট আপ করেছেন যেগুলো Google Cloud Pub/Sub-এর জন্য Spring Integration Channel Adapters ব্যবহার করে। এগুলো Google Cloud Pub/Sub API-এর সাথে কোনো রকম সংযোগ স্থাপন না করেই নিজেদের মধ্যে বার্তা আদান-প্রদান করে।

৯. অভিনন্দন!

আপনি Google Cloud Pub/Sub-এর জন্য Spring Integration Channel Adapters কীভাবে ব্যবহার করতে হয় তা শিখেছেন!

আরও জানুন

লাইসেন্স

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