Accéder aux fichiers dans Cloud Storage avec l'abstraction de ressource Spring

Spring Framework fournit une abstraction ResourceLoader permettant de lire et d'écrire facilement des fichiers à partir de différentes sources, telles que le système de fichiers, le chemin de classe ou le Web. Il vous suffit de spécifier l'URI de la ressource à l'aide du préfixe de protocole connu. Par exemple, pour accéder à un fichier sur le système de fichiers local, vous devez spécifier un URI tel que file:/data/config.yaml.

Vous allez écrire une application Spring Boot qui accédera aux fichiers stockés dans Cloud Storage en utilisant l'abstraction de ressource Spring et le préfixe de protocole gs:.

Pour ce faire, utilisez Cloud Shell et l'outil de ligne de commande gcloud du SDK Cloud.

Points abordés

  • Utiliser le déclencheur de démarrage Cloud Storage
  • Accéder aux fichiers dans Cloud Storage avec Spring
  • Utiliser les abstractions Resource WritableResource Spring

Prérequis

  • Un projet Google Cloud
  • Un navigateur tel que Google Chrome
  • Une bonne connaissance des éditeurs de texte Linux standards tels que Vim, Emacs et GNU Nano

Comment allez-vous utiliser l'atelier de programmation ?

Lecture seule Lire et terminer les exercices

Comment évalueriez-vous votre niveau d'expérience en matière de création d'applications Web HTML et CSS ?

Débutant Intermédiaire Expert

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

Débutant Intermédiaire Compétent

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$.

Cloud Shell

Vous utiliserez Cloud Shell, un environnement de ligne de commande fonctionnant dans Google Cloud.

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].

Après le lancement de Cloud Shell, vous pouvez commencer à créer des fichiers et à les transférer vers Cloud Storage.

Créez un fichier nommé my-file.txt:

$ echo "Hello World from GCS" > my-file.txt

Créez ensuite un bucket unique dans Cloud Storage et transférez le fichier à l'aide de gsutil.

$ BUCKET=spring-bucket-$USER
$ gsutil makebucket gs://$BUCKET
$ gsutil copy my-file.txt gs://$BUCKET

Accédez au navigateur de stockage dans Cloud Storage et vérifiez que le bucket et le fichier s'y trouvent.

Commencez à écrire l'application à l'aide de la ligne de commande pour générer une nouvelle application Spring Boot avec Spring Initializr:

$ curl https://start.spring.io/starter.tgz \
-d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -

Notez que l'initialiseur ajoutera automatiquement les éléments spring-boot-starter-web et spring-cloud-gcp-starter-storage à vos dépendances dans le fichier pom.xml du modèle d'application.

Accédez au répertoire de l'application de modèle:

$ cd spring-gcs

Compilez et exécutez l'application à l'aide de Maven.

$ ./mvnw spring-boot:run

L'application commencera à écouter sur le port 8080. Ouvrez un nouvel onglet Cloud Shell et exécutez curl pour accéder à l'application.

$ curl localhost:8080

Vous devriez obtenir une réponse 404, car l'application n'effectue aucune action utile pour l'instant. Revenez à l'onglet Cloud Shell précédent, où l'application est en cours d'exécution et arrêtez-la à l'aide de Control+C (Command+C sous Macintosh).

Modifiez votre application Spring Boot pour accéder au fichier my-file.txt que vous avez précédemment stocké dans Cloud Storage. L'objectif est de renvoyer simplement le contenu du fichier via HTTP.

Dans les instructions suivantes, vous allez modifier les fichiers à l'aide de Vim, mais vous pouvez également utiliser Emacs, GNU Nano ou l'éditeur de code intégré dans Cloud Shell:

$ cd ~/spring-gcs

Ajoutez un contrôleur REST GcsController à l'application.

$ vi src/main/java/com/example/demo/GcsController.java

Collez le code suivant et n'oubliez pas de corriger l'URI de la ressource avec le bucket que vous avez créé précédemment. Vous pouvez vérifier le bucket en exécutant la commande echo $BUCKET.

src/main/java/com/example/demo/GcsController.java

package com.example.demo;

import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

  @Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
  private Resource gcsFile;

  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String readGcsFile() throws IOException {
    return StreamUtils.copyToString(
        gcsFile.getInputStream(),
        Charset.defaultCharset()) + "\n";
  }
}

Créez et exécutez l'application avec Maven:

$ ./mvnw spring-boot:run

L'appli démarre en écoute sur le port 8080. Ouvrez un nouvel onglet Cloud Shell et exécutez curl pour accéder à l'application.

$ curl localhost:8080

Vous devriez à présent voir que le contenu du fichier est renvoyé par l'application. Accédez à l'onglet Cloud Shell précédent, où l'application est en cours d'exécution, et arrêtez-la à l'aide de Control+C (Command+C sur Macintosh).

Vous avez lu le contenu du fichier dans Cloud Storage et l'avez exposé via un contrôleur Spring REST. À présent, modifiez le contenu du fichier en le publiant sur le même point de terminaison HTTP.

Vous devez ajouter une méthode au fichier GcsController, qui répond à la requête HTTP POST et écrit les données dans votre fichier dans Cloud Storage. Cette fois, castez Resource de printemps à WritableResource.

Mettez à jour le GcsController avec les importations supplémentaires dont vous avez besoin.

src/main/java/com/example/demo/GcsController.java

import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;

Ajoutez la nouvelle méthode de point de terminaison au contrôleur.

src/main/java/com/example/demo/GcsController.java

@RestController
public class GcsController {
  @RequestMapping(value = "/", method = RequestMethod.POST)
  String writeGcs(@RequestBody String data) throws IOException {
    try (OutputStream os = ((WritableResource) gcsFile).getOutputStream()) {
      os.write(data.getBytes());
    }
    return "file was updated\n";
  }
  ...
}

Créez et exécutez l'application avec Maven:

$ ./mvnw spring-boot:run

L'appli démarre en écoute sur le port 8080. Ouvrez un nouvel onglet Cloud Shell et exécutez curl pour publier un message dans l'application.

$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080

Un message confirmant que le contenu du fichier a été mis à jour devrait s'afficher. Cependant, vous pouvez le vérifier en effectuant une GET.

$ curl localhost:8080

Vous devez voir le contenu mis à jour du fichier renvoyé par l'application. Revenez à l'onglet Cloud Shell précédent, où l'application est en cours d'exécution, et arrêtez-la à l'aide de Control+C (Command+C sur Macintosh).

Vous avez appris à utiliser l'abstraction de ressource Spring pour accéder facilement aux fichiers dans Cloud Storage. Vous avez écrit une application Web Spring Boot capable de lire et d'écrire des fichiers dans Cloud Storage. Vous avez également découvert Starter Boot pour Cloud Storage qui active cette fonctionnalité.

En savoir plus

Licence

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