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

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

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 की सेवाओं को इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?

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

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 में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा समय नहीं लगेगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलता है.

Google Cloud Shell

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

Cloud Shell चालू करें

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

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

9c92662c6a846a5c.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह 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. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
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. Spring Boot ऐप्लिकेशन शुरू करना

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

$ 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 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 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 में आने वाले किसी भी नए मैसेज पर लागू किया जाता है. इस मामले में, हम 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 {
  ...
}

पक्का करें कि 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 पर मौजूद मैसेज वाले POST अनुरोधों को सुन रहा है. हालांकि, हम इसके बारे में बाद में जानेंगे.

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

9. बधाई हो!

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

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

लाइसेंस

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