درباره این codelab
1. بررسی اجمالی
Google Cloud Datastore یک پایگاه داده اسناد NoSQL است که برای مقیاس بندی خودکار، کارایی بالا و سهولت توسعه برنامه ساخته شده است.
چیزی که یاد خواهید گرفت
- نحوه استفاده از Cloud Datastore برای ذخیره و بازیابی اشیاء جاوا در Spring Boot
آنچه شما نیاز دارید
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را در استفاده از خدمات پلتفرم Google Cloud چگونه ارزیابی می کنید؟
2. راه اندازی و الزامات
تنظیم محیط خود به خود
اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید:
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID
خواهد شد.
در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در کنسول Cloud فعال کنید.
گذراندن این کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا اگر آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد (به بخش "پاکسازی" در انتهای این سند مراجعه کنید).
کاربران جدید Google Cloud Platform واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند.
Google Cloud Shell را فعال کنید
از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
سپس روی "Start Cloud Shell" کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را بسیار افزایش می دهد. اگر نگوییم تمام کارهای شما در این آزمایشگاه را می توان به سادگی با یک مرورگر یا Google 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].
3. Cloud Datastore را راه اندازی کنید
در کنسول GCP، به Menu -> Datastore (در بخش Storage) بروید.
اگر هرگز از Datastore در پروژه فعلی استفاده نکردهاید، صفحه «انتخاب حالت Cloud Firestore» را خواهید دید. گزینه "Datastore mode" را انتخاب کنید.
پس از آن، صفحه "انتخاب محل ذخیره داده های خود" را خواهید دید. us-east1 یا هر مکان منطقهای دیگر را انتخاب کنید و روی «ایجاد پایگاه داده» کلیک کنید:
4. یک برنامه جاوا Spring Boot جدید را بوت استرپ کنید
از محیط CloudShell، از دستور زیر برای مقداردهی اولیه و بوت استرپ یک برنامه Spring Boot جدید استفاده کنید:
$ 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 -
این یک دایرکتوری datastore-example/
جدید با یک پروژه Maven جدید، همراه با Maven's pom.xml
، یک پوشش Maven و همچنین یک نقطه ورودی برنامه ایجاد می کند.
برنامه ما یک CLI برای کاربران فراهم می کند تا دستورات را وارد کرده و نتایج را ببینند. ما یک کلاس برای نمایش یک کتاب ایجاد می کنیم و سپس آن را با استفاده از Datastore Repository در Cloud Datastore ذخیره می کنیم.
همچنین باید یک وابستگی ضروری دیگر به pom.xml
اضافه کنیم.
با کلیک بر روی Launch code editor از منوی Cloud Shell، ویرایشگر کد وب را باز کنید.
پس از بارگیری ویرایشگر، فایل pom.xml
را تغییر دهید تا وابستگی آغازگر Spring Data Cloud Datastore Spring Boot را اضافه کنید:
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>
5. کلاس Book ایجاد کنید
با استفاده از ویرایشگر، کلاس 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 +
'}';
}
}
همانطور که می بینید، این یک 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 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
پرس و جوی را اجرا می کند که به دنبال موجودیت هایی می گردد که فیلدهای نویسنده و سال با مقادیر ارائه شده کاربر مطابقت دارند.
7. برنامه تعاملی CLI را ایجاد کنید
کلاس 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 اطلاع می دهد که می خواهیم از این کلاس به عنوان منبعی برای دستورات CLI استفاده کنیم. متدهای حاشیه نویسی شده با @ShellMethod
به عنوان دستورات CLI در برنامه ما نمایش داده می شوند.
در اینجا از روشهایی که در رابط BookRepository اعلام کردهایم استفاده میکنیم: findByAuthor
، findByYearGreaterThan
، findByAuthorAndYear
. همچنین ما از سه روش داخلی استفاده می کنیم: save
، findAll
و deleteAll
.
بیایید به saveBook
نگاه کنیم روش. ما یک شی Book
با استفاده از مقادیر ارائه شده توسط کاربر برای عنوان، نویسنده و سال ایجاد می کنیم. همانطور که می بینید، ما یک مقدار id
ارائه نمی دهیم، بنابراین به طور خودکار در ذخیره به فیلد id تخصیص داده می شود. متد save
یک شی از نوع Book
را می پذیرد و آن را در Cloud Datastore ذخیره می کند. یک شی Book
با تمام فیلدهای پر شده، از جمله فیلد id
، برمی گرداند. در پایان یک نمایش رشته ای از این شی را برمی گردانیم.
بقیه روش ها به طور مشابه عمل می کنند: آنها پارامترهایی را به روش های مخزن مناسب می پذیرند و نتایج رشته ای را برمی گردانند.
8. برنامه را اجرا کنید
برای ساخت و شروع برنامه، این دستور را در Cloud Shell (از ریشه پروژه datastore-example/
جایی که pom.xml
قرار دارد) اجرا کنید:
$ mvn spring-boot:run
پس از یک مرحله ساخت موفق، لوگوی فنری ظاهر می شود و پیام پوسته ظاهر می شود:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) shell:>
اکنون می توانید با دستوراتی که قبلا تعریف کردیم آزمایش کنید. برای مشاهده لیست دستورات، از دستور help استفاده کنید:
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 بروید و به منو -> Datastore (در بخش ذخیرهسازی) -> Entities (در صورت لزوم فضای نام «[پیشفرض]» و نوع «کتاب» را انتخاب کنید) بروید.
10. پاک کردن
برای پاکسازی، همه کتابها را با استفاده از دستور حذف همه کتابها با نام مناسب از پوسته برنامه remove-all-books
.
shell:> remove-all-books
برای خروج از برنامه از دستور quit و سپس Ctrl+C استفاده کنید.
11. تبریک می گویم!
در این کد لبه، شما یک برنامه CLI تعاملی ایجاد کرده اید که می تواند اشیاء را از Cloud Datastore ذخیره و بازیابی کند!
بیشتر بدانید
- Cloud Datastore: https://cloud.google.com/datastore/
- اسپرینگ شل: https://projects.spring.io/spring-shell/
- پروژه Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring در مخزن GCP GitHub: https://github.com/spring-cloud/spring-cloud-gcp
- جاوا در Google Cloud Platform: https://cloud.google.com/java/
مجوز
این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.