Google Cloud Platform की मदद से Kotlin Spring ऐप्लिकेशन बनाएं

1. परिचय

Spring Framework 5.0 में Kotlin के लिए खास तौर पर तैयार किया गया सपोर्ट जोड़ा गया है. इससे Kotlin डेवलपर के लिए Spring का इस्तेमाल करना आसान हो गया है. इसलिए, इन बदलावों का मतलब यह है कि Spring Cloud GCP की ओर से उपलब्ध कराए गए Google Cloud इंटिग्रेशन, Kotlin में भी आसानी से काम करते हैं. इस कोडलैब में, आपको पता चलेगा कि Kotlin ऐप्लिकेशन में Google Cloud की सेवाओं का इस्तेमाल करना कितना आसान है!

इस कोडलैब में, Kotlin में एक आसान रजिस्ट्रेशन ऐप्लिकेशन सेट अप करने का तरीका बताया गया है. इसमें GCP सेवाओं का इस्तेमाल करने का तरीका दिखाया गया है. जैसे: Cloud Pub/Sub और Cloud SQL.

आपको क्या बनाना है

इस कोडलैब में, Kotlin Spring Boot ऐप्लिकेशन सेट अप करने का तरीका बताया गया है. यह ऐप्लिकेशन, रजिस्टर करने वाले व्यक्ति की जानकारी स्वीकार करता है. साथ ही, इसे Cloud Pub/Sub विषय पर पब्लिश करता है और Cloud MySQL डेटाबेस में सेव करता है.

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

अपने Kotlin Spring ऐप्लिकेशन में Google Cloud की सेवाओं को इंटिग्रेट करने का तरीका.

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

  • Google Cloud Platform प्रोजेक्ट
  • Chrome या Firefox जैसे ब्राउज़र

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

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

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

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

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

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

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

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

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. "सफ़ाई करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें. इसमें बताया गया है कि संसाधनों को कैसे बंद किया जाए, ताकि इस ट्यूटोरियल के बाद आपको बिलिंग न करनी पड़े. Google Cloud के नए उपयोगकर्ता, मुफ़्त में आज़माने के लिए 300 डॉलर के प्रोग्राम में शामिल हो सकते हैं.

Google Cloud Shell

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

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ पर क्लिक करें.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

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`
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

3. Pub/Sub संसाधन उपलब्ध कराना

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

इस ट्यूटोरियल में, हम अपने संसाधनों को उपलब्ध कराने के लिए Cloud Shell का इस्तेमाल करेंगे. ध्यान दें कि Google Cloud Console में Cloud Pub/Sub सेक्शन के ज़रिए भी Pub/Sub संसाधनों को कॉन्फ़िगर किया जा सकता है.

अपने Cloud Shell टर्मिनल में, सबसे पहले Pub/Sub API चालू करें.

$ gcloud services enable pubsub.googleapis.com

इसके बाद, हम इस ऐप्लिकेशन के लिए registrations नाम का Pub/Sub विषय बनाएंगे. आवेदन के ज़रिए सबमिट की गई रजिस्ट्रेशन की जानकारी, इस विषय पर पब्लिश की जाएगी.

$ gcloud pubsub topics create registrations

आखिर में, विषय के लिए सदस्यता बनाएं. Pub/Sub सदस्यता की मदद से, किसी विषय से मैसेज पाए जा सकते हैं.

$ gcloud pubsub subscriptions create registrations-sub --topic=registrations

अब आपने अपने ऐप्लिकेशन के लिए Cloud Pub/Sub विषय और सदस्यता बनाने की प्रोसेस पूरी कर ली है.

4. Cloud SQL (MySQL) इंस्टेंस और डेटाबेस बनाना

हमारे सैंपल ऐप्लिकेशन के लिए, हमें एक डेटाबेस इंस्टेंस भी सेट अप करना होगा, ताकि रजिस्टर करने वाले व्यक्ति की जानकारी सेव की जा सके. इस चरण में, Cloud SQL संसाधनों को उपलब्ध कराने के लिए Cloud Shell टर्मिनल का भी इस्तेमाल किया जाएगा. ध्यान दें कि Google Cloud Console के ज़रिए भी, Cloud SQL इंस्टेंस देखे और कॉन्फ़िगर किए जा सकते हैं.

सबसे पहले, Cloud SQL एडमिन एपीआई चालू करें.

$ gcloud services enable sqladmin.googleapis.com

इसके बाद, हम Cloud SQL (MySQL) इंस्टेंस उपलब्ध कराएंगे. इस कमांड को पूरा होने में कुछ समय लग सकता है.

$ gcloud sql instances create codelab-instance --region=us-east1

Cloud SQL इंस्टेंस बनाने के बाद, अपने इंस्टेंस में registrants नाम का एक नया डेटाबेस बनाएं.

$ gcloud sql databases create registrants --instance codelab-instance

आपने अपने ऐप्लिकेशन के लिए, Cloud SQL इंस्टेंस और डेटाबेस का सेटअप पूरा कर लिया है.

5. Spring Boot ऐप्लिकेशन को शुरू करना

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

सबसे पहले, हम Initializr का इस्तेमाल करके, प्रोजेक्ट के लिए स्केफ़ोल्डिंग कोड जनरेट करेंगे. Cloud Shell विंडो में, यह कमांड चलाएं:

$ cd ~
$ curl https://start.spring.io/starter.tgz \
  -d language=kotlin \
  -d bootVersion=2.4.0 \
  -d dependencies=web,data-jpa,integration,cloud-gcp-pubsub,thymeleaf \
  -d baseDir=registrations-codelab | tar -xzvf -
$ cd registrations-codelab

इस कमांड से, registrations-codelab/ डायरेक्ट्री में आपके ऐप्लिकेशन के लिए, Maven प्रोजेक्ट का शुरुआती सेटअप और स्केफ़ोल्डिंग कोड जनरेट होता है. यहां दिए गए सेक्शन में, ऐप्लिकेशन को काम करने लायक बनाने के लिए ज़रूरी कोड में बदलावों के बारे में बताया गया है.

Cloud Shell कोड एडिटर

Cloud Shell एनवायरमेंट में कोड में बदलाव करने और उसे देखने का सबसे आसान तरीका, Cloud Shell Code Editor का इस्तेमाल करना है. यह सुविधा Cloud Shell में पहले से मौजूद होती है.

Cloud Shell इंस्टेंस खोलने के बाद, कोड एडिटर खोलने के लिए पेंसिल आइकॉन पर क्लिक करें. एडिटर को, Initialzr से बनाई गई प्रोजेक्ट फ़ाइलों में सीधे तौर पर बदलाव करने की अनुमति देनी चाहिए.

cce293b40119c37b.png

6. डेटाबेस कॉन्फ़िगरेशन

सबसे पहले, अपने ऐप्लिकेशन को कॉन्फ़िगर करें, ताकि वह आपके सेट अप किए गए Cloud MySQL डेटाबेस से कनेक्ट हो सके. Spring Cloud GCP लाइब्रेरी, Cloud MySQL starter उपलब्ध कराती हैं. इससे Cloud MySQL इंस्टेंस से कनेक्ट करने के लिए ज़रूरी डिपेंडेंसी मिलती हैं.

प्रोजेक्ट pom.xml में spring-cloud-gcp-starter-sql-mysql डिपेंडेंसी जोड़ें:

registrations-codelab/pom.xml

...
<dependencies>

  ... Other dependencies above ...

  <!-- Add the MySQL starter to the list of dependencies -->
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-mysql</artifactId>
  </dependency>
</dependencies>

इसके अलावा, आपको अपने डेटाबेस कॉन्फ़िगरेशन के बारे में बताने के लिए, application.properties कॉन्फ़िगरेशन फ़ाइल में बदलाव करना होगा. इन प्रॉपर्टी को अपनी application.properties फ़ाइल में कॉपी करें.

अपने डेटाबेस के इंस्टेंस कनेक्शन का नाम ढूंढें:

$ gcloud sql instances describe codelab-instance \
  --format 'value(connectionName)'

इसके आउटपुट का इस्तेमाल, application.properties फ़ाइल में कनेक्शन की जानकारी को कॉन्फ़िगर करने के लिए किया जाएगा.

src/main/resources/application.properties

# Modify this property using the output from the previous command line.
spring.cloud.gcp.sql.instance-connection-name=INSTANCE_CONNECTION_NAME

# Your database name
spring.cloud.gcp.sql.database-name=registrants

# So app starts despite "table already exists" errors.
spring.datasource.continue-on-error=true

# Enforces database initialization
spring.datasource.initialization-mode=always

# Cloud SQL (MySQL) only supports InnoDB, not MyISAM
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
spring.jpa.hibernate.ddl-auto=create-drop

# This is used if you want to connect to a different database instance
# user other than root; not used in codelab.
# spring.datasource.username=root

# This is used to specify the password of the database user;
# not used in codelab.
# spring.datasource.password=password

आपको सिर्फ़ इंस्टेंस कनेक्शन के नाम में बदलाव करना होगा. इस वैल्यू को कोलन से अलग की गई वैल्यू के तौर पर फ़ॉर्मैट किया जाना चाहिए. इसका फ़ॉर्मैट यह होना चाहिए: YOUR_GCP_PROJECT_ID:REGION:DATABASE_INSTANCE_NAME.

7. स्टैटिक कॉन्टेंट बनाना

सबसे पहले, हम अपने ऐप्लिकेशन के लिए फ़्रंटएंड बनाएंगे. ऐप्लिकेशन में एक ऐसा फ़ॉर्म होना चाहिए जिससे कोई व्यक्ति, लोगों को रजिस्टर कर सके. साथ ही, एक ऐसा व्यू होना चाहिए जिसमें रजिस्टर किए गए सभी लोगों की जानकारी दिखती हो.

होम पेज के लिए, रजिस्ट्रेशन फ़ॉर्म वाला index.html बनाएं.

src/main/resources/static/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Registration Sample Application</title>
</head>
<body>

<h1>Registration</h1>

<div>
  <nav>
    <a href="/">Home</a><br>
    <a href="/registrants">Registered People</a><br>
  </nav>

  <p>
    This is a demo registration application which sends user information to a Pub/Sub topic and
    persists it into a MySQL database.
  </p>

  <h2>Register Person</h2>
  <div>
    <form action="/registerPerson" method="post">
      First Name: <input type="text" name="firstName" />
      Last Name: <input type="text" name="lastName" />
      Email: <input type="text" name="email" />
      <input type="submit" value="Submit"/>
    </form>
  </div>
</div>

</body>
</html>

इसके बाद, हम रजिस्टर किए गए उपयोगकर्ताओं को दिखाने के लिए, registrants.html नाम का Thymeleaf टेंप्लेट बनाएंगे. Thymeleaf एक टेंप्लेटिंग फ़्रेमवर्क है. इसका इस्तेमाल हम डाइनैमिक तरीके से बनाए गए एचटीएमएल को बनाने और दिखाने के लिए करते हैं. आपको दिखेगा कि टेंप्लेट, एचटीएमएल की तरह दिखता है. हालांकि, इसमें डाइनैमिक कॉन्टेंट को मैनेज करने के लिए कुछ अतिरिक्त मार्कडाउन एलिमेंट होते हैं. यह टेंप्लेट, personsList नाम के एक पैरामीटर को स्वीकार करता है. इसमें, ऐप्लिकेशन के ज़रिए रजिस्टर किए गए सभी लोग शामिल होते हैं.

src/main/resources/templates/registrants.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>Registrants List</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<h1>Registrants List</h1>
<p>
  This page displays all the people who were registered through the Pub/Sub topic.
  All results are retrieved from the MySQL database.
</p>
<table border="1">
  <tr>
    <th>First Name</th>
    <th>Last Name</th>
    <th>Email</th>
  </tr>
  <tr th:each="person : ${personsList}">
    <td>[[${person.firstName}]]</td>
    <td>[[${person.lastName}]]</td>
    <td>[[${person.email}]]</td>
  </tr>
</table>

</body>
</html>

इस समय, यह पुष्टि की जा सकती है कि स्टैटिक कॉन्टेंट दिखाया जा रहा है.

Maven का इस्तेमाल करके ऐप्लिकेशन बनाएं और उसे चलाएं:

$ ./mvnw spring-boot:run

Cloud Shell विंडो में, 'झलक देखें' बटन पर क्लिक करें. इसके बाद, पुष्टि करें कि आपको होम पेज रेंडर होता हुआ दिख रहा है. हालांकि, यूज़र इंटरफ़ेस (यूआई) पर कोई भी सुविधा काम नहीं करेगी, क्योंकि हमारे पास वेब कंट्रोलर नहीं है. इसे अगले चरण में जोड़ा जाएगा.

5e38bb0d0e93002e.png

ऐप्लिकेशन की झलक देखने के बाद, ऐप्लिकेशन को बंद करने के लिए CTRL+C दबाएं.

8. पंजीकरण करने वाले लोगों की जानकारी को Pub/Sub विषय पर भेजना

इस चरण में, हम ऐसी सुविधा लागू करेंगे जिसमें वेबफ़ॉर्म के ज़रिए रजिस्टर किए गए लोगों की जानकारी, Cloud Pub/Sub के किसी विषय पर पब्लिश की जाएगी.

डेटा क्लास जोड़ना

सबसे पहले, हम कुछ Kotlin डेटा क्लास बनाएंगे. ये हमारी JPA इकाइयां होंगी. साथ ही, ये फ़ॉर्म के ज़रिए सबमिट किए गए रजिस्टर करने वालों की जानकारी को भी दिखाएंगे.

डेमो पैकेज में, दो नई फ़ाइलें जोड़ें: एक Person क्लास और एक Spring Data PersonRepository. इन दो क्लास की मदद से, हम Spring Data JPA का इस्तेमाल करके, अपने MySQL डेटाबेस से रजिस्ट्रेशन एंट्री को आसानी से सेव और वापस पा सकेंगे.

src/main/kotlin/com/example/demo/Person.kt

package com.example.demo

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Entity
data class Person(
    val firstName: String,
    val lastName: String,
    val email: String,
    @Id @GeneratedValue
    var id: Long? = 0)

src/main/kotlin/com/example/demo/PersonRepository.kt

package com.example.demo

import org.springframework.data.repository.CrudRepository

interface PersonRepository : CrudRepository<Person, Long>

वेब कंट्रोलर जोड़ना

इसके बाद, हम एक कंट्रोलर क्लास बनाएंगे. यह क्लास, फ़ॉर्म भरने वाले लोगों की जानकारी को प्रोसेस करेगी और उसे Cloud Pub/Sub के उस विषय पर भेजेगी जिसे आपने पहले बनाया था. यह कंट्रोलर दो एंडपॉइंट बनाता है:

  • /registerPerson: यह POST एंडपॉइंट है. इसमें रजिस्ट्रेंट की जानकारी सबमिट की जाती है. इसके बाद, इसे Pub/Sub विषय पर भेजा जाता है. registerPerson(..) फ़ंक्शन में, रजिस्टर करने वाले व्यक्ति की जानकारी को Pub/Sub विषय पर भेजा जाता है. इसके लिए, PubSubTemplate का इस्तेमाल किया जाता है. यह Spring Cloud GCP Pub/Sub इंटिग्रेशन का एक सुविधा क्लास है. इससे Cloud Pub/Sub के साथ इंटरैक्ट करने के लिए ज़रूरी बॉयलरप्लेट कोड कम हो जाता है.
  • /registrants: इसमें डेटाबेस में रजिस्टर किए गए सभी लोगों की जानकारी दिखती है. यह जानकारी, MySQL इंस्टेंस से मिलती है. इसके लिए, Spring Data रिपॉज़िटरी का इस्तेमाल किया जाता है. इसे हमने पिछले चरण में बनाया था.

डेमो पैकेज में यह Controller क्लास बनाएं:

src/main/kotlin/com/example/demo/Controller.kt

package com.example.demo

import com.google.cloud.spring.pubsub.core.PubSubTemplate
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.view.RedirectView

@RestController
class Controller(val pubSubTemplate: PubSubTemplate, val personRepository: PersonRepository) {
  
  // The Pub/Sub topic name created earlier.
  val REGISTRATION_TOPIC = "registrations"

  @PostMapping("/registerPerson")
  fun registerPerson(
    @RequestParam("firstName") firstName: String,
    @RequestParam("lastName") lastName: String,
    @RequestParam("email") email: String): RedirectView {

    pubSubTemplate.publish(
        REGISTRATION_TOPIC,
        Person(firstName, lastName, email))
    return RedirectView("/")
  }

  @GetMapping("/registrants")
  fun getRegistrants(): ModelAndView {
    val personsList = personRepository.findAll().toList()
    return ModelAndView("registrants", mapOf("personsList" to personsList))
  }
}

कंट्रोलर, वेब फ़ॉर्म के ज़रिए सबमिट की गई रजिस्ट्रेंट की जानकारी को पढ़ता है. इसके बाद, वह जानकारी को Pub/Sub टॉपिक पर पब्लिश करता है.

JSON ऑब्जेक्ट मैपर बीन जोड़ना

आपने कंट्रोलर में देखा होगा कि हम Pub/Sub के विषय में Person ऑब्जेक्ट पब्लिश करते हैं, न कि स्ट्रिंग. ऐसा इसलिए हो पाता है, क्योंकि हम विषयों को भेजे जाने वाले कस्टम JSON पेलोड के लिए, Spring Cloud GCP की सहायता का फ़ायदा उठाते हैं. लाइब्रेरी की मदद से, ऑब्जेक्ट को JSON में क्रम से लगाया जा सकता है, किसी विषय को JSON पेलोड भेजे जा सकते हैं, और पेलोड मिलने पर उसे क्रम से हटाया जा सकता है.

इस सुविधा का फ़ायदा लेने के लिए, हमें आपके ऐप्लिकेशन कॉन्टेक्स्ट में ObjectMapper bean जोड़ना होगा. जब आपका ऐप्लिकेशन मैसेज भेजता और पाता है, तब इस ObjectMapper बीन का इस्तेमाल, ऑब्जेक्ट को JSON में और JSON से ऑब्जेक्ट में बदलने के लिए किया जाएगा. DemoApplication.kt क्लास में, JacksonPubSubMessageConverter Spring bean जोड़ें:

src/main/kotlin/com/example/demo/DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

// new imports to add
import org.springframework.context.annotation.Bean
import com.fasterxml.jackson.databind.ObjectMapper
import com.google.cloud.spring.pubsub.support.converter.JacksonPubSubMessageConverter

@SpringBootApplication
class DemoApplication {
  // This bean enables serialization/deserialization of
  // Java objects to JSON for Pub/Sub payloads
  @Bean
  fun jacksonPubSubMessageConverter(objectMapper: ObjectMapper) = 
      JacksonPubSubMessageConverter(objectMapper)
}

fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
}

इस समय, ऐप्लिकेशन को फिर से चलाने के लिए, यह कमांड चलाएं:

$ ./mvnw spring-boot:run

मुख्य पेज पर मौजूद वेब फ़ॉर्म से, ऐप्लिकेशन अब उस Pub/Sub विषय पर जानकारी भेजेगा जिसे आपने बनाया है. हालांकि, इससे अब भी कोई फ़ायदा नहीं हो रहा है, क्योंकि हमें अब भी उस Pub/Sub विषय से डेटा पढ़ना है! यह काम अगले चरण में पूरा किया जाता है.

9. Pub/Sub विषय से रजिस्टर किए गए लोगों की जानकारी फ़ेच की जा रही है

आखिरी चरण में, हम Pub/Sub विषय से रजिस्टर करने वाले व्यक्ति की जानकारी को प्रोसेस करेंगे. साथ ही, इस जानकारी को Cloud MySQL डेटाबेस में सेव करेंगे. इससे आवेदन पूरा हो जाएगा. इसके बाद, फ़ॉर्म के ज़रिए नए लोगों को रजिस्टर किया जा सकेगा. साथ ही, /registrants एंडपॉइंट के ज़रिए रजिस्टर किए गए सभी उपयोगकर्ताओं को देखा जा सकेगा.

यह ऐप्लिकेशन, Spring Integration का फ़ायदा उठाएगा. यह मैसेजिंग से निपटने के लिए, कई सुविधाजनक ऐब्स्ट्रैक्शन उपलब्ध कराता है. हम एक PubSubInboundChannelAdapter जोड़ेंगे, ताकि हम Pub/Sub विषय से मैसेज पढ़ सकें और उन्हें आगे की प्रोसेस के लिए pubsubInputChannel पर डाल सकें. इसके बाद, हम messageReceiver फ़ंक्शन को कॉन्फ़िगर करेंगे. इसके लिए, @ServiceActivator का इस्तेमाल किया जाएगा, ताकि pubsubInputChannel पर आने वाले मैसेज के साथ इसे शुरू किया जा सके.

src/main/kotlin/com/example/demo/DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

import org.springframework.context.annotation.Bean
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.cloud.gcp.pubsub.support.converter.JacksonPubSubMessageConverter

// new imports to add
import com.google.cloud.spring.pubsub.core.PubSubTemplate
import com.google.cloud.spring.pubsub.integration.AckMode
import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter
import com.google.cloud.spring.pubsub.support.BasicAcknowledgeablePubsubMessage
import com.google.cloud.spring.pubsub.support.GcpPubSubHeaders
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.integration.annotation.ServiceActivator
import org.springframework.integration.channel.DirectChannel
import org.springframework.messaging.MessageChannel
import org.springframework.messaging.handler.annotation.Header

@SpringBootApplication
class DemoApplication {

  private val REGISTRANT_SUBSCRIPTION = "registrations-sub"

  @Autowired
  private lateinit var personRepository: PersonRepository

  // New Spring Beans to add
  @Bean
  fun pubsubInputChannel() = DirectChannel()

  @Bean
  fun messageChannelAdapter(
      @Qualifier("pubsubInputChannel") inputChannel: MessageChannel,
      pubSubTemplate: PubSubTemplate): PubSubInboundChannelAdapter {

    val adapter = PubSubInboundChannelAdapter(
        pubSubTemplate, REGISTRANT_SUBSCRIPTION)
    adapter.outputChannel = inputChannel
    adapter.ackMode = AckMode.MANUAL
    adapter.payloadType = Person::class.java
    return adapter
  }

  @ServiceActivator(inputChannel = "pubsubInputChannel")
  fun messageReceiver(
      payload: Person,
      @Header(GcpPubSubHeaders.ORIGINAL_MESSAGE) message: BasicAcknowledgeablePubsubMessage) {
    personRepository.save(payload)
    print("Message arrived! Payload: $payload")
    message.ack()
  }

  // ObjectMapper bean from previous step
  @Bean
  fun jacksonPubSubMessageConverter(objectMapper: ObjectMapper) = JacksonPubSubMessageConverter(objectMapper)
}

fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
}

इस चरण पर, आपने ऐप्लिकेशन के लिए सेटअप पूरा कर लिया है. यह पुष्टि करने के लिए कि ऐप्लिकेशन सही तरीके से काम कर रहा है, यह कमांड चलाएं:

$ ./mvnw spring-boot:run

झलक देखें बटन पर फिर से क्लिक करें. इसके बाद, फ़ॉर्म भरकर और सबमिट करके किसी उपयोगकर्ता को रजिस्टर करने की कोशिश करें.

e0d0b0f0c94120c2.png

रजिस्टर किए गए लोग लिंक पर क्लिक करके पुष्टि करें कि नया रजिस्ट्रेंट टेबल में दिख रहा है.

ab3b980423d0c51.png

बधाई हो, अब आपका काम पूरा हो गया है! टर्मिनल विंडो में CTRL+C दबाकर, ऐप्लिकेशन को बंद करें.

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

अपने एनवायरमेंट को खाली करने के लिए, आपको Pub/Sub विषय और Cloud MySQL इंस्टेंस मिटाना होगा.

Cloud MySQL इंस्टेंस मिटाना

$ gcloud sql instances delete codelab-instance

Pub/Sub रिसॉर्स मिटाना

$ gcloud pubsub subscriptions delete registrations-sub
$ gcloud pubsub topics delete registrations

11. बधाई हो!

आपने अब Cloud Pub/Sub और Cloud SQL (MySQL) के साथ इंटिग्रेट होने वाला Spring Kotlin ऐप्लिकेशन लिख लिया है.

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

लाइसेंस

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