Приложение Spring Boot с Cloud Datastore

Приложение Spring Boot с Cloud Datastore

О практической работе

subjectПоследнее обновление: апр. 17, 2023
account_circleАвтор: сотрудник Google

1. Обзор

Google Cloud Datastore — это база данных документов NoSQL, созданная для автоматического масштабирования, высокой производительности и простоты разработки приложений.

Что вы узнаете

  • Как использовать Cloud Datastore для сохранения и получения объектов Java в Spring Boot

Что вам понадобится

  • Проект облачной платформы Google
  • Браузер, например Chrome или Firefox.

Как вы будете использовать этот урок?

Как бы вы оценили свой опыт использования сервисов Google Cloud Platform?

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 Console, чтобы использовать облачные ресурсы/API. Прохождение этой кодовой лаборатории не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». 853e55310c205094.png .

55efc1aaa7a4d3ad.png

Если вы запускаете Cloud Shell впервые, вы увидите промежуточный экран с описанием того, что это такое. Если вам был представлен промежуточный экран, нажмите «Продолжить» .

9c92662c6a846a5c.png

Подготовка и подключение к Cloud Shell займет всего несколько минут.

9f0e51b578fecce5.png

Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью браузера.

После подключения к 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].

3. Инициализировать облачное хранилище данных

В консоли GCP перейдите в Меню -> Datastore (в разделе «Хранилище») или нажмите здесь .

Если вы никогда не использовали Datastore в текущем проекте, вы увидите экран «Выберите режим Cloud Firestore» . Выберите опцию «Режим хранилища данных» .

f938295c7ff297f4.png

После этого вы увидите экран «Выберите, где хранить ваши данные» . Выберите us-east1 или любой другой регион и нажмите «Создать базу данных»:

916ac84fec10fae7.png

4. Загрузите новое Java-приложение 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 и точку входа приложения.

Наше приложение предоставит пользователям интерфейс командной строки для ввода команд и просмотра результатов. Мы создадим класс, представляющий книгу, а затем сохраним его в Cloud Datastore с помощью репозитория Datastore.

Нам также нужно добавить еще одну необходимую зависимость в pom.xml .

Откройте редактор веб-кода, нажав «Открыть редактор» в меню 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 со следующим содержимым:

пример хранилища данных/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 , указывающей на то, что его можно хранить в хранилище данных, и предоставляет имя типа (представьте себе вид как таблицу в базах данных SQL, более подробную информацию см. в документации ). Имя вида не является обязательным — если оно опущено, имя вида будет сгенерировано на основе имени класса.

Обратите внимание, что мы аннотировали свойство id с помощью @Id . Это означает, что мы хотим, чтобы это поле использовалось как часть идентификатора ключа хранилища данных. Каждому объекту хранилища данных необходим идентификатор. Поддерживаемые типы: String и Long .

Мы переопределяем метод toString , чтобы сделать строковое представление объектов более читабельным; это нам пригодится, когда мы их распечатаем.

6. Создайте интерфейс BookRepository.

Создайте класс BookRepository со следующим содержимым:

пример хранилища данных/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 основного приложения и измените его, чтобы он выглядел следующим образом:

пример хранилища данных/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 и появится приглашение оболочки:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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 License.