Spring इंटिग्रेशन और Google Cloud Pub/Sub के साथ मैसेज सेवा

Spring Integration, MessageChannels के ज़रिए Messages को एक्सचेंज करने के लिए, आपको मैसेजिंग की सुविधा देता है. यह बाहरी सिस्टम के साथ कम्यूनिकेट करने के लिए, चैनल अडैप्टर का इस्तेमाल करता है.

इस अभ्यास में, हम ऐसे दो ऐप्लिकेशन बनाएंगे जो Spring Cloud GCP की ओर से उपलब्ध कराए गए Spring Integration चैनल अडैप्टर का इस्तेमाल करके कम्यूनिकेट करते हैं. ये अडैप्टर, Spring Integration को Google Cloud Pub/Sub का इस्तेमाल मैसेज एक्सचेंज बैकएंड के तौर पर करने की सुविधा देते हैं.

आपको Cloud Shell और Cloud SDK gcloud कमांड का इस्तेमाल करने का तरीका बताया जाएगा.

इस ट्यूटोरियल में, Spring Boot Getting Started गाइड से लिए गए सैंपल कोड का इस्तेमाल किया गया है.

आपको क्या सीखने को मिलेगा

  • Spring Integration और Spring Cloud GCP का इस्तेमाल करके, Google Cloud Pub/Sub की मदद से ऐप्लिकेशन के बीच मैसेज भेजने और पाने का तरीका

आपको इन चीज़ों की ज़रूरत होगी

  • Google Cloud Platform प्रोजेक्ट
  • कोई ब्राउज़र, जैसे कि Chrome या Firefox
  • Vim, EMACs या Nano जैसे स्टैंडर्ड Linux टेक्स्ट एडिटर के बारे में जानकारी होना

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ इसे पढ़ें इसे पढ़ें और एक्सरसाइज़ पूरी करें

एचटीएमएल/सीएसएस वेब ऐप्लिकेशन बनाने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती सामान्य एडवांस

Google Cloud Platform की सेवाओं को इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती स्तर सामान्य स्तर एडवांस लेवल

अपने हिसाब से एनवायरमेंट सेट अप करना

अगर आपके पास पहले से कोई Google खाता (Gmail या Google Apps) नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Platform Console (console.cloud.google.com) में साइन इन करें और एक नया प्रोजेक्ट बनाएं:

2016-02-10 12:45:26.png का स्क्रीनशॉट

प्रोजेक्ट आईडी याद रखें. यह सभी Google Cloud प्रोजेक्ट के लिए एक यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा. माफ़ करें! इस कोड लैब में इसे बाद में PROJECT_ID के तौर पर दिखाया जाएगा.

इसके बाद, Google Cloud संसाधनों का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग चालू करनी होगी.

इस कोडलैब को पूरा करने में आपको कुछ डॉलर से ज़्यादा खर्च नहीं करने पड़ेंगे. हालांकि, अगर आपको ज़्यादा संसाधनों का इस्तेमाल करना है या उन्हें चालू रखना है, तो यह खर्च बढ़ सकता है. इस दस्तावेज़ के आखिर में "सफ़ाई" सेक्शन देखें.

Google Cloud Platform के नए उपयोगकर्ता, 300 डॉलर के क्रेडिट के साथ मुफ़्त में आज़माने की सुविधा पा सकते हैं.

Google Cloud Shell

Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Google Cloud Shell चालू करना

GCP Console में, सबसे ऊपर दाईं ओर मौजूद टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:

इसके बाद, "Cloud Shell शुरू करें" पर क्लिक करें:

इसे चालू करने और एनवायरमेंट से कनेक्ट करने में सिर्फ़ कुछ सेकंड लगेंगे:

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. साथ ही, Google Cloud पर काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस लैब में ज़्यादातर काम, सिर्फ़ ब्राउज़र या Google Chromebook से किया जा सकता है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट को आपके PROJECT_ID पर पहले ही सेट कर दिया गया है.

पुष्टि करने के लिए कि आपने पुष्टि कर ली है, Cloud Shell में यह कमांड चलाएं:

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 Cloud Pub/Sub के विषयों वाले पेज पर जाएं और एपीआई चालू करें.

विषय बनाएं पर क्लिक करें.

विषय के नाम के तौर पर exampleTopic टाइप करें. इसके बाद, बनाएं पर क्लिक करें.

विषय बनाने के बाद, विषय वाले पेज पर ही रहें. अभी-अभी बनाया गया विषय ढूंढें. इसके बाद, लाइन के आखिर में मौजूद तीन वर्टिकल बिंदुओं को दबाएं और नई सदस्यता पर क्लिक करें.

सदस्यता के नाम वाले टेक्स्ट बॉक्स में exampleSubscription टाइप करें. इसके बाद, बनाएं पर क्लिक करें.

Cloud Shell लॉन्च होने के बाद, कमांड लाइन का इस्तेमाल करके, Spring Initializr की मदद से दो नए Spring Boot ऐप्लिकेशन जनरेट किए जा सकते हैं:

$ 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 Cloud Pub/Sub मैसेज में बदलता है और उसे Google Cloud Pub/Sub विषय पर पब्लिश करता है.

हमारे ऐप्लिकेशन को किसी चैनल पर लिखने की अनुमति देने के लिए, हम Spring Integration messaging gateway का इस्तेमाल कर सकते हैं. 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 Cloud Pub/Sub विषय पर पब्लिश करने के लिए, आउटबाउंड चैनल अडैप्टर की ज़रूरत होती है.

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 में मौजूद किसी भी नए मैसेज पर लागू किया जाता है. इस मामले में, हम 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 एनोटेशन की वजह से, अब हमारे पास एक ऐसा एंडपॉइंट है जो एचटीटीपी पोस्ट अनुरोधों को सुन रहा है. हालांकि, इसके लिए DemoApplication क्लास में @RestController एनोटेशन भी जोड़ा गया है, ताकि इसे REST कंट्रोलर के तौर पर मार्क किया जा सके.

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 और एंडपॉइंट /postMessage पर मैसेज वाले POST अनुरोधों को सुन रहा है. हालांकि, हम इसके बारे में बाद में जानेंगे.

हमने अभी-अभी एक ऐसा ऐप्लिकेशन बनाया है जो Google Cloud Pub/Sub के ज़रिए मैसेज भेजता है. अब हम एक ऐसा ऐप्लिकेशन बनाएंगे जो उन मैसेज को पाने और उन्हें प्रोसेस करने का काम करेगा.

नया Cloud Shell सेशन खोलने के लिए, + पर क्लिक करें.

इसके बाद, नए Cloud Shell सेशन में, डायरेक्ट्री को रिसीवर ऐप्लिकेशन की डायरेक्ट्री में बदलें:

$ 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

अब मैसेज भेजने वाले ऐप्लिकेशन से भेजे गए सभी मैसेज, मैसेज पाने वाले ऐप्लिकेशन में लॉग किए जाएंगे. इसकी जांच करने के लिए, नया Cloud Shell सेशन खोलें और मैसेज भेजने वाले ऐप्लिकेशन को एचटीटीपी पोस्ट का अनुरोध करें.

$ 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

आपने दो Spring Boot ऐप्लिकेशन सेट अप किए हैं. ये ऐप्लिकेशन, Google Cloud Pub/Sub के लिए Spring Integration Channel Adapters का इस्तेमाल करते हैं. ये एक-दूसरे के साथ मैसेज शेयर करते हैं. हालांकि, ये कभी भी Google Cloud Pub/Sub API के साथ इंटरैक्ट नहीं करते.

आपने Google Cloud Pub/Sub के लिए, Spring Integration Channel Adapters का इस्तेमाल करने का तरीका जान लिया है!

ज़्यादा जानें

लाइसेंस

इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.