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

Spring Framework proporciona una abstracción ResourceLoader para leer y escribir fácilmente archivos de varias fuentes, como el sistema de archivos, la ruta de clase o la Web. Simplemente debes especificar el URI para el recurso mediante 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 de Spring Resource y el prefijo de protocolo gs:.

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

Qué aprenderás

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

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador, como Google Chrome
  • Se recomienda estar familiarizado con editores de texto estándares de Linux, como Vim, Emacs y GNU Nano.

¿Cómo usarás el codelab?

Solo lectura Leer y completar los ejercicios

¿Cómo calificarías tu experiencia cuando compilas apps web con HTML y CSS?

Principiante Intermedio Avanzado

¿Cómo calificarías tu experiencia con los servicios de Google Cloud?

Principiante Intermedio Avanzado

Configuración del entorno a su propio ritmo

Si aún no tienes una Cuenta de Google (Gmail o Google Apps), debes crear una. Accede a Google Cloud Platform Console (console.cloud.google.com) y crea un proyecto nuevo:

Captura de pantalla de 2016-02-10 12:45:26.png

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.

A continuación, debes habilitar la facturación en Cloud Console para usar los recursos de Google Cloud.

Ejecutar este codelab debería costar solo unos pocos dólares, pero su costo podría aumentar si decides usar más recursos o si los dejas en ejecución (consulta la sección “Limpiar” al final de este documento).

Los usuarios nuevos de Google Cloud Platform son aptos para obtener una prueba gratuita de USD 300.

Cloud Shell

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

Activar Google Cloud Shell

En GCP Console, haga clic en el ícono de Cloud Shell en la barra de herramientas superior derecha:

Haga clic en "Start Cloud Shell":

El aprovisionamiento y la conexión al entorno debería llevar solo unos minutos:

Esta máquina virtual está cargada con todas las herramientas para desarrolladores que necesitará. 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 su trabajo, si no todo, se puede hacer simplemente con un navegador o su Google Chromebook.

Una vez conectado a Cloud Shell, debería ver que ya está autenticado y que el proyecto ya está configurado con su PROJECT_ID.

En Cloud Shell, ejecute el siguiente comando para confirmar que está autenticado:

gcloud auth list

Resultado del comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puede configurarlo con este comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

Después de que se inicie Cloud Shell, podrá 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 bucket único nuevo en Cloud Storage y transfiere el archivo allí mediante gsutil.

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

Navegue al navegador de almacenamiento de Cloud Storage y verifique que el bucket y el archivo estén allí.

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 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 en la app de plantillas.

Ve al directorio de la app de plantillas:

$ cd spring-gcs

Compila y ejecuta la app con Maven.

$ ./mvnw spring-boot:run

La app comenzará a escuchar en el puerto 8080. Abre una nueva pestaña 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 márcala con Control+C (Command+C en Macintosh).

Modifica tu 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:

$ 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. 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

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

  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String readGcsFile() throws IOException {
    return StreamUtils.copyToString(
        gcsFile.getInputStream(),
        Charset.defaultCharset()) + "\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 acceder a la app.

$ curl localhost:8080

Ahora, debería ver que el contenido del archivo que muestra la aplicación se dirige a la pestaña de Cloud Shell anterior en la que se está ejecutando y se puede cerrar con Control+C (Command+C en Macintosh).

Leyó el contenido del archivo en Cloud Storage y lo expuso a través de un controlador de REST de Spring. Ahora, publica el contenido del archivo nuevo en el mismo extremo HTTP para cambiar el contenido del archivo.

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 la primavera de Resource a WritableResource.

Actualiza el GcsController con las importaciones adicionales que necesitas.

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;

Agrega el nuevo método de extremo al controlador.

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

@RestController
public class GcsController {
  @RequestMapping(value = "/", method = RequestMethod.POST)
  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ía ver una confirmación de que el contenido del archivo se actualizó. Sin embargo, debes verificar mediante una GET.

$ curl localhost:8080

Debería ver el contenido actualizado del archivo que muestra la aplicación. Regrese a la pestaña anterior de Cloud Shell en la que se está ejecutando la aplicación y cierre el archivo con Control+C (Command+C en Macintosh).

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

Más información

Licencia

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