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

1. بررسی اجمالی

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

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

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

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

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

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

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

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

2. راه اندازی و الزامات

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

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.

9c92662c6a846a5c.png

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  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 Console ، به منو -> Datastore (در بخش Storage) بروید یا اینجا را کلیک کنید .

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

f938295c7ff297f4.png

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

916ac84fec10fae7.png

4. یک برنامه Spring Boot Java جدید را بوت استرپ کنید

از محیط CloudShell، از دستور زیر برای مقداردهی اولیه و بوت استرپ یک برنامه Spring Boot جدید استفاده کنید:

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

این یک دایرکتوری datastore-example/ جدید با یک پروژه Maven جدید، همراه با Maven's pom.xml ، یک پوشش Maven و یک نقطه ورودی برنامه ایجاد می کند.

برنامه ما یک CLI برای کاربران فراهم می کند تا دستورات را وارد کنند و نتایج را ببینند. ما یک کلاس برای نمایش یک کتاب ایجاد می کنیم و سپس آن را با استفاده از Datastore Repository در Cloud Datastore ذخیره می کنیم.

همچنین باید یک وابستگی ضروری دیگر به pom.xml اضافه کنیم.

با کلیک بر روی Open editor از منوی Cloud Shell، ویرایشگر کد وب را باز کنید.

6d823258c76a7452.png

پس از بارگیری ویرایشگر، فایل pom.xml را تغییر دهید تا وابستگی‌های Google Cloud Datastore Starter و Spring Shell Starter را اضافه کنید:

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 را ایجاد کنید

با استفاده از ویرایشگر، کلاس 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 ذخیره کرد و نام نوع آن را ارائه کرد (یک نوع را به عنوان جدول در پایگاه‌های داده 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 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. برنامه تعاملی 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. برنامه را اجرا کنید

برای ساخت و راه اندازی برنامه، ابتدا مطمئن شوید که 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:>

اکنون می توانید با دستوراتی که قبلا تعریف کردیم آزمایش کنید. برای مشاهده لیست دستورات، از دستور 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>

9. ببینید چه چیزی در Datastore با استفاده از رابط وب ذخیره می شود

برای مشاهده نحوه ذخیره موجودیت ها در Cloud Datastore، به کنسول GCP بروید. در صورت لزوم "کتاب" را در زمینه مهربانی وارد کنید.

5fab21a6c89f45a.png

10. پاکسازی کنید

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

shell:> remove-all-books

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

11. تبریک!

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

بیشتر بدانید

مجوز

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