1. खास जानकारी
Google Cloud Datastore एक NoSQL दस्तावेज़ डेटाबेस है. इसे अपने-आप स्केल करने, अच्छी परफ़ॉर्मेंस, और ऐप्लिकेशन डेवलपमेंट में आसानी के लिए बनाया गया है.
आपको इनके बारे में जानकारी मिलेगी
- स्प्रिंग बूट में Java ऑब्जेक्ट को सेव और वापस पाने के लिए, Cloud Datastore का इस्तेमाल कैसे करें
आपको किन चीज़ों की ज़रूरत होगी
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
Google Cloud Platform की सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेटअप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे बदला नहीं जा सकता. इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको अपना प्रोजेक्ट आईडी बताना होगा. आम तौर पर, इसकी पहचान
PROJECT_ID
के रूप में की जाती है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. दूसरा तरीका यह है कि आप खुद भी आज़माकर देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. साथ ही, यह प्रोजेक्ट के खत्म होने तक बना रहता है. - आपकी जानकारी के लिए, प्रोजेक्ट नंबर नाम की एक तीसरी वैल्यू दी गई है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, बिलिंग से बचने के लिए संसाधनों को बंद करें. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.
Cloud Shell चालू करें
- Cloud Console में, Cloud Shell चालू करें पर क्लिक करें.
अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.
प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.
इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह Google Cloud में काम करती है. यह नेटवर्क की परफ़ॉर्मेंस और ऑथेंटिकेशन को बेहतर बनाने में मदद करती है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम ब्राउज़र से किया जा सकता है.
Cloud Shell से कनेक्ट करने के बाद, आपको दिखेगा कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट आपके प्रोजेक्ट आईडी पर सेट है.
- यह पुष्टि करने के लिए 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`
- 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 मोड चुनें" स्क्रीन दिखेगी. "डेटास्टोर मोड" विकल्प चुनें.
इसके बाद, आपको "चुनें कि अपना डेटा कहां सेव करना है" स्क्रीन दिखेगी. us-east1 या कोई दूसरी जगह चुनें और "डेटाबेस बनाएं" पर क्लिक करें:
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 मेन्यू से एडिटर खोलें पर क्लिक करके वेब कोड एडिटर खोलें.
एडिटर लोड होने के बाद, 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>
नीचे दिए तरीके आज़माएं:
save-book
निर्देश का इस्तेमाल करके कुछ किताबें बनाएंfind-all-books
निर्देश का इस्तेमाल करके खोज करें- किसी खास लेखक की किताबें ढूंढें:
find-by-author <author>
- किसी खास साल के बाद पब्लिश हुई किताबें ढूंढें:
find-by-year-after <year>
- किसी खास लेखक और साल की किताबें ढूंढें:
find-by-author-year <author> <year>
9. वेब इंटरफ़ेस का इस्तेमाल करके देखें कि Datastore में क्या सेव किया गया है
यह देखने के लिए कि Cloud Datastore में इकाइयों को कैसे सेव किया जाता है, GCP कंसोल पर जाएं. "किताबें" इनपुट करें डालें.
10. व्यवस्थित करें
स्टोरेज खाली करने के लिए, ऐप्लिकेशन शेल से सही नाम वाले remove-all-books
निर्देश का इस्तेमाल करके सभी किताबों को हटाएं.
shell:> remove-all-books
ऐप्लिकेशन से बाहर निकलने के लिए, बंद करें आदेश का उपयोग करें, फिर Ctrl+C
का उपयोग करें.
11. बधाई हो!
इस कोडलैब में, आपने ऐसा इंटरैक्टिव सीएलआई ऐप्लिकेशन बनाया है जो Cloud Datastore से ऑब्जेक्ट को स्टोर और वापस ला सकता है!
ज़्यादा जानें
- क्लाउड डेटास्टोर: https://cloud.google.com/datastore/
- स्प्रिंग शेल: https://projects.spring.io/spring-shell/
- GCP प्रोजेक्ट के लिए स्प्रिंग सीज़न: https://spring.io/projects/spring-cloud-gcp
- GCP GitHub के डेटा स्टोर करने की जगह पर वसंत के लिए: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Google Cloud Platform पर Java: https://cloud.google.com/java/
लाइसेंस
इस काम को क्रिएटिव कॉमंस एट्रिब्यूशन 2.0 जेनरिक लाइसेंस के तहत लाइसेंस मिला है.