Acessar arquivos no Cloud Storage com a abstração Spring Resource

Acessar arquivos no Cloud Storage com a abstração Spring Resource

Sobre este codelab

subjectÚltimo fev. 10, 2020 atualizado
account_circleEscrito por meltsufin

1. Visão geral

O Spring Framework fornece uma abstração ResourceLoader para ler e gravar arquivos com facilidade de várias fontes, como o sistema de arquivos, o caminho de classe ou a Web. Basta especificar o URI para o recurso usando um prefixo de protocolo conhecido. Por exemplo, para acessar um arquivo no sistema de arquivos local, especifique um URI como file:/data/config.yaml.

Você criará um app Spring Boot que acessará os arquivos armazenados no Cloud Storage usando a abstração Spring Resource e o prefixo do protocolo gs:.

Para fazer isso, você usará o Cloud Shell e a ferramenta de linha de comando gcloud do SDK do Cloud.

O que você aprenderá

  • Como usar o inicializador do Spring Boot do Cloud Storage
  • Como acessar arquivos no Cloud Storage com o Spring
  • Como usar as abstrações Resource e WritableResource do Spring

O que é necessário

  • um projeto do Google Cloud;
  • Um navegador, como o Google Chrome
  • Conhecer os editores de texto padrão do Linux (como Vim, Emacs e GNU Nano)

Como você usará o codelab?

Como você classificaria sua experiência com a criação de apps da Web HTML e CSS?

Como você classificaria sua experiência de uso dos serviços do Google Cloud?

2. Configuração e requisitos

Configuração de ambiente personalizada

Se você ainda não tem uma Conta do Google (Gmail ou Google Apps), crie uma. Faça login no Console do Google Cloud Platform (console.cloud.google.com) e crie um novo projeto:

Captura de tela de 10/02/2016 12:45:26.png

Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID.

Em seguida, você precisará ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.

A execução por meio deste codelab terá um custo baixo, mas poderá ser mais se você decidir usar mais recursos ou se deixá-los em execução. Consulte a seção "limpeza" no final deste documento.

Novos usuários do Google Cloud Platform estão qualificados para um teste sem custo financeiro de US$ 300.

Cloud Shell

Você usará o Cloud Shell, um ambiente de linha de comando executado no Google Cloud.

Ativa o Google Cloud Shell

No Console do GCP, clique no ícone do Cloud Shell na barra de ferramentas localizada no canto superior direito:

Em seguida, clique em "Start Cloud Shell":

O provisionamento e a conexão ao ambiente levarão apenas alguns instantes para serem concluídos:

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Praticamente todo o seu trabalho neste laboratório pode ser feito em um navegador ou no seu Google Chromebook.

Depois que você se conectar ao Cloud Shell, sua autenticação já terá sido feita, e o projeto estará definido com seu PROJECT_ID.

Execute o seguinte comando no Cloud Shell para confirmar se a conta está autenticada:

gcloud auth list

Resposta ao comando

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

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, faça a configuração usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

3. Criar um arquivo no Cloud Storage

Depois que o Cloud Shell for iniciado, você poderá começar a criar arquivos e transferi-los para o Cloud Storage.

Crie um arquivo chamado my-file.txt:

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

Em seguida, crie um novo bucket exclusivo no Cloud Storage e transfira o arquivo para ele usando gsutil.

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

Navegue até o navegador de armazenamento no Cloud Storage e verifique se o bucket e o arquivo estão lá.

4. Inicializar um app Spring Boot

Comece a programar o app usando a linha de comando para gerar um novo Spring Boot com o Spring Initializr:

$ curl https://start.spring.io/starter.tgz \
-d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -

O Initializr adicionará automaticamente spring-boot-starter-web e spring-cloud-gcp-starter-storage às dependências no pom.xml do app de modelo.

Mude para o diretório do app de modelo:

$ cd spring-gcs

Crie e execute o app usando o Maven.

$ ./mvnw spring-boot:run

O app começará a detectar na porta 8080. Abra uma nova guia do Cloud Shell e execute curl para acessar o app.

$ curl localhost:8080

Você receberá uma resposta 404 porque o app ainda não faz nada de útil. Volte para a guia anterior do Cloud Shell em que o app está em execução e elimine-a com Control+C (Command+C no Macintosh).

5. Ler o arquivo no Cloud Storage

Modifique seu app de inicialização do Spring para acessar my-file.txt, o arquivo armazenado anteriormente no Cloud Storage. Seu objetivo é simplesmente retornar o conteúdo do arquivo via HTTP.

Nas instruções a seguir, você usará o Vim para editar os arquivos, mas também pode usar o Emacs, GNU Nano ou o editor de código integrado no Cloud Shell:

$ cd ~/spring-gcs

Adicione um controlador REST GcsController ao app.

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

Cole o código a seguir. Não se esqueça de corrigir o URI do recurso com o bucket criado anteriormente. Verifique o bucket executando o comando echo $BUCKET.

src/main/java/com/example/demo/GcsController.java (link em inglês)

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

Crie e execute o app com o Maven:

$ ./mvnw spring-boot:run

O app começa a detectar a porta 8080. Abra uma nova guia do Cloud Shell e execute curl para acessar o app.

$ curl localhost:8080

Você verá que o conteúdo do arquivo voltou do app. Acesse a guia anterior do Cloud Shell em que o app está em execução e elimine-o com Control+C (Command+C no Macintosh).

6. Gravar no arquivo no Cloud Storage

Você lê o conteúdo do arquivo no Cloud Storage e o expõe por meio de um controlador REST do Spring. Agora, altere o conteúdo do arquivo postando o conteúdo novo no mesmo endpoint HTTP.

É necessário adicionar outro método ao GcsController, que responderá ao HTTP POST e gravará os dados no seu arquivo no Cloud Storage. Desta vez, transmita a Resource da Spring para WritableResource.

Atualize o GcsController com outras importações necessárias.

src/main/java/com/example/demo/GcsController.java (link em inglês)

import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;

Adicione o novo método de endpoint ao controlador.

src/main/java/com/example/demo/GcsController.java (link em inglês)

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

Crie e execute o app com o Maven:

$ ./mvnw spring-boot:run

O app começa a detectar a porta 8080. Abra uma nova guia do Cloud Shell e execute curl para postar uma mensagem no app.

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

Você verá uma confirmação de que o conteúdo do arquivo foi atualizado. No entanto, verifique isso fazendo uma GET.

$ curl localhost:8080

Você verá o conteúdo atualizado do arquivo retornado do app. Volte para a guia anterior do Cloud Shell em que o app está em execução e elimine-o com Control+C (Command+C no Macintosh).

7. Parabéns!

Você aprendeu a usar a abstração Spring Resource para acessar facilmente arquivos no Cloud Storage. Você escreveu um app da Web do Spring Boot que pode ler e gravar em um arquivo no Cloud Storage. Você também aprendeu sobre o Spring Boot Starter para o Cloud Storage.

Saiba mais

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.