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

1. Panoramica

Spring Framework fornisce un'astrazione ResourceLoader per leggere e scrivere facilmente file da varie origini, come il file system, il classpath o il web. Devi solo specificare l'URI della risorsa utilizzando il prefisso del 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 Spring Boot che accederà ai file archiviati in Cloud Storage utilizzando l'astrazione Spring Resource e il prefisso di protocollo gs:.

A questo scopo, utilizzerai Cloud Shell e lo strumento a riga di comando gcloud di Cloud SDK.

Cosa imparerai a fare

  • Come utilizzare lo starter Spring Boot 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 valuti la tua esperienza di creazione di app web HTML e CSS?

Principiante Intermedio Avanzato

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

Principiante Intermedio Avanzato

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già 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 tra tutti i progetti Google Cloud (il nome sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID.

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

L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Assicurati di seguire le istruzioni riportate nella sezione "Pulizia", che ti consiglia come arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Cloud Shell

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

Attiva Cloud Shell

  1. Nella console Cloud, fai clic su Attiva Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Se non hai mai avviato Cloud Shell, viene visualizzata una schermata intermedia (sotto la piega) che ne descrive le funzionalità. In questo caso, fai clic su Continua e non comparirà più. Ecco come si presenta la schermata intermedia:

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

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Questa macchina virtuale è caricata con tutti gli strumenti per sviluppatori di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro per questo codelab, se non tutto, può essere svolto semplicemente con un browser o con 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 l'avvio di Cloud Shell, puoi iniziare a creare file e a trasferirli in Cloud Storage.

Crea un file denominato my-file.txt:

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

Poi crea un nuovo bucket univoco in Cloud Storage e trasferisci il file utilizzando gsutil.

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

Vai al browser di archiviazione 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 Initializr aggiungerà automaticamente spring-boot-starter-web e spring-cloud-gcp-starter-storage alle dipendenze nel file 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 termina l'esecuzione con Control+C (Command+C su Macintosh).

5. Leggi il file in Cloud Storage

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

Nelle istruzioni riportate di seguito, utilizzerai Vim per modificare i file, ma puoi anche utilizzare 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 seguente codice 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

Ora dovresti vedere che i contenuti del file vengono restituiti dall'app. Vai alla scheda Cloud Shell precedente in cui è in esecuzione l'app e termina l'esecuzione con Control+C (Command+C su Macintosh).

6. Scrivi nel file in Cloud Storage

Hai letto i contenuti del file in Cloud Storage e li hai esposti tramite un controller Spring REST. Ora, modifica i contenuti del file pubblicando i nuovi contenuti del file nello stesso endpoint HTTP.

Devi aggiungere un altro metodo a GcsController che risponda a HTTP POST e scriva i dati nel file in Cloud Storage. Questa volta, trasmetti la partita di primavera Resource a 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 dell'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 visualizzare un messaggio di conferma dell'aggiornamento dei contenuti del file. Tuttavia, verifica questa informazione eseguendo un GET.

$ curl localhost:8080

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

7. Complimenti!

Hai imparato a utilizzare l'astrazione Spring Resource per accedere facilmente ai file in Cloud Storage. Hai scritto un'app web Spring Boot in grado di leggere e scrivere in un file in Cloud Storage. Hai anche scoperto lo starter Spring Boot per Cloud Storage che attiva questa funzionalità.

Scopri di più

Licenza

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