Accede a archivos en Cloud Storage con la abstracción Spring Resource

1. Descripción general

Spring Framework proporciona una abstracción ResourceLoader para leer y escribir fácilmente archivos desde varias fuentes, como el sistema de archivos, la ruta de clase o la Web. Solo debes especificar el URI para el recurso usando el prefijo de protocolo conocido. Por ejemplo, para acceder a un archivo en el sistema de archivos local, debes especificar un URI como file:/data/config.yaml.

Escribirás una app de Spring Boot que accederá a los archivos almacenados en Cloud Storage mediante la abstracción Spring Resource y el prefijo del protocolo gs:.

Para ello, usarás Cloud Shell y la herramienta de línea de comandos de gcloud del SDK de Cloud.

Qué aprenderás

  • Cómo usar el activador Spring Boot de Cloud Storage
  • Cómo acceder a archivos en Cloud Storage con Spring
  • Cómo usar las abstracciones Resource y WritableResource de Spring

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador, como Google Chrome
  • Conocimientos de editores de texto estándares de Linux, como Vim, Emacs y GNU Nano

¿Cómo usarás el codelab?

Solo lectura Lee y completa los ejercicios .

¿Cómo calificarías tu experiencia con la compilación de aplicaciones web con HTML y CSS?

Principiante Intermedio Avanzado

¿Cómo calificarías tu experiencia en el uso de los servicios de Google Cloud?

Principiante Intermedio Avanzado .
.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. (Si todavía no tienes una cuenta de Gmail o de G Suite, debes crear una).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza” en la que se aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Cloud Shell

Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud ShellH7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Si nunca ha iniciado Cloud Shell, aparecerá una pantalla intermedia (debajo de la mitad inferior de la página) que describe qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verlo). Así es como se ve la pantalla única:

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

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer simplemente con un navegador o tu Chromebook.

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu ID del proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que está autenticado:
gcloud auth list

Resultado del 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

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Crea un archivo en Cloud Storage

Después de que se inicie Cloud Shell, podrás comenzar a crear archivos y transferirlos a Cloud Storage.

Crea un archivo llamado my-file.txt:

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

Luego, crea un nuevo bucket único en Cloud Storage y transfiere el archivo allí con gsutil.

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

Navega al navegador de almacenamiento en Cloud Storage y verifica que el bucket y el archivo estén allí.

4. Inicializa una app de Spring Boot

Comienza a escribir la app con la línea de comandos para generar una nueva app de 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 -

Ten en cuenta que Initializr agregará automáticamente el spring-boot-starter-web y la spring-cloud-gcp-starter-storage a tus dependencias en el pom.xml de la app de plantillas.

Cambia al directorio de la app de plantilla:

$ cd spring-gcs

Asegúrate de que JAVA_HOME esté configurado en la versión correcta de JDK:

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

Compila y ejecuta la app con Maven.

$ ./mvnw spring-boot:run

La app comenzará a escuchar en el puerto 8080. Abre una pestaña nueva de Cloud Shell y ejecuta curl para acceder a la app.

$ curl localhost:8080

Deberías obtener una respuesta 404 porque la app aún no hace nada útil.

Regresa a la pestaña anterior de Cloud Shell en la que se está ejecutando la app y ciérrala con Control+C (Command+C en Macintosh).

5. Lee el archivo en Cloud Storage

Modifica la app de Spring Boot para acceder a my-file.txt, el archivo que almacenaste antes en Cloud Storage. Tu objetivo es simplemente mostrar el contenido del archivo a través de HTTP.

En las siguientes instrucciones, usarás Vim para editar los archivos, pero también puedes usar Emacs, GNU Nano o el editor de código integrado en Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

Agrega un controlador de REST GcsController a la app.

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

Pega el siguiente código y no olvides corregir el URI del recurso con el bucket que creaste anteriormente. Puedes verificar el bucket mediante la ejecución del 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());
  }
}

Compila y ejecuta la app con Maven:

$ ./mvnw spring-boot:run

La app comienza a escuchar en el puerto 8080. Abre una pestaña nueva de Cloud Shell y ejecuta curl para acceder a la app.

$ curl localhost:8080

Ahora, deberías ver que el contenido del archivo mostró la app. Ve a la pestaña anterior de Cloud Shell en la que se está ejecutando la app y ciérrala con Control+C (Command+C en Macintosh).

6. Escribir en el archivo en Cloud Storage

Leerás el contenido del archivo en Cloud Storage y lo expusiste a través de un controlador REST de Spring. Ahora, cambia el contenido del archivo publicando el contenido nuevo del archivo en el mismo extremo HTTP.

Debes agregar otro método a GcsController que responda a HTTP POST y escriba los datos en tu archivo en Cloud Storage. Esta vez, transmite el Resource de primavera a WritableResource.

Actualiza GcsController con las importaciones adicionales que necesites.

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;

Agrega el nuevo método del extremo al controlador.

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

Compila y ejecuta la app con Maven:

$ ./mvnw spring-boot:run

La app comienza a escuchar en el puerto 8080. Abre una pestaña nueva de Cloud Shell y ejecuta curl para publicar un mensaje en la app.

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

Deberías ver una confirmación de que se actualizó el contenido del archivo. Sin embargo, haz un GET para verificarlo.

$ curl localhost:8080

Deberías ver el contenido actualizado del archivo que muestra la app. Regresa a la pestaña anterior de Cloud Shell en la que se está ejecutando la app y ciérrala con Control+C (Command+C en Macintosh).

7. ¡Felicitaciones!

Aprendiste a usar la abstracción de Spring Resource para acceder fácilmente a los archivos en Cloud Storage. Escribiste una app web de Spring Boot que puede leer y escribir en un archivo en Cloud Storage. También aprendiste sobre el activador Spring Boot para Cloud Storage que habilita esa funcionalidad.

Más información

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.