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

1. Descripción general

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

Escribirás una app de Spring Boot que accederá a los archivos almacenados en Cloud Storage con la abstracción Spring Resource y el prefijo de 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 iniciador de Spring Boot de Cloud Storage
  • Cómo acceder a los 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 leer Leer y completar 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 que no se te facture 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, puedes 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 spring-boot-starter-web y spring-cloud-gcp-starter-storage a tus dependencias en pom.xml de la app de plantilla.

Cambia al directorio de la app de plantilla:

$ cd spring-gcs

Asegúrate de que JAVA_HOME esté configurado en la versión correcta del 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 ejecuta la app y finalízala con Control+C (Command+C en Macintosh).

5. Lee el archivo en Cloud Storage

Modifica tu app de Spring Boot para acceder a my-file.txt, el archivo que almacenaste anteriormente en Cloud Storage. Tu objetivo es simplemente devolver 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 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. Para verificar el bucket, ejecuta el 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 el contenido del archivo que devolvió la app. Ve a la pestaña anterior de Cloud Shell en la que se está ejecutando la app y finalízala con Control+C (Command+C en Macintosh).

6. Escribe en el archivo de Cloud Storage

Leíste 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 del archivo nuevo en el mismo extremo HTTP.

Debes agregar otro método a GcsController que responda a HTTP POST y escriba los datos en tu archivo de Cloud Storage. Esta vez, convierte el Resource de Spring en 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 de 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 nueva pestaña 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, verifica esto con un GET.

$ curl localhost:8080

Deberías ver el contenido actualizado del archivo que devolvió la app. Vuelve a la pestaña anterior de Cloud Shell en la que se ejecuta la app y finalízala con Control+C (Command+C en Macintosh).

7. ¡Felicitaciones!

Aprendiste a usar la abstracción 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 de Cloud Storage. También aprendiste sobre el iniciador de 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.