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

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

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

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

এই টিউটোরিয়ালটি স্প্রিং বুট শুরু করার নির্দেশিকা থেকে নমুনা কোড ব্যবহার করে।

আপনি কি শিখবেন

  • স্প্রিং ইন্টিগ্রেশন এবং স্প্রিং ক্লাউড জিসিপি ব্যবহার করে Google ক্লাউড পাব/সাব-এর মাধ্যমে অ্যাপগুলির মধ্যে বার্তাগুলি কীভাবে বিনিময় করবেন

আপনি কি প্রয়োজন হবে

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

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

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

এইচটিএমএল/সিএসএস ওয়েব অ্যাপ তৈরি করার ক্ষেত্রে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

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

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

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

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

আপনার যদি ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে (Gmail বা Google Apps), তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে। Google ক্লাউড প্ল্যাটফর্ম কনসোলে সাইন-ইন করুন ( console.cloud.google.com ) এবং একটি নতুন প্রকল্প তৈরি করুন:

2016-02-10 12:45:26.png এর স্ক্রিনশট

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

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

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

Google ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা $300 বিনামূল্যের ট্রায়ালের জন্য যোগ্য৷

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

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

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

GCP কনসোল থেকে উপরের ডানদিকে টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:

তারপর "স্টার্ট ক্লাউড শেল" ক্লিক করুন:

পরিবেশের ব্যবস্থা করতে এবং সংযোগ করতে এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে:

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

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

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

gcloud auth list

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

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

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

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

Google ক্লাউড পাব/সাব বিষয় পৃষ্ঠাতে নেভিগেট করুন এবং API সক্ষম করুন৷

টপিক তৈরি করুন ক্লিক করুন।

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

টপিক তৈরি হওয়ার পর টপিক পেজে থাকুন। আপনি এইমাত্র যে বিষয়টি তৈরি করেছেন তা সন্ধান করুন, লাইনের শেষে তিনটি উল্লম্ব বিন্দু টিপুন এবং নতুন সদস্যতা ক্লিক করুন।

সাবস্ক্রিপশন নামের পাঠ্য বাক্সে exampleSubscription সাবস্ক্রিপশন টাইপ করুন এবং তৈরি করুন ক্লিক করুন

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

$ curl https://start.spring.io/starter.tgz \
  -d bootVersion=2.0.6.RELEASE \
  -d dependencies=web \
  -d baseDir=spring-integration-sender | tar -xzvf -
$ curl https://start.spring.io/starter.tgz \
  -d bootVersion=2.0.6.RELEASE \
  -d baseDir=spring-integration-receiver | tar -xzvf -

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

$ cd spring-integration-sender

আমরা আমাদের অ্যাপটি একটি চ্যানেলে বার্তা লিখতে চাই। চ্যানেলে একটি বার্তা আসার পরে, এটি আউটবাউন্ড চ্যানেল অ্যাডাপ্টারের দ্বারা নেওয়া হবে, যা এটিকে একটি সাধারণ স্প্রিং বার্তা থেকে একটি Google ক্লাউড পাব/সাব বার্তায় রূপান্তরিত করে এবং এটিকে একটি Google ক্লাউড পাব/সাব বিষয়ে প্রকাশ করে৷

আমাদের অ্যাপটি একটি চ্যানেলে লেখার জন্য, আমরা একটি স্প্রিং ইন্টিগ্রেশন মেসেজিং গেটওয়ে ব্যবহার করতে পারি। 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);
        }
}

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

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

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

...
import org.springframework.cloud.gcp.pubsub.core.PubSubTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.cloud.gcp.pubsub.integration.outbound.PubSubMessageHandler;
import org.springframework.messaging.MessageHandler;

@SpringBootApplication
public class DemoApplication {

        ...

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

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

চ্যানেল অ্যাডাপ্টারের জায়গায়, আমরা এখন একটি 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 অনুরোধগুলি শুনছে, তবে এটিকে একটি REST কন্ট্রোলার হিসাবে চিহ্নিত করতে DemoApplication ক্লাসে একটি @RestController টীকা যোগ না করেও নয়৷

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

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

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

অ্যাপটি চালানোর জন্য, আমাদের শুধু প্রয়োজনীয় নির্ভরতা যোগ করতে হবে।

pom.xml

<project>
  ...
  <!-- Add Spring Cloud GCP Dependency BOM -->
  <dependencyManagement>
        <dependencies>
                <dependency>
                        <groupId>org.springframework.cloud</groupId>
                        <artifactId>spring-cloud-gcp-dependencies</artifactId>
                        <version>1.0.0.RELEASE</version>
                        <type>pom</type>
                        <scope>import</scope>
                </dependency>
        </dependencies>
  </dependencyManagement>

  <dependencies>
        ...
        <!-- Add Pub/Sub Starter -->
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-pubsub</artifactId>
        </dependency>

        <!-- Add Spring Integration -->
        <dependency>
                <groupId>org.springframework.integration</groupId>
                <artifactId>spring-integration-core</artifactId>
        </dependency>

  </dependencies>

</project>

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

# Set the Project ID in environmental variable
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list \
  --format 'value(core.project)'`
$ ./mvnw spring-boot:run

অ্যাপটি পোর্ট 8080 এবং endpoint /postMessage এ একটি বার্তা সম্বলিত POST অনুরোধগুলি শুনছে, কিন্তু আমরা এটি পরে পাব৷

আমরা এইমাত্র একটি অ্যাপ তৈরি করেছি যা Google Cloud Pub/Sub-এর মাধ্যমে বার্তা পাঠায়। এখন, আমরা অন্য একটি অ্যাপ তৈরি করব যা সেই বার্তাগুলি গ্রহণ করে এবং সেগুলিকে প্রক্রিয়া করে৷

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

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

$ 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 org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.gcp.pubsub.core.PubSubTemplate;
import org.springframework.cloud.gcp.pubsub.integration.inbound.PubSubInboundChannelAdapter;

@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);
        }
}

এই ক্ষেত্রে, আমরা শুধু মেসেজ পেলোড লগ করব।

আমাদের প্রয়োজনীয় নির্ভরতা যোগ করতে হবে।

pom.xml

<project>
  ...
  <!-- Add Spring Cloud GCP Dependency BOM -->
  <dependencyManagement>
        <dependencies>
                <dependency>
                        <groupId>org.springframework.cloud</groupId>
                        <artifactId>spring-cloud-gcp-dependencies</artifactId>
                        <version>1.0.0.RELEASE</version>
                        <type>pom</type>
                        <scope>import</scope>
                </dependency>
        </dependencies>
  </dependencyManagement>

  <dependencies>
        ...
        <!-- Add Pub/Sub Starter -->
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-pubsub</artifactId>
        </dependency>

        <!-- Add Spring Integration -->
        <dependency>
                <groupId>org.springframework.integration</groupId>
                <artifactId>spring-integration-core</artifactId>
        </dependency>

  </dependencies>

</project>

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

$ ./mvnw spring-boot:run

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

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

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

INFO: Message arrived! Payload: Hello world!

এই অনুশীলনের অংশ হিসাবে তৈরি করা সদস্যতা এবং বিষয় মুছুন।

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

আপনি দুটি স্প্রিং বুট অ্যাপ সেট আপ করেছেন যা Google ক্লাউড পাব/সাবের জন্য স্প্রিং ইন্টিগ্রেশন চ্যানেল অ্যাডাপ্টার ব্যবহার করে। তারা Google Cloud Pub/Sub API-এর সাথে কখনও ইন্টারঅ্যাক্ট না করে নিজেদের মধ্যে বার্তা বিনিময় করে।

আপনি Google ক্লাউড পাব/সাবের জন্য স্প্রিং ইন্টিগ্রেশন চ্যানেল অ্যাডাপ্টারগুলি কীভাবে ব্যবহার করবেন তা শিখেছেন!

আরও জানুন

লাইসেন্স

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