Cloud Datastore के साथ Spring बूट ऐप्लिकेशन

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

Google Cloud Datastore एक NoSQL दस्तावेज़ डेटाबेस है. इसे अपने-आप स्केलिंग, बेहतर परफ़ॉर्मेंस, और ऐप्लिकेशन डेवलपमेंट को आसान बनाने के लिए बनाया गया है.

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

  • Spring Boot में Java ऑब्जेक्ट सेव करने और उन्हें वापस पाने के लिए, Cloud Datastore का इस्तेमाल कैसे करें

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

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

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

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

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 डॉलर का क्रेडिट मिलता है.

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. Cloud Datastore को शुरू करना

GCP Console में, मेन्यू -> Datastore (स्टोरेज सेक्शन में) पर जाएं या यहां क्लिक करें.

अगर आपने मौजूदा प्रोजेक्ट में कभी Datastore का इस्तेमाल नहीं किया है, तो आपको "Cloud Firestore मोड चुनें" स्क्रीन दिखेगी. "Datastore mode" विकल्प चुनें.

f938295c7ff297f4.png

इसके बाद, आपको "चुनें कि आपको अपना डेटा कहां सेव करना है" स्क्रीन दिखेगी. us-east1 या कोई अन्य क्षेत्रीय जगह चुनें और "डेटाबेस बनाएं" पर क्लिक करें:

916ac84fec10fae7.png

4. नया Spring Boot Java ऐप्लिकेशन बूटस्ट्रैप करना

CloudShell एनवायरमेंट में, नया Spring Boot ऐप्लिकेशन शुरू करने और बूटस्ट्रैप करने के लिए, यहां दिया गया निर्देश इस्तेमाल करें:

$ curl https://start.spring.io/starter.tgz \
  -d packaging=war \
  -d dependencies=cloud-gcp \
  -d type=maven-project \
  -d baseDir=datastore-example \
  -d bootVersion=3.0.5 | tar -xzvf -

इससे एक नई datastore-example/ डायरेक्ट्री बन जाएगी. इसमें एक नया Maven प्रोजेक्ट, Maven का pom.xml, Maven रैपर, और ऐप्लिकेशन एंट्रीपॉइंट होगा.

हमारा ऐप्लिकेशन, उपयोगकर्ताओं को कमांड डालने और नतीजे देखने के लिए सीएलआई उपलब्ध कराएगा. हम एक क्लास बनाएंगे, ताकि किसी किताब को दिखाया जा सके. इसके बाद, हम इसे Datastore Repository का इस्तेमाल करके Cloud Datastore में सेव करेंगे.

हमें pom.xml में एक और ज़रूरी डिपेंडेंसी जोड़नी होगी.

Cloud Shell मेन्यू में जाकर, एडिटर खोलें पर क्लिक करके, वेब कोड एडिटर खोलें.

6d823258c76a7452.png

एडिटर लोड होने के बाद, Google Cloud Datastore Starter और Spring Shell Starter डिपेंडेंसी जोड़ने के लिए, pom.xml फ़ाइल में बदलाव करें:

pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add GCP Datastore Starter -->
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-data-datastore</artifactId>
        </dependency>

        <!-- Add Spring Shell Starter -->
        <dependency>
                <groupId>org.springframework.shell</groupId>
                <artifactId>spring-shell-starter</artifactId>
                <version>3.0.2</version>
        </dependency>

  </dependencies>
</project>

5. Book क्लास बनाना

Editor का इस्तेमाल करके, इस कॉन्टेंट के साथ Book क्लास बनाएं:

datastore-example/src/main/java/com/example/demo/Book.java

package com.example.demo;

import com.google.cloud.spring.data.datastore.core.mapping.Entity;
import org.springframework.data.annotation.Id;

@Entity(name = "books")
public class Book {
  @Id
  Long id;

  String title;

  String author;

  int year;

  public Book(String title, String author, int year) {
    this.title = title;
    this.author = author;
    this.year = year;
  }

  public long getId() {
    return this.id;
  }

  @Override
  public String toString() {
    return "Book{" +
        "id=" + this.id +
        ", title='" + this.title + '\'' +
        ", author='" + this.author + '\'' +
        ", year=" + this.year +
        '}';
  }
}

जैसा कि आप देख सकते हैं, यह एक सामान्य POJO है. क्लास को @Entity के साथ एनोटेट किया जाता है. इससे पता चलता है कि इसे Datastore में सेव किया जा सकता है. साथ ही, यह काइंड का नाम भी देता है. काइंड को SQL डेटाबेस में टेबल के तौर पर देखा जा सकता है. ज़्यादा जानकारी के लिए, दस्तावेज़ देखें. तरह का नाम देना ज़रूरी नहीं है. अगर इसे नहीं दिया जाता है, तो क्लास के नाम के आधार पर तरह का नाम जनरेट किया जाएगा.

ध्यान दें कि हमने id प्रॉपर्टी को @Id से एनोटेट किया है. इससे पता चलता है कि हम चाहते हैं कि इस फ़ील्ड का इस्तेमाल, Datastore की कुंजी के आइडेंटिफ़ायर के तौर पर किया जाए. हर Datastore इकाई के लिए एक आइडेंटिफ़ायर की ज़रूरत होती है. String और Long टाइप की फ़ाइलें इस्तेमाल की जा सकती हैं.

हम ऑब्जेक्ट के स्ट्रिंग प्रज़ेंटेशन को ज़्यादा आसानी से पढ़ने के लिए, toString तरीके को बदल देते हैं. यह तब काम आएगा, जब हम उन्हें प्रिंट करेंगे.

6. BookRepository इंटरफ़ेस बनाएं

इस कॉन्टेंट के साथ BookRepository क्लास बनाएं:

datastore-example/src/main/java/com/example/demo/BookRepository.java

package com.example.demo;

import java.util.List;

import com.google.cloud.spring.data.datastore.repository.DatastoreRepository;


public interface BookRepository extends DatastoreRepository<Book, Long> {

  List<Book> findByAuthor(String author);

  List<Book> findByYearGreaterThan(int year);

  List<Book> findByAuthorAndYear(String author, int year);
}

इंटरफ़ेस DatastoreRepository<Book, Long> को बढ़ाता है. इसमें Book डोमेन क्लास है और Long, Id टाइप है. हमने अपनी रिपॉज़िटरी में तीन क्वेरी मेथड के बारे में बताया है. इनके लिए, बैकग्राउंड में अपने-आप कोड जनरेट होता है.

पहला विकल्प findByAuthor है. जैसा कि आपको पता है, इस तरीके को लागू करने पर एक क्वेरी चलेगी. इसमें उपयोगकर्ता की ओर से दी गई वैल्यू का इस्तेमाल, लेखक फ़ील्ड के बराबर होने की शर्त वाले फ़िल्टर में किया जाएगा.

findByYearGreaterThan तरीका, ऐसी क्वेरी को लागू करता है जो साल वाले फ़ील्ड को उपयोगकर्ता की दी गई वैल्यू से ज़्यादा के लिए फ़िल्टर करती है.

findByAuthorAndYear ऐसी क्वेरी को एक्ज़ीक्यूट करता है जो ऐसी इकाइयों को खोजती है जहां लेखक और साल के फ़ील्ड, उपयोगकर्ता की दी गई वैल्यू से मेल खाते हों.

7. इंटरैक्टिव सीएलआई ऐप्लिकेशन बनाना

मुख्य ऐप्लिकेशन DemoApplication क्लास खोलें और इसमें इस तरह से बदलाव करें:

datastore-example/src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

import java.util.List;

import com.google.common.collect.Lists;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;

@ShellComponent
@SpringBootApplication
public class DemoApplication {
  @Autowired
  BookRepository bookRepository;

  public static void main(String[] args) {
     SpringApplication.run(DemoApplication.class, args);
  }

  @ShellMethod("Saves a book to Cloud Datastore: save-book <title> <author> <year>")
  public String saveBook(String title, String author, int year) {
     Book savedBook = this.bookRepository.save(new Book(title, author, year));
     return savedBook.toString();
  }

  @ShellMethod("Loads all books")
  public String findAllBooks() {
     Iterable<Book> books = this.bookRepository.findAll();
     return Lists.newArrayList(books).toString();
  }

  @ShellMethod("Loads books by author: find-by-author <author>")
  public String findByAuthor(String author) {
     List<Book> books = this.bookRepository.findByAuthor(author);
     return books.toString();
  }

  @ShellMethod("Loads books published after a given year: find-by-year-after <year>")
  public String findByYearAfter(int year) {
     List<Book> books = this.bookRepository.findByYearGreaterThan(year);
     return books.toString();
  }

  @ShellMethod("Loads books by author and year: find-by-author-year <author> <year>")
  public String findByAuthorYear(String author, int year) {
     List<Book> books = this.bookRepository.findByAuthorAndYear(author, year);
     return books.toString();
  }

  @ShellMethod("Removes all books")
  public void removeAllBooks() {
     this.bookRepository.deleteAll();
  }
}

ध्यान दें कि हमने क्लास को @ShellComponent से कैसे एनोटेट किया है. इससे Spring को पता चलता है कि हमें इस क्लास का इस्तेमाल, सीएलआई कमांड के सोर्स के तौर पर करना है. @ShellMethod के साथ एनोटेट किए गए तरीकों को हमारे ऐप्लिकेशन में सीएलआई कमांड के तौर पर दिखाया जाएगा.

यहां हम उन तरीकों का इस्तेमाल करते हैं जिन्हें हमने BookRepository इंटरफ़ेस में बताया है: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. हम तीन इन-बिल्ट तरीकों का भी इस्तेमाल करते हैं: save, findAll, और deleteAll.

आइए, saveBook तरीके के बारे में जानते हैं. हम Book ऑब्जेक्ट बनाते हैं. इसके लिए, हम उपयोगकर्ता से मिले डेटा का इस्तेमाल करते हैं. जैसे, टाइटल, लेखक, और साल. जैसा कि आप देख सकते हैं, हम id वैल्यू नहीं देते हैं. इसलिए, इसे सेव करने पर id फ़ील्ड में अपने-आप असाइन कर दिया जाएगा. save तरीका, Book टाइप के ऑब्जेक्ट को स्वीकार करता है और उसे Cloud Datastore में सेव करता है. यह फ़ंक्शन, Book ऑब्जेक्ट दिखाता है. इसमें सभी फ़ील्ड की वैल्यू मौजूद होती है. इसमें id फ़ील्ड भी शामिल होता है. आखिर में, हम इस ऑब्जेक्ट का स्ट्रिंग वर्शन दिखाते हैं.

बाकी तरीके भी इसी तरह काम करते हैं: ये पास किए गए पैरामीटर को सही रिपॉज़िटरी के तरीकों में स्वीकार करते हैं और स्ट्रिंग के तौर पर नतीजे दिखाते हैं.

8. ऐप्लिकेशन चलाना

ऐप्लिकेशन बनाने और उसे शुरू करने के लिए, पहले पक्का करें कि JAVA_HOME को सही वर्शन पर सेट किया गया हो:

$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

इस कमांड को Cloud Shell में चलाएं. इसके लिए, प्रोजेक्ट datastore-example/ के रूट पर जाएं. यहीं पर pom.xml मौजूद है:

$ ./mvnw spring-boot:run
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

बिल्ड स्टेज पूरा होने के बाद, स्प्रिंग का लोगो दिखेगा और शेल प्रॉम्प्ट दिखेगा:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.5)



shell:>

अब उन निर्देशों के साथ एक्सपेरिमेंट किया जा सकता है जिनके बारे में हमने पहले बताया था. कमांड की सूची देखने के लिए, सहायता कमांड का इस्तेमाल करें:

shell:> help
...
find-all-books: Loads all books
find-by-author: Loads books by author: find-by-author <author>
find-by-author-year: Loads books by author and year: find-by-author-year <author> <year>
find-by-year-after: Loads books published after a given year: find-by-year-after <year>
remove-all-books: Removes all books
save-book: Saves a book to Cloud Datastore: save-book <title> <author> <year>

ये तरीके आज़माएं:

  1. save-book निर्देश का इस्तेमाल करके कुछ किताबें बनाना
  2. find-all-books निर्देश का इस्तेमाल करके खोज करना
  3. किसी खास लेखक की किताबें ढूंढें: find-by-author <author>
  4. किसी साल के बाद पब्लिश हुई किताबें ढूंढें: find-by-year-after <year>
  5. किसी लेखक की किसी साल में लिखी गई किताबें ढूंढें: find-by-author-year <author> <year>

9. वेब इंटरफ़ेस का इस्तेमाल करके, यह देखना कि Datastore में क्या सेव है

Cloud Datastore में इकाइयों को कैसे सेव किया जाता है, यह देखने के लिए GCP Console पर जाएं. अगर ज़रूरी हो, तो तरह वाले फ़ील्ड में "books" डालें.

5fab21a6c89f45a.png

10. व्यवस्थित करें

साफ़ करने के लिए, ऐप्लिकेशन शेल से remove-all-books कमांड का इस्तेमाल करके सभी किताबें हटाएं.

shell:> remove-all-books

ऐप्लिकेशन से बाहर निकलने के लिए, quit निर्देश का इस्तेमाल करें. इसके बाद, Ctrl+C दबाएं.

11. बधाई हो!

इस कोडलैब में, आपने एक इंटरैक्टिव सीएलआई ऐप्लिकेशन बनाया है. यह Cloud Datastore से ऑब्जेक्ट सेव और वापस पा सकता है!

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

लाइसेंस

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