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

1. Présentation

Le framework Spring fournit une abstraction ResourceLoader pour lire et é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 bien 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 à l'aide de l'abstraction Spring Resource et du préfixe de protocole gs:.

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

Points abordés

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

Prérequis

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

Comment allez-vous utiliser l'atelier de programmation ?

<ph type="x-smartling-placeholder"></ph> Lecture seule Lire et effectuer les exercices

Comment évalueriez-vous votre 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 ?

<ph type="x-smartling-placeholder"></ph> Débutant Intermédiaire Expert
.

2. Préparation

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à Cloud Console, puis créez un projet ou réutilisez un projet existant. (Si vous n'avez pas encore de compte Gmail ou G Suite, vous devez en créer un.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire gratuite. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Cloud Shell

Vous allez vous servir de Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud.

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Si vous n'avez encore jamais démarré Cloud Shell, un écran intermédiaire s'affiche en dessous de la ligne de séparation pour décrire de quoi il s'agit. Si tel est le cas, cliquez sur Continuer (cet écran ne s'affiche qu'une seule fois). Voici à quoi il ressemble :

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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

Une fois connecté à Cloud Shell, vous êtes en principe authentifié et le projet est défini avec votre ID de projet.

  1. 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
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
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. Créer un fichier dans Cloud Storage

Une fois Cloud Shell lancé, 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-y 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, puis vérifiez que le bucket et le fichier sont présents.

4. Initialiser une application Spring Boot

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

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

Notez qu'Initializr ajoute automatiquement spring-boot-starter-web et spring-cloud-gcp-starter-storage à vos dépendances dans le pom.xml du modèle d'application.

Accédez au répertoire du modèle d'application:

$ cd spring-gcs

Assurez-vous que JAVA_HOME est défini sur la bonne version du JDK:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Créez 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'a encore rien d'utile.

Revenez à l'onglet Cloud Shell précédent où l'application s'exécute et fermez-la avec Control+C (Command+C sous Macintosh).

5. Lire le fichier dans Cloud Storage

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

Dans les instructions suivantes, vous utiliserez Vim pour modifier les fichiers, mais vous pouvez également vous servir d'Emacs, de GNU Nano ou de l'éditeur de code intégré à Cloud Shell:

cloud-editor.png

$ 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 remplacer l'URI de la ressource par 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.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

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

  @GetMapping("/")
  public String readGcsFile() throws IOException {
    return StreamUtils.copyToString(
        gcsFile.getInputStream(),
        Charset.defaultCharset());
  }
}

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

$ ./mvnw spring-boot:run

L'application commence à é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 maintenant constater que le contenu du fichier renvoyé par l'application doit s'afficher. Accédez à l'onglet Cloud Shell précédent où l'application s'exécute et fermez-la avec Control+C (Command+C sur Macintosh).

6. Écrire dans le fichier stocké dans Cloud Storage

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

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

Mettez à jour 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;
import org.springframework.web.bind.annotation.PostMapping;

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

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

@RestController
public class GcsController {

  @PostMapping("/")
  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'application commence à écouter 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 de confirmation indiquant que le contenu du fichier a été mis à jour doit s'afficher. Cependant, vérifiez cela en exécutant une commande GET.

$ curl localhost:8080

Vous devriez voir le contenu mis à jour du fichier renvoyé par l'application. Revenez à l'onglet Cloud Shell précédent où l'application s'exécute et fermez-la avec Control+C (Command+C sous Macintosh).

7. Félicitations !

Vous avez appris à utiliser l'abstraction Spring Resource pour accéder facilement aux fichiers dans Cloud Storage. Vous avez écrit une application Web Spring Boot capable de lire et d'écrire dans un fichier dans Cloud Storage. Vous avez également découvert le déclencheur Spring 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.