Accedere ai file in Cloud Storage con l'astrazione Resource di Spring

1. Panoramica

Il framework Spring fornisce un'astrazione ResourceLoader per leggere e scrivere facilmente file da varie origini, come file system, classpath o web. Devi semplicemente specificare l'URI della risorsa utilizzando il prefisso di protocollo noto. Ad esempio, per accedere a un file sul file system locale, devi specificare un URI come file:/data/config.yaml.

Scriverai un'app di avvio Spring che accederà ai file archiviati in Cloud Storage utilizzando l'astrazione Resource di Spring e il prefisso di protocollo gs:.

Per farlo, utilizzerai Cloud Shell e lo strumento a riga di comando gcloud di Cloud SDK.

Cosa imparerai a fare

  • Come utilizzare il comando iniziale di avvio a molla di Cloud Storage
  • Come accedere ai file in Cloud Storage con Spring
  • Come utilizzare le astrazioni Resource e WritableResource di Spring

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, ad esempio Google Chrome.
  • Familiarità con gli editor di testo standard di Linux, ad esempio Vim, Emacs e GNU Nano.

Come utilizzerai il codelab?

Sola lettura Leggi e completa gli esercizi

Come valuteresti la tua esperienza con lo sviluppo di app web HTML e CSS?

Principiante Livello intermedio Eccellente

Come giudichi la tua esperienza di utilizzo dei servizi Google Cloud?

Principiante Livello intermedio Eccellente

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o G Suite, devi crearne uno.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome precedente è già stato utilizzato e non funzionerà correttamente). Verrà indicato più avanti in questo codelab come PROJECT_ID.

  1. Successivamente, dovrai abilitare la fatturazione in Cloud Console per utilizzare le risorse Google Cloud.

Eseguire questo codelab non dovrebbe costare molto. Assicurati di seguire le istruzioni nella sezione "Pulizia" in cui viene spiegato come arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Cloud Shell

Utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione su Google Cloud.

Attiva Cloud Shell

  1. Dalla console Cloud, fai clic su Attiva Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LXZ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Se non hai mai avviato Cloud Shell, verrà visualizzata una schermata intermedia (below the fold) in cui viene descritto di cosa si tratta. In tal caso, fai clic su Continua (e non la vedrai più). Ecco come appare quella singola schermata:

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

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto semplicemente con un browser o Chromebook.

Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Crea un file in Cloud Storage

Dopo il lancio di Cloud Shell, puoi iniziare a creare file e trasferirli in Cloud Storage.

Crea un file denominato my-file.txt:

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

Quindi crea un nuovo bucket univoco in Cloud Storage e trasferisci lì il file utilizzando gsutil.

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

Vai al browser Storage in Cloud Storage e verifica che il bucket e il file siano presenti.

4. Inizializzare un'app Spring Boot

Inizia a scrivere l'app utilizzando la riga di comando per generare una nuova app Spring Boot con 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 -

Tieni presente che l'inizializzazione aggiungerà automaticamente spring-boot-starter-web e spring-cloud-gcp-starter-storage alle tue dipendenze in pom.xml dell'app modello.

Passa alla directory dell'app modello:

$ cd spring-gcs

Assicurati che JAVA_HOME sia impostato sulla versione JDK corretta:

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

Crea ed esegui l'app utilizzando Maven.

$ ./mvnw spring-boot:run

L'app inizierà ad ascoltare sulla porta 8080. Apri una nuova scheda di Cloud Shell ed esegui curl per accedere all'app.

$ curl localhost:8080

Dovresti ricevere una risposta 404 perché l'app non fa ancora nulla di utile.

Torna alla scheda Cloud Shell precedente in cui è in esecuzione l'app e terminala con Control+C (Command+C su Macintosh).

5. Leggi il file in Cloud Storage

Modifica l'app Spring Boot in modo che acceda a my-file.txt, il file che hai archiviato in precedenza in Cloud Storage. L'obiettivo è semplicemente restituire i contenuti del file tramite HTTP.

Nelle istruzioni seguenti utilizzerai Vim per modificare i file, ma puoi anche usare Emacs, GNU Nano o l'editor di codice integrato in Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

Aggiungi un controller REST GcsController all'app.

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

Incolla il codice seguente e non dimenticare di correggere l'URI della risorsa con il bucket che hai creato in precedenza. Puoi controllare il bucket eseguendo il comando 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());
  }
}

Crea ed esegui l'app con Maven:

$ ./mvnw spring-boot:run

L'app inizia ad ascoltare sulla porta 8080. Apri una nuova scheda di Cloud Shell ed esegui curl per accedere all'app.

$ curl localhost:8080

A questo punto dovresti vedere che i contenuti del file sono stati restituiti dall'app. Vai alla scheda Cloud Shell precedente in cui è in esecuzione l'app e terminala con Control+C (Command+C su Macintosh).

6. Scrivi nel file in Cloud Storage

Hai letto i contenuti del file in Cloud Storage e lo hai esposto tramite un controller REST Spring. Ora modifica i contenuti del file pubblicando i contenuti del nuovo file sullo stesso endpoint HTTP.

Devi aggiungere a GcsController un altro metodo che risponda a HTTP POST e scriva i dati nel tuo file in Cloud Storage. Questa volta, trasmetti l'Resource di primavera in WritableResource.

Aggiorna GcsController con le importazioni aggiuntive di cui hai bisogno.

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;

Aggiungi il nuovo metodo endpoint al controller.

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";
  }
  ...
}

Crea ed esegui l'app con Maven:

$ ./mvnw spring-boot:run

L'app inizia ad ascoltare sulla porta 8080. Apri una nuova scheda di Cloud Shell ed esegui curl per pubblicare un messaggio nell'app.

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

Dovresti vedere una conferma dell'aggiornamento dei contenuti del file. Tuttavia, verificalo eseguendo un GET.

$ curl localhost:8080

Dovresti vedere i contenuti aggiornati del file restituito dall'app. Torna alla scheda Cloud Shell precedente in cui è in esecuzione l'app e terminala con Control+C (Command+C su Macintosh).

7. Complimenti!

Hai imparato a usare l'astrazione Resource di Spring per accedere facilmente ai file in Cloud Storage. Hai scritto un'app web Spring Boot in grado di leggere e scrivere su un file in Cloud Storage. Hai anche imparato a conoscere il comando iniziale Spring Boot per Cloud Storage che abilita questa funzionalità.

Scopri di più

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.