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

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

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

आप Cloud Shell और Cloud SDK gcloud निर्देश का इस्तेमाल करने का तरीका जानेंगे.

यह ट्यूटोरियल स्प्रिंग बूट शुरू करने की गाइड के सैंपल कोड का इस्तेमाल करता है.

आप क्या #39;जानेंगे

  • Spring इंटिग्रेशन और स्प्रिंग क्लाउड GCP का इस्तेमाल करके, Google Cloud Pub/Sub वाले ऐप्लिकेशन के बीच मैसेज की अदला-बदली करने का तरीका

आपको क्या चाहिए

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

आप इस ट्यूटोरियल का इस्तेमाल कैसे करेंगे?

सिर्फ़ इसे पढ़ें इसे पढ़ें और कसरत करें

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

नया बीच का लेवल दक्षता

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

शुरुआती बीच का लेवल असरदार

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

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

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

प्रोजेक्ट आईडी याद रखें, सभी Google क्लाउड प्रोजेक्ट में दिया गया नाम (ऊपर दिया गया नाम पहले ही लिया जा चुका है और यह आपके लिए काम नहीं करेगा!). इसे बाद में इस कोडलैब (कोड बनाना सीखना) में 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 आइकॉन पर क्लिक करें:

इसके बाद, &Cont &Cloud Shell शुरू करें &कोटेशन पर क्लिक करें;:

प्रावधान करने और पर्यावरण से जुड़ने में सिर्फ़ कुछ समय लगना चाहिए:

इस वर्चुअल मशीन में डेवलपमेंट से जुड़े सभी टूल हैं#39. इसमें लगातार 5 जीबी की होम डायरेक्ट्री मिलती है. यह Google Cloud पर चलती है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती जाती है. इस लैब में, हो सकता है कि किसी ब्राउज़र या 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 Initializer के साथ दो नए Spring बूट ऐप्लिकेशन जनरेट कर सकते हैं:

$ 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 क्लाउड Pub/Sub' मैसेज में बदल देता है.

हमारा ऐप्लिकेशन किसी चैनल पर लिखने के लिए, स्प्रिंग इंटिग्रेशन मैसेजिंग गेटवे का इस्तेमाल कर सकता है. 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 क्लाउड Pub/Sub's 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 पर एक मैसेज वाले पोस्ट अनुरोधों को सुन रहा है, लेकिन हम बाद में उन्हें देखेंगे.

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

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

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

$ 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 को @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

आपने दो ऐसे स्प्रिंग बूट ऐप्लिकेशन सेट अप किए हैं जो Google Cloud Pub/Sub के लिए स्प्रिंग इंटिग्रेशन चैनल अडैप्टर का इस्तेमाल करते हैं. वे Google Cloud Pub/Sub एपीआई से इंटरैक्ट किए बिना ही एक-दूसरे से मैसेज भेजते हैं.

आपने Google Cloud Pub/Sub के लिए स्प्रिंग इंटिग्रेशन चैनल अडैप्टर को इस्तेमाल करने का तरीका सीखा!

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

लाइसेंस

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