О практической работе
1. Обзор
Google Cloud Datastore — это база данных документов NoSQL, созданная для автоматического масштабирования, высокой производительности и простоты разработки приложений.
Что вы узнаете
- Как использовать облачное хранилище данных для сохранения и извлечения объектов Java в Spring Boot
Что вам понадобится
Как вы будете использовать этот учебник?
Как бы вы оценили свой опыт использования сервисов Google Cloud Platform?
2. Установка и требования
Самостоятельная настройка среды
Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:
Запомните идентификатор проекта, уникальное имя для всех проектов 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].
3. Инициализировать облачное хранилище данных
В GCP Console перейдите в Меню -> Хранилище данных (в разделе Хранилище) .
Если вы никогда не использовали Datastore в текущем проекте, вы увидите экран «Выберите режим Cloud Firestore» . Выберите опцию «Режим хранилища данных» .
После этого вы увидите экран «Выберите, где хранить ваши данные» . Выберите us-east1 или любой другой регион и нажмите «Создать базу данных»:
4. Загрузите новое Java-приложение Spring Boot
В среде 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>
5. Создайте класс книги
С помощью редактора создайте класс 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
способ сделать строковое представление объектов более читабельным; это будет полезно, когда мы их распечатаем.
Не забудьте сохранить файл!
6. Создайте интерфейс BookRepository
Создайте класс 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
выполняет запрос, который ищет объекты, в которых поля автора и года совпадают со значениями, предоставленными пользователем.
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. Запустите приложение
Чтобы собрать и запустить приложение, выполните эту команду в 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>
Попробуйте следующее:
- Создайте несколько книг, используя
save-book
команда - Выполните поиск с помощью функции «
find-all-books
. команда - Поиск книг по определенному автору (
find-by-author <author>
) - Поиск книг, опубликованных после определенного года (
find-by-year-after <year>
) - Поиск книг по конкретному автору и году (
find-by-author-year <author> <year>
)
9. Посмотрите, что хранится в Datastore, используя веб-интерфейс
Чтобы увидеть, как объекты хранятся в облачном хранилище данных, перейдите в консоль GCP и перейдите в Меню -> Хранилище данных (в разделе «Хранилище») -> Объекты (выберите пространство имен «[по умолчанию]» и тип «книги», если необходимо).
10. Очистить
Для очистки удалите все книги с помощью команды remove-all-books
из оболочки приложения.
shell:> remove-all-books
Для выхода из приложения используйте команду quit, затем Ctrl+C.
11. Поздравляем!
В этой лабораторной работе вы создали интерактивное приложение CLI, которое может хранить и извлекать объекты из облачного хранилища данных!
Учить больше
- Облачное хранилище данных: https://cloud.google.com/datastore/
- Весенняя оболочка: https://projects.spring.io/spring-shell/
- Spring в проекте GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring в репозитории GitHub GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java на облачной платформе Google: https://cloud.google.com/java/
Лицензия
Эта работа находится под лицензией Creative Commons Attribution 2.0 Generic License.