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

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

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

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

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

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

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

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

f938295c7ff297f4.png

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

916ac84fec10fae7.png

4. नए Spring बूट Java ऐप्लिकेशन को बूटस्ट्रैप करें

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

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

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

हमारा ऐप्लिकेशन, उपयोगकर्ताओं को एक सीएलआई उपलब्ध कराता है, ताकि वे निर्देश दे सकें और नतीजे देख सकें. हम किसी किताब को दिखाने के लिए एक क्लास बनाएंगे और फिर उसे Datastore डेटा स्टोर करने की जगह का इस्तेमाल करके, 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 क्लास बनाएं:

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 में सेव किया जा सकता है और इसे किसी तरह का नाम दिया जा सकता है. इसे एसक्यूएल डेटाबेस में टेबल की तरह समझें, ज़्यादा जानकारी के लिए दस्तावेज़ देखें. प्रकार का नाम वैकल्पिक है - अगर इसे छोड़ा जाता है, तो प्रकार का नाम क्लास के नाम के आधार पर जनरेट होगा.

ध्यान दें कि हमने @Id प्रॉपर्टी के साथ id प्रॉपर्टी की व्याख्या की है. इससे पता चलता है कि हम इस फ़ील्ड का इस्तेमाल Datastore Key के आइडेंटिफ़ायर हिस्से के तौर पर करना चाहते हैं. हर 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 कंसोल पर जाएं. "किताबें" इनपुट करें डालें.

5fab21a6c89f45a.png

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

स्टोरेज खाली करने के लिए, ऐप्लिकेशन शेल से सही नाम वाले remove-all-books निर्देश का इस्तेमाल करके सभी किताबों को हटाएं.

shell:> remove-all-books

ऐप्लिकेशन से बाहर निकलने के लिए, बंद करें आदेश का उपयोग करें, फिर Ctrl+C का उपयोग करें.

11. बधाई हो!

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

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

लाइसेंस

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