Application Spring Boot avec Cloud Datastore

Application Spring Boot avec Cloud Datastore

À propos de cet atelier de programmation

subjectDernière mise à jour : févr. 10, 2020
account_circleRédigé par une Googleuse ou un Googleur

1. Présentation

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

Ce dont vous avez besoin

  • Un projet Google Cloud Platform
  • Un navigateur, tel que Chrome ou Firefox

Comment allez-vous utiliser ce tutoriel ?

Quel est votre niveau d'expérience avec les services Google Cloud Platform ?

2. Prérequis

Configuration de l'environnement au rythme de chacun

Si vous n'avez 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:

Capture d'écran du 10/02/2016 12:45:26.png

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 Cloud Console afin d'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 offert de 300$.

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.

En principe, une fois que vous êtes connecté à Cloud Shell, vous êtes authentifié, et le projet est défini sur 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].

3. Initialiser Cloud Datastore

Dans la console GCP, accédez à Menu -> Datastore (dans la section "Storage").

Si vous n'avez jamais utilisé Datastore dans le projet actuel, l'écran "Select a Cloud Firestore mode&quot (Sélectionner un mode Cloud Firestore) s'affiche. Sélectionnez l'option Mode Datastore.

Vous verrez apparaître l'écran Choisir où stocker vos données. Sélectionnez us-east1 ou tout autre emplacement régional, puis cliquez sur "Create Database" (Créer une base de données) :

4. Démarrer une nouvelle application Java Spring Boot

Dans l'environnement Cloud Shell, exécutez la commande suivante pour initialiser et démarrer 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 opération va créer un répertoire datastore-example/ avec un nouveau projet Maven, ainsi que le pom.xml, un wrapper Maven et un point d'entrée d'application dans Maven.

Notre application fournira une CLI pour que les utilisateurs puissent saisir des commandes et voir les résultats. Nous allons créer une classe pour représenter un livre, puis l'enregistrer dans Cloud Datastore à l'aide d'un dépôt Datastore.

Nous devons également ajouter une dépendance supplémentaire à pom.xml.

Ouvrez l'éditeur de code Web en cliquant sur Launch code editor (Lancer l'éditeur de code) dans le menu de Cloud Shell.

Une fois l'éditeur chargé, modifiez le fichier pom.xml en ajoutant la dépendance Spring Data Cloud Datastore Starter:

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. Créer la classe &quot;Book&quot;

À 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 constater, 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 genre (pensez à un genre 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 voulons que ce champ soit utilisé comme identifiant de la clé Datastore. Chaque entité Datastore a besoin d'un identifiant. Types acceptés : String et Long.

Nous remplaçons la méthode toString pour améliorer la lisibilité de la représentation des objets par les chaînes. Cela peut être utile lorsque nous les imprimons.

N'oubliez pas d'enregistrer le fichier !

6. Créer l&#39;interface BookRepository

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> Book est la classe de domaine et Long est le type Id. Nous déclarez trois méthodes de requête dans notre dépôt pour lesquelles des implémentations sont générées automatiquement en arrière-plan.

Le premier est findByAuthor. Comme vous pouvez l'imaginer, la mise en œuvre de cette méthode exécutera une requête qui utilisera une valeur définie par l'utilisateur dans le filtre de condition pour bénéficier de l'égalité de l'auteur.

La méthode findByYearGreaterThan exécute une requête dont le champ "year" est supérieur à la valeur fournie par l'utilisateur.

findByAuthorAndYear exécute une requête qui recherche des entités dont les champs d'auteur et d'année correspondent aux valeurs fournies par l'utilisateur.

7. Créer l&#39;application CLI interactive

Ouvrez la classe principale DemoApplication de l'application et modifiez-la 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 comment nous avons annoté la classe avec @ShellComponent. Cela indique à Spring que nous voulons 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 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 de valeurs fournies par l'utilisateur pour le titre, l'auteur et l'année. Comme vous pouvez le constater, nous ne fournissons pas de valeur id, qui sera donc automatiquement attribuée et attribuée dans le 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 affichons une représentation de chaîne de cet objet.

Les autres méthodes fonctionnent de la même manière: elles acceptent les paramètres transmis aux méthodes du dépôt appropriées et renvoient des résultats délimités.

8. exécuter l&#39;application.

Pour créer et démarrer l'application, exécutez cette commande dans Cloud Shell (depuis la racine du projet datastore-example/, où se trouve pom.xml) :

$ mvn spring-boot:run

Une fois l'étape de compilation terminée, le logo printemps s'affiche, et l'invite de l'interface système s'affiche:

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)


shell:> 

Vous pouvez à présent tester les commandes que nous avons configurées 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 :

  1. Créez quelques livres à l'aide de la commande save-book
  2. Effectuer une recherche à l'aide de la commande find-all-books
  3. Rechercher les livres d'un auteur spécifique (find-by-author <author>)
  4. Rechercher les livres publiés après une année spécifique (find-by-year-after <year>)
  5. Rechercher des livres par auteur et par année (find-by-author-year <author> <year>)

9. Voir les éléments stockés dans Datastore à l&#39;aide de l&#39;interface Web

Pour savoir comment les entités sont stockées dans Cloud Datastore, accédez à la console GCP, puis accédez à Menu -> Datastore (dans la section Storage) -> Entities (Entités) (sélectionnez "[default]" namespace, et "books" kind, si nécessaire).

10. Effectuer un nettoyage

Pour nettoyer, supprimez tous les livres à l'aide de la commande nommée remove-all-books de l'interface système de l'application.

shell:> remove-all-books

Pour quitter l'application, appuyez sur la commande "Quitter", puis sur Ctrl+C.

11. Félicitations !

Dans cet atelier de programmation, vous avez créé une application CLI interactive permettant de stocker et de récupérer des objets à partir de Cloud Datastore.

En savoir plus

Licence

Ce document est publié sous une licence Creative Commons Attribution 2.0 Generic.