اپلیکیشن Spring Boot با Cloud Datastore

Google Cloud Datastore یک پایگاه داده اسناد NoSQL است که برای مقیاس بندی خودکار، کارایی بالا و سهولت توسعه برنامه ساخته شده است.

چیزی که یاد خواهید گرفت

  • نحوه استفاده از Cloud Datastore برای ذخیره و بازیابی اشیاء جاوا در Spring Boot

آنچه شما نیاز دارید

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را در استفاده از سرویس‌های پلتفرم ابری Google چگونه ارزیابی می‌کنید؟

تازه کار متوسط مسلط

تنظیم محیط خود به خود

اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید:

اسکرین شات از 10/02/2016 12:45:26.png

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های 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].

در کنسول GCP، به Menu -> Datastore (در بخش Storage) بروید.

اگر هرگز از Datastore در پروژه فعلی استفاده نکرده‌اید، صفحه «انتخاب حالت Cloud Firestore» را خواهید دید. گزینه "Datastore mode" را انتخاب کنید.

پس از آن، صفحه "انتخاب محل ذخیره داده های خود" را خواهید دید. us-east1 یا هر مکان منطقه‌ای دیگر را انتخاب کنید و روی «ایجاد پایگاه داده» کلیک کنید:

از محیط 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>

با استفاده از ویرایشگر، کلاس 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 را لغو می کنیم روشی برای خوانایی بیشتر نمایش رشته ای اشیا؛ این زمانی مفید خواهد بود که آنها را چاپ کنیم.

فراموش نکنید که فایل را ذخیره کنید!

کلاس 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 حاشیه نویسی کردیم. این به Spring اطلاع می دهد که می خواهیم از این کلاس به عنوان منبعی برای دستورات CLI استفاده کنیم. متدهای حاشیه نویسی شده با @ShellMethod به عنوان دستورات CLI در برنامه ما نمایش داده می شوند.

در اینجا از روش‌هایی که در رابط BookRepository اعلام کردیم استفاده می‌کنیم: findByAuthor ، findByYearGreaterThan ، findByAuthorAndYear . همچنین ما از سه روش داخلی استفاده می کنیم: save ، findAll و deleteAll .

بیایید به saveBook نگاه کنیم روش ما یک شی Book با استفاده از مقادیر ارائه شده توسط کاربر برای عنوان، نویسنده و سال ایجاد می کنیم. همانطور که می بینید، ما یک مقدار id ارائه نمی دهیم، بنابراین به طور خودکار در ذخیره به فیلد id اختصاص داده می شود. متد save یک شی از نوع Book را می پذیرد و آن را در Cloud Datastore ذخیره می کند. یک شی Book با تمام فیلدهای پر شده، از جمله فیلد id ، برمی گرداند. در پایان یک نمایش رشته ای از این شی را برمی گردانیم.

بقیه روش ها به طور مشابه عمل می کنند: آنها پارامترهایی را به روش های مخزن مناسب می پذیرند و نتایج رشته ای را برمی گردانند.

برای ساخت و شروع برنامه، این دستور را در 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>

موارد زیر را امتحان کنید:

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

برای مشاهده نحوه ذخیره موجودیت‌ها در Cloud Datastore، به کنسول GCP بروید و به منو -> Datastore (در بخش ذخیره‌سازی) -> Entities بروید (در صورت لزوم فضای نام «[پیش‌فرض]» و نوع «کتاب» را انتخاب کنید).

برای پاکسازی، همه کتاب‌ها را با استفاده از دستور remove-all-books با نام مناسب از پوسته برنامه حذف کنید.

shell:> remove-all-books

برای خروج از برنامه از دستور quit و سپس Ctrl+C استفاده کنید.

در این کد لبه، شما یک برنامه CLI تعاملی ایجاد کرده اید که می تواند اشیاء را از Cloud Datastore ذخیره و بازیابی کند!

بیشتر بدانید

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.