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