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

1. खास जानकारी

स्प्रिंग इंटिग्रेशन आपको मैसेज का एक ऐसा तरीका उपलब्ध कराता है जिससे MessageChannels के ज़रिए Messages को एक्सचेंज किया जा सकता है. यह बाहरी सिस्टम से संपर्क करने के लिए चैनल अडैप्टर का इस्तेमाल करता है.

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

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

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

आपको इनके बारे में जानकारी मिलेगी

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

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

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

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

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

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

शुरुआती इंटरमीडिएट कुशल

Google Cloud Platform की सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

2. सेटअप और ज़रूरी शर्तें

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

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको अपना प्रोजेक्ट आईडी बताना होगा. आम तौर पर, इसकी पहचान PROJECT_ID के रूप में की जाती है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. दूसरा तरीका यह है कि आप खुद भी आज़माकर देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. साथ ही, यह प्रोजेक्ट के खत्म होने तक बना रहता है.
  • आपकी जानकारी के लिए, प्रोजेक्ट नंबर नाम की एक तीसरी वैल्यू दी गई है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, बिलिंग से बचने के लिए संसाधनों को बंद करें. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Google Cloud शेल

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

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

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

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

  1. यह पुष्टि करने के लिए Cloud Shell में नीचे दिया गया कमांड चलाएं कि आपकी पुष्टि हो गई है:
gcloud auth list

कमांड आउटपुट

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell में यह कमांड चलाएं, ताकि यह पुष्टि की जा सके कि gcloud के लिए कमांड को आपके प्रोजेक्ट के बारे में जानकारी है:
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इसे इस निर्देश की मदद से सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. Pub/Sub के संसाधनों का प्रावधान करें

Google Cloud Pub/Sub के विषयों वाले पेज पर जाएं.

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

4c938409dc7169a6.png

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

e2daeec91537f672.png

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

975efa26e5054936.png

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

f7a91d9e1cb48009.png

4. स्प्रिंग बूट ऐप्लिकेशन शुरू करें

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

$ 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 -

5. मैसेज भेजने के लिए ऐप्लिकेशन बनाएं

आइए, अब अपना संदेश भेजने वाला ऐप्लिकेशन बनाते हैं. ईमेल भेजने वाले ऐप्लिकेशन की डायरेक्ट्री में बदलें.

$ cd spring-integration-sender

हम चाहते हैं कि हमारा ऐप्लिकेशन किसी चैनल के लिए मैसेज लिखे. चैनल में मैसेज आने के बाद, उसे आउटबाउंड चैनल अडैप्टर में पिक अप किया जाएगा. इससे उसे Spring के सामान्य मैसेज से Google Cloud Pub/Sub मैसेज में बदला जाता है और उसे Google Cloud Pub/Sub विषय पर पब्लिश किया जाता है.

हमारा ऐप्लिकेशन किसी चैनल पर मैसेज भेज सके, इसके लिए हम Spring इंटिग्रेशन मैसेजिंग गेटवे का इस्तेमाल कर सकते हैं. 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 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 एनोटेशन की वजह से यह MessageHandler, inputChannel में मौजूद किसी भी नए मैसेज पर लागू हो जाता है. इस मामले में, हम अपने आउटबाउंड चैनल अडैप्टर को PubSubMessageHandler पर कॉल कर रहे हैं, ताकि Google Cloud Pub/Sub के 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 एनोटेशन की वजह से, अब हमारे पास एक ऐसा एंडपॉइंट है जो एचटीटीपी पीओएसटी अनुरोधों को सुन रहा है. हालांकि, इसे REST कंट्रोलर के तौर पर मार्क करने के लिए, DemoApplication क्लास में @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

ऐप्लिकेशन, पोर्ट 8080 और एंडपॉइंट /postMessage पर मैसेज वाले पीओएसटी अनुरोधों को सुन रहा है. हालांकि, हम इस पर बाद में बात करेंगे.

6. मैसेज पाने के लिए ऐप्लिकेशन बनाएं

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

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

9799bee5fea95aa6.png

इसके बाद, 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 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"

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

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

इसके बाद, पुष्टि करें कि आपने जो मैसेज भेजा है उसे मैसेज पाने वाले ऐप्लिकेशन ने लॉग कर दिया है!

INFO: Message arrived! Payload: Hello world!

7. साफ़-सफ़ाई सेवा

इस एक्सरसाइज़ के तहत बनाए गए विषय और सदस्यता को मिटाएं.

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

8. खास जानकारी

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

9. बधाई हो!

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

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

लाइसेंस

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