1. Обзор
Cloud Spanner — это высокодоступная, горизонтально масштабируемая и мультирегиональная СУБД. В этой лаборатории кода будет использоваться самый маленький экземпляр Cloud Spanner, но не забудьте выключить его, когда закончите!
Что вы узнаете
- Как использовать Cloud Spanner для сохранения и получения данных с помощью Spring Boot
Что вам понадобится
Как вы будете использовать этот урок?
Как бы вы оценили свой опыт использования сервисов Google Cloud Platform?
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID
.
- Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.
Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Активировать Cloud Shell
- В Cloud Console нажмите «Активировать Cloud Shell». .
Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займет всего несколько минут.
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или Chromebook.
После подключения к 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`
gcloud config list project
Вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить это с помощью этой команды:
gcloud config set project <PROJECT_ID>
Вывод команды
Updated property [core/project].
3. Инициализируйте Cloud Spanner
Включите API Cloud Spanner с помощью интерфейса командной строки gcloud:
gcloud services enable spanner.googleapis.com
Создайте экземпляр Cloud Spanner:
gcloud spanner instances create spanner-instance \ --config=regional-us-central1 \ --nodes=1 --description="A Spanner Instance"
Создайте базу данных внутри экземпляра:
gcloud spanner databases create orders \ --instance=spanner-instance
Создайте файл schema.ddl
для описания схемы данных:
cat << EOF > schema.ddl CREATE TABLE orders ( order_id STRING(36) NOT NULL, description STRING(255), creation_timestamp TIMESTAMP, ) PRIMARY KEY (order_id); CREATE TABLE order_items ( order_id STRING(36) NOT NULL, order_item_id STRING(36) NOT NULL, description STRING(255), quantity INT64, ) PRIMARY KEY (order_id, order_item_id), INTERLEAVE IN PARENT orders ON DELETE CASCADE; EOF
Примените схему к базе данных Cloud Spanner:
gcloud spanner databases ddl update orders \ --instance=spanner-instance \ --ddl="$(<schema.ddl)"
4. Загрузите новое Java-приложение Spring Boot.
В среде Cloud Shell используйте следующую команду для инициализации и загрузки нового приложения Spring Boot:
$ curl https://start.spring.io/starter.tgz \ -d packaging=jar \ -d dependencies=cloud-gcp,web,lombok \ -d baseDir=spanner-example \ -d type=maven-project \ -d bootVersion=3.2.6 | tar -xzvf - $ cd spanner-example
Это создаст новый каталог spanner-example/
с новым проектом Maven, а также pom.xml
Maven, оболочку Maven, а также точку входа приложения.
В файл pom.xml
добавьте стартер Spring Data Cloud Spanner.
пример-образца/pom.xml
<project>
...
<dependencies>
...
<!-- Add Spring Cloud GCP Spanner Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-data-spanner</artifactId>
</dependency>
...
</dependencies>
...
</project>
В application.properties настройте информацию о подключении к базе данных Spanner:
spanner-example/src/main/resources/application.properties
spring.cloud.gcp.spanner.instance-id=spanner-instance spring.cloud.gcp.spanner.database=orders
Убедитесь, что для JAVA_HOME
установлена правильная версия:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Пересоберите приложение, чтобы убедиться, что ваша конфигурация Maven верна:
./mvnw package
5. Создайте сущности
Благодаря поддержке Spring Data Spanner в Spring Cloud GCP вы можете легко создать объект Java и идиоматическое сопоставление ORM с таблицей Spanner, используя Spring Data.
Сначала создайте класс элемента заказа.
spanner-example/src/main/java/com/example/demo/OrderItem.java
package com.example.demo;
import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;
@Table(name="order_items")
@Data
class OrderItem {
@PrimaryKey(keyOrder = 1)
@Column(name="order_id")
private String orderId;
@PrimaryKey(keyOrder = 2)
@Column(name="order_item_id")
private String orderItemId;
private String description;
private Long quantity;
}
Для отношений «родитель/потомок» в Spanner вам следует использовать составной первичный ключ. В этом примере составным ключом являются order_id
и order_item_id
.
Затем создайте класс Order:
spanner-example/src/main/java/com/example/demo/Order.java
package com.example.demo;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.Interleaved;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;
@Table(name="orders")
@Data
public class Order {
@PrimaryKey
@Column(name="order_id")
private String id;
private String description;
@Column(name="creation_timestamp")
private LocalDateTime timestamp;
@Interleaved
private List<OrderItem> items;
}
Этот класс использует аннотацию @Interleaved
для создания связи «один ко многим» с элементами заказа.
6. Создайте интерфейс OrderRepository.
Создайте класс OrderRepository
со следующим содержимым:
spanner-example/src/main/java/com/example/demo/OrderRepository.java
package com.example.demo;
import com.google.cloud.spring.data.spanner.repository.SpannerRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepository extends SpannerRepository<Order, String> {
}
Интерфейс расширяет SpannerRepository<Order, String>
где Order
— это класс домена, а String
— тип первичного ключа. Spring Data автоматически предоставит доступ к CRUD через этот интерфейс, и вам не нужно будет создавать дополнительный код.
7. Создайте REST-контроллер для основных операций.
Откройте класс DemoApplication
основного приложения и измените его, чтобы он выглядел следующим образом:
спанк-example/src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import java.time.LocalDateTime;
import java.util.UUID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@RestController
class OrderController {
private final OrderRepository orderRepository;
OrderController(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
@GetMapping("/api/orders/{id}")
public Order getOrder(@PathVariable String id) {
return orderRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
}
@PostMapping("/api/orders")
public String createOrder(@RequestBody Order order) {
// Spanner currently does not auto generate IDs
// Generate UUID on new orders
order.setId(UUID.randomUUID().toString());
order.setTimestamp(LocalDateTime.now());
order.getItems().forEach(item -> {
// Assign parent ID, and also generate child ID
item.setOrderId(order.getId());
item.setOrderItemId(UUID.randomUUID().toString());
});
Order saved = orderRepository.save(order);
return saved.getId();
}
}
8. Запустите приложение.
Пересоберите и запустите приложение!
./mvnw spring-boot:run
Это должно запуститься правильно и прослушивать порт 8080.
Вы можете опубликовать запись заказа в конечной точке:
curl -H"Content-Type: application/json" -d'{"description": "My orders", "items": [{"description": "Android Phone", "quantity": "1"}]}' \ http://localhost:8080/api/orders
Он должен ответить UUID
заказа.
Затем вы можете получить заказ с помощью UUID
:
curl http://localhost:8080/api/orders/REPLACE_WITH_ORDER_UUID
Чтобы узнать, как хранятся данные Cloud Spanner, перейдите в Cloud Console и выберите Spanner → Spanner Instance → база данных заказов → таблица заказов → Данные .
9. Очистка
Чтобы очиститься, удалите экземпляр Spanner, чтобы за него больше не взимались расходы!
gcloud spanner instances delete spanner-instance -q
10. Поздравляем!
В этой лаборатории кода вы создали интерактивное приложение CLI, которое может хранить и извлекать данные из Cloud Spanner!
Узнать больше
- Облачный ключ: https://cloud.google.com/spanner/
- Spring в проекте GCP: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/
- Spring в репозитории GCP GitHub: https://github.com/spring-cloud/spring-cloud-gcp
- Java на облачной платформе Google: https://cloud.google.com/java/
Лицензия
Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.