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 बूट ऐप्लिकेशन सेट अप करना होगा, जो रजिस्ट्रेंट की जानकारी स्वीकार करता है, उसे 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 के नए उपयोगकर्ता, 300USD डॉलर के मुफ़्त में आज़माने वाले प्रोग्राम में हिस्सा ले सकते हैं.

Google Cloud शेल

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

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें H7JlbhKGHITmsxhQIcL प्रयोग पर क्लिक करें.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

$ 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 टर्मिनल पर भी निर्भर करेगा. ध्यान दें कि Cloud SQL के इंस्टेंस, Google Cloud Console से भी देखे और कॉन्फ़िगर किए जा सकते हैं.

सबसे पहले, 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 बूट ऐप्लिकेशन शुरू करें

अब हम ऐप्लिकेशन लिखने के लिए तैयार हैं. अगले चरण में, सेटअप के चरणों में बताए गए 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 इंस्टेंस खोलने के बाद, कोड एडिटर खोलने के लिए पेंसिल आइकॉन पर क्लिक करें. एडिटर की मदद से, Initialzr के ज़रिए तैयार की गई प्रोजेक्ट फ़ाइलों में सीधे तौर पर बदलाव किया जा सकता है.

cce293b40119c37b.png

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

सबसे पहले, अपने ऐप्लिकेशन को कॉन्फ़िगर करें, ताकि वह आपके सेट अप किए गए Cloud MySQL डेटाबेस से कनेक्ट हो सके. Spring Cloud GCP लाइब्रेरी में Cloud MySQL स्टार्टर उपलब्ध होता है. यह 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 डेटा क्लास बनाएंगे; ये हमारी जेपीए इकाइयां होंगी. साथ ही, फ़ॉर्म के ज़रिए सबमिट किए गए रजिस्ट्रेशन करने वाले लोगों के हमारे बीच के प्रतिनिधि के तौर पर भी काम करेंगी.

डेमो पैकेज में, दो नई फ़ाइलें जोड़ें: 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: वह पीओएस एंडपॉइंट जिसमें रजिस्ट्रेंट की जानकारी सबमिट की जाती है और उसे Pub/Sub विषय पर भेजा जाता है. registerPerson(..) फ़ंक्शन में, रजिस्ट्रेंट की जानकारी PubSubTemplate का इस्तेमाल करके Pub/Sub विषय को भेजी जाती है. यह Spring Cloud GCP Pub/Sub इंटिग्रेशन की एक सुविधा क्लास है. यह Cloud Pub/Sub से इंटरैक्ट करने के लिए, ज़रूरी बॉयलरप्लेट कोड को कम कर देती है.
  • /registrants: डेटाबेस में रजिस्टर किए गए सभी रजिस्ट्रेंट को दिखाता है. यह जानकारी, पिछले चरण में बनाए गए Spring डेटा रिपॉज़िटरी का इस्तेमाल करके MySQL इंस्टेंस से ली गई है.

डेमो पैकेज में नीचे दी गई कंट्रोलर क्लास बनाएं:

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 बीन जोड़ना होगा. जब आपका ऐप्लिकेशन मैसेज भेजता और पाता है, तो इस ObjectMapper बीन का इस्तेमाल, JSON में ऑब्जेक्ट को क्रम से लगाने के लिए किया जाएगा. DemoApplication.kt क्लास में, JacksonPubSubMessageConverter स्प्रिंग बीन जोड़ें:

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 इंटिग्रेशन का फ़ायदा लेगा. इसमें मैसेज सेवा का इस्तेमाल करने के लिए, कई आसान विकल्प मिलते हैं. हम एक PubSubInboundChannelAdapter जोड़ेंगे, ताकि हम Pub/Sub विषय से जुड़े मैसेज पढ़ सकें और उन्हें pubsubInputChannel पर रख सकें, ताकि आगे की प्रोसेस की जा सके. इसके बाद, हम @ServiceActivator का इस्तेमाल करके, messageReceiver फ़ंक्शन को कॉन्फ़िगर करेंगे, ताकि 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. बधाई हो!

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

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

लाइसेंस

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