Acerca de este codelab
1. Descripción general
Google Cloud Datastore es una base de datos de documentos NoSQL compilada para proporcionar ajuste de escala automático, alto rendimiento y facilidad de desarrollo de aplicaciones.
Qué aprenderás
- Cómo usar Cloud Datastore para guardar y recuperar objetos Java en Spring Boot
Requisitos
¿Cómo usarás este instructivo?
¿Cómo calificarías tu experiencia con los servicios de Google Cloud Platform?
2. Configuración y requisitos
Configuración del entorno a su propio ritmo
Si aún no tienes una Cuenta de Google (Gmail o Google Apps), debes crear una. Accede a Google Cloud Platform Console (console.cloud.google.com) y crea un proyecto nuevo:
Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID
.
A continuación, debes habilitar la facturación en Cloud Console para usar los recursos de Google Cloud.
Ejecutar este codelab debería costar solo unos pocos dólares, pero su costo podría aumentar si decides usar más recursos o si los dejas en ejecución (consulta la sección “Limpiar” al final de este documento).
Los usuarios nuevos de Google Cloud Platform son aptos para obtener una prueba gratuita de USD 300.
Activar Google Cloud Shell
En GCP Console, haga clic en el ícono de Cloud Shell en la barra de herramientas superior derecha:
Haga clic en "Start Cloud Shell":
El aprovisionamiento y la conexión al entorno debería llevar solo unos minutos:
Esta máquina virtual está cargada con todas las herramientas para desarrolladores que necesitará. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de su trabajo, si no todo, se puede hacer simplemente con un navegador o su Google Chromebook.
Una vez conectado a Cloud Shell, debería ver que ya está autenticado y que el proyecto ya está configurado con su PROJECT_ID.
En Cloud Shell, ejecute el siguiente comando para confirmar que está autenticado:
gcloud auth list
Resultado del comando
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Resultado del comando
[core] project = <PROJECT_ID>
De lo contrario, puede configurarlo con este comando:
gcloud config set project <PROJECT_ID>
Resultado del comando
Updated property [core/project].
3. Inicializar Cloud Datastore
En GCP Console, navegue a Menú - Datastore (en la sección Storage).
Si nunca utilizaste Datastore en el proyecto actual, verás la pantalla "Select a Cloud Firestore mode. Selecciona la opción Datastore Datastore.
Después de eso, verás la pantalla "Choosedónde almacenar los datos. Selecciona us-east1 o cualquier otra ubicación regional y haz clic en &Crear base de datos:
4. Inicia una nueva aplicación de Spring Boot Java
Desde el entorno de Cloud Shell, usa el siguiente comando para inicializar y ejecutar un nuevo inicio de una aplicación de 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 -
Se creará un directorio datastore-example/
nuevo con un proyecto de Maven nuevo, junto con pom.xml
de Maven, un wrapper de Maven y un punto de entrada de la aplicación.
Nuestra aplicación proporcionará una CLI para que los usuarios ingresen comandos y vean los resultados. Crearemos una clase para representar un libro y, luego, la guardarámos en Cloud Datastore con el repositorio Datastore.
También debemos agregar una dependencia más necesaria a pom.xml
.
En el menú de Cloud Shell, haga clic en Iniciar editor de código para abrir Web Editor.
Después de que se cargue el editor, modifica el archivo pom.xml
para agregar la dependencia del activador de Spring Boot Spring de Spring Data:
pom.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. Crea la clase Book
Con el editor, crea la clase Book
con el siguiente contenido:
datastore-example/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 +
'}';
}
}
Como puedes ver, este es un POJO simple. La clase está anotada con @Entity
para indicar que se puede almacenar en Datastore y proporciona el nombre de la categoría (piensa como una tabla como bases de datos SQL, consulta la documentación para obtener más detalles). El nombre de tipo es opcional. Si se omite, el nombre de tipo se generará según el nombre de clase.
Ten en cuenta que anotamos la propiedad id
con @Id
. Esto indica que queremos que este campo se use como parte del identificador de la clave de Datastore. Cada entidad de Datastore necesita un identificador. Los tipos admitidos son String
y Long
.
Anulamos el método toString
para que la representación de strings de los objetos sea más legible; esto será útil cuando los imprimamos.
No te olvides de guardar el archivo.
6. Crea la interfaz de BookRepository
Crea la clase BookRepository
con el siguiente contenido:
datastore-example/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);
}
La interfaz extiende DatastoreRepository<Book, Long>
donde Book
es la clase del dominio y Long
es el tipo Id
. En nuestro repositorio, declaramos tres métodos de consulta para los que las implementaciones se generan automáticamente en segundo plano.
El primero es findByAuthor
. Como podrás suponer, la implementación de este método ejecutará una consulta que usará un valor proporcionado por el usuario en el filtro de condición para la igualdad en el campo de autor.
El método findByYearGreaterThan
ejecuta una consulta que filtra por un campo de año superior al valor proporcionado por el usuario.
findByAuthorAndYear
ejecuta una consulta que busca entidades en las que los campos de autor y año coinciden con los valores proporcionados por el usuario.
7. Crea la aplicación interactiva de CLI
Abre la clase DemoApplication
de la aplicación principal y modifícala para que se vea de la siguiente manera:
datastore-example/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();
}
}
Observa cómo anotamos la clase con @ShellComponent
. Eso le indica a Spring que queremos usar esta clase como fuente para los comandos de la CLI. Los métodos con anotaciones @ShellMethod
se mostrarán como comandos de la CLI en nuestra aplicación.
Aquí, usamos los métodos que declaramos en la interfaz de BookRepository: findByAuthor
, findByYearGreaterThan
, findByAuthorAndYear
. También usamos tres métodos integrados: save
, findAll
y deleteAll
.
Veamos el método saveBook
. Creamos un objeto Book
con valores proporcionados por el usuario para el título, el autor y el año. Como puedes ver, no proporcionamos un valor id
, por lo que se asignará automáticamente y se asignará al campo ID cuando se guarde. El método save
acepta un objeto de tipo Book
y lo guarda en Cloud Datastore. Muestra un objeto Book
con todos los campos propagados, incluido el campo id
. Al final, se muestra una representación de string de este objeto.
El resto de los métodos funcionan de manera similar: aceptan que se pasen parámetros a los métodos de repositorio adecuados y muestren resultados en string.
8. Ejecute la aplicación
Para compilar e iniciar la aplicación, ejecute este comando en Cloud Shell (desde la raíz del proyecto datastore-example/
, en el que se encuentra pom.xml
) :
$ mvn spring-boot:run
Después de una etapa de compilación correcta, aparecerá el logotipo de resorte y aparecerá el mensaje de shell:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) shell:>
Ahora puede experimentar con los comandos que definimos anteriormente. Para ver la lista de comandos, use el siguiente comando de ayuda:
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>
Prueba lo siguiente:
- Crea algunos libros con el comando
save-book
- Ejecutar una búsqueda con el comando
find-all-books
- Buscar libros por autor específico (
find-by-author <author>
) - Buscar libros publicados después de un año específico (
find-by-year-after <year>
) - Buscar libros por autor y año específicos (
find-by-author-year <author> <year>
)
9. Vea lo que se almacena en Datastore mediante una interfaz web
Para ver cómo se almacenan las entidades en Cloud Datastore, ve a GCP Console y navega a Menú - Datastore (en la sección Storage) - Entidades (selecciona tipos, espacios de nombres y tipos de libros) si es necesario.
10. Realiza una limpieza
Para limpiar el sistema, quita todos los libros con el comando acertado remove-all-books
de la shell de la aplicación.
shell:> remove-all-books
Para salir de la aplicación, use el comando quit y luego Ctrl+C.
11. ¡Felicitaciones!
En este codelab, creaste una aplicación interactiva de CLI que puede almacenar y recuperar objetos de Cloud Datastore.
Más información
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Proyecto de Spring en GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repositorio de GitHub de Spring en GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java en Google Cloud Platform: https://cloud.google.com/java/
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.