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

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

आप क्या #39;जानेंगे

  • स्प्रिंग बूट में Java ऑब्जेक्ट को सेव करने और वापस पाने के लिए, Cloud Datastore का इस्तेमाल कैसे करें

आपको इनकी ज़रूरत होगी

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

आप इस ट्यूटोरियल का इस्तेमाल कैसे करेंगे?

सिर्फ़ इसे पढ़ें इसे पढ़ें और कसरत करें

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

शुरुआती बीच का लेवल असरदार

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

अगर आपके पास पहले से कोई Google खाता (Gmail या Google Apps) नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Platform Console (console.cloud.google.com) में साइन इन करें और एक नया प्रोजेक्ट बनाएं:

10-02-2016 का स्क्रीनशॉट 12:45:26.png

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

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

इस कोडलैब के जवाब में कुछ डॉलर से ज़्यादा खर्च नहीं करना चाहिए. हालांकि, अगर आप संसाधनों का इस्तेमाल करना जारी रखते हैं या उन्हें चलाना बंद कर देते हैं, तो यह ज़्यादा भी हो सकता है.

Google Cloud Platform के नए उपयोगकर्ता, 300 डॉलर का मुफ़्त ट्रायल पा सकते हैं.

Google Cloud Shell चालू करें

GCP Console पर सबसे ऊपर दाईं ओर मौजूद टूलबार में, Cloud Shell आइकॉन पर क्लिक करें:

इसके बाद, &Cont &Cloud Shell शुरू करें &कोटेशन पर क्लिक करें;:

प्रावधान करने और पर्यावरण से जुड़ने में सिर्फ़ कुछ समय लगना चाहिए:

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

Cloud Shell से कनेक्ट होने के बाद, आपको यह दिख जाएगा कि इसकी पुष्टि पहले से ही हो चुकी है और प्रोजेक्ट पहले से ही आपके PROJECT_ID पर सेट है.

पुष्टि करने के लिए, Cloud Shell में यह निर्देश चलाएं:

gcloud auth list

कमांड आउटपुट

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

अगर ऐसा नहीं है, तो आप इस निर्देश से इसे सेट कर सकते हैं:

gcloud config set project <PROJECT_ID>

कमांड आउटपुट

Updated property [core/project].

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

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

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

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

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

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

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

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

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

एडिटर लोड होने के बाद, 'स्प्रिंग डेटा क्लाउड' डेटा स्टोर स्प्रिंग बूट स्टार्टर डिपेंडेंसी जोड़ने के लिए, pom.xml फ़ाइल में बदलाव करें:

pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add GCP Datastore Starter -->
        <dependency>
                <groupId>org.springframework.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>2.0.0.RELEASE</version>
        </dependency>

  </dependencies>
</project>

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

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

package com.example.demo;

import org.springframework.cloud.gcp.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 +
                                '}';
        }
}

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

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

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

फ़ाइल सेव करना न भूलें!

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

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

package com.example.demo;

import java.util.List;

import org.springframework.cloud.gcp.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 ऐसी क्वेरी करता है जो उन इकाइयों को खोजती है जहां लेखक और साल के फ़ील्ड, उपयोगकर्ता की दी गई वैल्यू से मेल खाते हैं.

मुख्य ऐप्लिकेशन 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 को क्लास के साथ कैसे एनोटेशन किया है. इससे स्प्रिंग को पता चलता है कि हम सीएलआई कमांड के लिए सोर्स के तौर पर इस क्लास का इस्तेमाल करना चाहते हैं. @ShellMethod में बताए गए तरीके, हमारे ऐप्लिकेशन में सीएलआई कमांड के तौर पर दिखाए जाएंगे.

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

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

बाकी तरीके इसी तरह काम करते हैं: वे पैरामीटर को, डेटा स्टोर करने के सही तरीकों के साथ पास करते हैं और स्ट्रिंग के मुताबिक नतीजे देते हैं.

ऐप्लिकेशन बनाने और शुरू करने के लिए, इस निर्देश को Cloud Shell (datastore-example/ प्रोजेक्ट (जहां pom.xml मौजूद है) के रूट से) चलाएं :

$ mvn spring-boot:run

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

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)


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

यह देखने के लिए कि क्लाउड डेटास्टोर में इकाइयां कैसे संग्रहित की जाती हैं, GCP कंसोल पर जाएं और मेन्यू -> डेटास्टोर (स्टोरेज सेक्शन में) -> इकाइयां{0/} (चुनें और कोटेशन; डिफ़ॉल्ट]

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

shell:> remove-all-books

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

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

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

लाइसेंस

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