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

۱. مرور کلی

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

آنچه یاد خواهید گرفت

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

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

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

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

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

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

۲. تنظیمات و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

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

  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].

۳. مقداردهی اولیه‌ی انبار داده‌ی ابری

در کنسول GCP ، به منو -> فروشگاه داده (در بخش ذخیره‌سازی) بروید یا اینجا کلیک کنید .

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

f938295c7ff297f4.png

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

916ac84fec10fae7.png

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

از محیط 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، به همراه pom.xml مربوط به Maven، یک بسته‌بندی Maven و یک نقطه ورود برنامه ایجاد می‌کند.

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

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

۶. ایجاد رابط 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 است. همانطور که می‌توانید حدس بزنید، پیاده‌سازی این متد، یک کوئری را اجرا می‌کند که از یک مقدار ارائه شده توسط کاربر در فیلتر شرط برای برابری با فیلد author استفاده می‌کند.

متد findByYearGreaterThan یک کوئری اجرا می‌کند که فیلد سال بزرگتر از مقدار ارائه شده توسط کاربر را فیلتر می‌کند.

findByAuthorAndYear یک کوئری اجرا می‌کند که به دنبال موجودیت‌هایی می‌گردد که فیلدهای author و year آنها با مقادیر ارائه شده توسط کاربر مطابقت داشته باشد.

۷. ایجاد برنامه تعاملی 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 ، برمی‌گرداند. در نهایت، ما یک نمایش رشته‌ای از این شیء را برمی‌گردانیم.

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

۸. برنامه را اجرا کنید

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

۹. مشاهده‌ی اطلاعات ذخیره‌شده در Datastore با استفاده از رابط وب

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

5fab21a6c89f45a.png

۱۰. تمیز کردن

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

shell:> remove-all-books

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

۱۱. تبریک می‌گویم!

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

اطلاعات بیشتر

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.