Conçue pour le scaling automatique et les hautes performances, Google Cloud Datastore est une base de données de documents NoSQL qui simplifie le développement d'applications.
Points abordés
- Utiliser Cloud Datastore pour enregistrer et récupérer des objets Java dans Spring Boot
Prérequis
Comment allez-vous utiliser ce tutoriel ?
Quel est votre niveau d'expérience avec les services Google Cloud Platform ?
Configuration de l'environnement au rythme de chacun
Si vous ne possédez pas encore de compte Google (Gmail ou Google Apps), vous devez en créer un. Connectez-vous à la console Google Cloud Platform (console.cloud.google.com) et créez un projet :
Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud (le nom ci-dessus est déjà pris ; vous devez en trouver un autre). Il sera désigné par le nom PROJECT_ID
tout au long de cet atelier de programmation.
Vous devez ensuite activer la facturation dans la console Cloud pour pouvoir utiliser les ressources Google Cloud.
Suivre cet atelier de programmation ne devrait pas vous coûter plus d'un euro. Cependant, cela peut s'avérer plus coûteux si vous décidez d'utiliser davantage de ressources ou si vous n'interrompez pas les ressources (voir la section "Effectuer un nettoyage" à la fin du présent document).
Les nouveaux utilisateurs de Google Cloud Platform peuvent bénéficier d'un essai sans frais avec 300$de crédits.
Activer Google Cloud Shell
Depuis la console GCP, cliquez sur l'icône Cloud Shell de la barre d'outils située dans l'angle supérieur droit :
Cliquez ensuite sur "Démarrer Cloud Shell" :
Le provisionnement de l'environnement et la connexion ne devraient pas prendre plus de quelques minutes :
Cette machine virtuelle contient tous les outils de développement nécessaires. Elle intègre un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier dans un simple navigateur ou sur votre Chromebook Google.
Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est déjà défini avec votre PROJECT_ID.
Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
Résultat de la commande
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Résultat de la commande
[core] project = <PROJECT_ID>
Si vous obtenez un résultat différent, exécutez cette commande :
gcloud config set project <PROJECT_ID>
Résultat de la commande
Updated property [core/project].
Dans la console GCP, accédez à Menu > Datastore (dans la section "Stockage").
Si vous n'avez jamais utilisé Datastore dans le projet actuel, l'écran Sélectionner un mode Cloud Firestore s'affiche. Sélectionnez l'option Mode Datastore.
L'écran Choisissez où stocker vos données s'affiche alors. Sélectionnez us-east1 ou tout autre emplacement régional, puis cliquez sur "Créer une base de données" :
Dans l'environnement Cloud Shell, utilisez la commande suivante pour initialiser et amorcer une nouvelle application 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 -
Cette commande crée un répertoire datastore-example/
avec un projet Maven, ainsi que le fichier pom.xml
de Maven, un wrapper Maven et un point d'entrée d'application.
Notre application fournira une CLI permettant aux utilisateurs de saisir des commandes et d'afficher les résultats. Nous allons créer une classe pour représenter un livre, puis l'enregistrer dans Cloud Datastore à l'aide du dépôt Datastore.
Nous devons également ajouter une autre dépendance nécessaire à pom.xml
.
Ouvrez l'éditeur de code Web en cliquant sur Lancer l'éditeur de code dans le menu Cloud Shell.
Une fois l'éditeur chargé, modifiez le fichier pom.xml
pour ajouter la dépendance du starter Spring Boot Spring Data Cloud Datastore :
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>
À l'aide de l'éditeur, créez la classe Book
avec le contenu suivant :
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 +
'}';
}
}
Comme vous pouvez le voir, il s'agit d'un simple POJO. La classe est annotée avec @Entity
pour indiquer qu'elle peut être stockée dans Datastore et fournir le nom du type (considérez un type comme une table dans les bases de données SQL. Pour en savoir plus, consultez la documentation). Le nom du genre est facultatif. S'il est omis, il sera généré en fonction du nom de la classe.
Notez que nous avons annoté la propriété id
avec @Id
. Cela indique que nous souhaitons que ce champ soit utilisé comme identifiant de la clé Datastore. Chaque entité Datastore a besoin d'un identifiant. Les types acceptés sont String
et Long
.
Nous remplaçons la méthode toString
pour rendre la représentation sous forme de chaîne des objets plus lisible. Cela sera utile lorsque nous les imprimerons.
N'oubliez pas d'enregistrer le fichier.
Créez la classe BookRepository
avec le contenu suivant :
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);
}
L'interface étend DatastoreRepository<Book, Long>
où Book
est la classe de domaine et Long
est le type Id
. Nous déclarons trois méthodes de requête dans notre dépôt, dont les implémentations sont générées automatiquement en arrière-plan.
Le premier est findByAuthor
. Comme vous pouvez l'imaginer, l'implémentation de cette méthode exécutera une requête qui utilisera une valeur fournie par l'utilisateur dans le filtre de condition pour l'égalité au champ "author" (auteur).
La méthode findByYearGreaterThan
exécute une requête qui filtre le champ "année" pour les valeurs supérieures à celle fournie par l'utilisateur.
findByAuthorAndYear
exécute une requête qui recherche des entités dont les champs "auteur" et "année" correspondent aux valeurs fournies par l'utilisateur.
Ouvrez la classe DemoApplication
de l'application principale et modifiez-la pour qu'elle se présente comme suit :
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();
}
}
Notez que nous avons annoté la classe avec @ShellComponent
. Cela indique à Spring que nous souhaitons utiliser cette classe comme source pour les commandes CLI. Les méthodes annotées avec @ShellMethod
seront exposées en tant que commandes CLI dans notre application.
Ici, nous utilisons les méthodes que nous avons déclarées dans l'interface BookRepository : findByAuthor
, findByYearGreaterThan
, findByAuthorAndYear
. Nous utilisons également trois méthodes intégrées : save
, findAll
et deleteAll
.
Examinons la méthode saveBook
. Nous créons un objet Book
à l'aide des valeurs fournies par l'utilisateur pour le titre, l'auteur et l'année. Comme vous pouvez le voir, nous ne fournissons pas de valeur id
. Elle sera donc automatiquement allouée et attribuée au champ "id" lors de l'enregistrement. La méthode save
accepte un objet de type Book
et l'enregistre dans Cloud Datastore. Il renvoie un objet Book
avec tous les champs renseignés, y compris le champ id
. Enfin, nous renvoyons une représentation sous forme de chaîne de cet objet.
Le reste des méthodes fonctionne de la même manière : elles acceptent les paramètres transmis aux méthodes de dépôt appropriées et renvoient des résultats sous forme de chaîne.
Pour créer et démarrer l'application, exécutez cette commande dans Cloud Shell (à partir de la racine du projet datastore-example/
où se trouve le fichier pom.xml
) :
$ mvn spring-boot:run
Une fois l'étape de compilation réussie, le logo Spring s'affiche et l'invite de ligne de commande apparaît :
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) shell:>
Vous pouvez maintenant tester les commandes que nous avons définies précédemment. Pour afficher la liste des commandes, utilisez la commande d'aide :
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>
Essayez d'exécuter les commandes suivantes :
- Créez quelques livres à l'aide de la commande
save-book
. - Exécuter une recherche à l'aide de la commande
find-all-books
- Trouver des livres d'un auteur spécifique (
find-by-author <author>
) - Trouver des livres publiés après une année spécifique (
find-by-year-after <year>
) - Trouver des livres par auteur et par année (
find-by-author-year <author> <year>
)
Pour voir comment les entités sont stockées dans Cloud Datastore, accédez à la console GCP, puis à Menu > Datastore (dans la section "Stockage") > Entités (sélectionnez l'espace de noms "[default]" et le type "books" si nécessaire).
Pour effectuer un nettoyage, supprimez tous les livres à l'aide de la commande remove-all-books
de l'application shell.
shell:> remove-all-books
Pour quitter l'application, utilisez la commande quit, puis Ctrl+C.
Dans cet atelier de programmation, vous avez créé une application CLI interactive capable de stocker et de récupérer des objets à partir de Cloud Datastore.
En savoir plus
- Cloud Datastore : https://cloud.google.com/datastore/
- Spring Shell : https://projects.spring.io/spring-shell/
- Projet Spring sur GCP : http://cloud.spring.io/spring-cloud-gcp/
- Dépôt GitHub Spring sur GCP : https://github.com/spring-cloud/spring-cloud-gcp
- Java sur Google Cloud Platform : https://cloud.google.com/java/
Licence
Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.