Приложение Spring Boot с облачным хранилищем данных

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

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

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

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

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

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

Прочитайте только это Прочтите его и выполните упражнения

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

Новичок Средний Опытный

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID .

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

Прохождение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их работающими (см. раздел «Очистка» в конце этого документа).

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Активировать облачную оболочку Google

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

Затем нажмите «Запустить Cloud Shell»:

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

Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Многое, если не все, из вашей работы в этом лабораторном занятии можно выполнить просто с помощью браузера или вашего 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 Console перейдите в Меню -> Хранилище данных (в разделе Хранилище) .

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

После этого вы увидите экран «Выберите, где хранить ваши данные» . Выберите 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 вместе с pom.xml Maven, оболочкой Maven, а также точкой входа приложения.

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

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

Откройте редактор веб-кода, нажав Запустить редактор кода в меню Cloud Shell.

После загрузки редактора измените файл pom.xml , чтобы добавить стартовую зависимость Spring Boot хранилища данных Spring Data Cloud:

пом.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 со следующим содержимым:

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

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

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

Не забудьте сохранить файл!

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

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

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

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)


shell:> 

Теперь вы можете поэкспериментировать с командами, которые мы определили ранее. Чтобы увидеть список команд, используйте команду справки:

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

Чтобы увидеть, как объекты хранятся в облачном хранилище данных, перейдите в консоль GCP и перейдите в Меню -> Хранилище данных (в разделе «Хранилище») -> Объекты (выберите пространство имен «[по умолчанию]» и тип «книги», если необходимо).

Для очистки удалите все книги с помощью команды remove-all-books из оболочки приложения.

shell:> remove-all-books

Для выхода из приложения используйте команду quit, затем Ctrl+C.

В этой лабораторной работе вы создали интерактивное приложение CLI, которое может хранить и извлекать объекты из облачного хранилища данных!

Учить больше

Лицензия

Эта работа находится под лицензией Creative Commons Attribution 2.0 Generic License.