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

1. Visão geral

O framework Spring fornece uma abstração ResourceLoader para facilitar a leitura e a gravação de arquivos de várias fontes, como o sistema de arquivos, o caminho de classe ou a Web. Basta especificar o URI do recurso usando o 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á arquivos armazenados no Cloud Storage usando a abstração Spring Resource e o prefixo de protocolo gs:.

Para isso, use o Cloud Shell e a ferramenta de linha de comando gcloud do SDK Cloud.

O que você vai aprender

  • Como usar o inicializador do Spring Boot do Cloud Storage
  • Como acessar arquivos no Cloud Storage com 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ê vai usar o codelab?

Somente leitura Ler e concluir os exercícios

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

Iniciante Intermediário Proficiente

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

Iniciante Intermediário Proficiente

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma se você ainda não tiver uma conta do Gmail ou do G Suite.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.

A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Cloud Shell

Você vai usar o Cloud Shell, um ambiente de linha de comando em execução no Google Cloud.

Ativar o Cloud Shell

  1. No Console do Cloud, clique em Ativar o Cloud ShellH7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Se você nunca tiver iniciado o Cloud Shell, verá uma tela intermediária (abaixo da dobra) com a descrição do que ele é. Se esse for o caso, clique em Continuar e você não o verá novamente. Esta é uma tela única:

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

Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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 codelab pode ser feito em um navegador ou no seu Chromebook.

Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto já estará configurado com seu ID do projeto.

  1. Execute o seguinte comando no Cloud Shell para confirmar que você está autenticado:
gcloud auth list

Resposta ao 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

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, configure-o usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

3. Crie 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 lá usando gsutil.

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

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

4. Inicializar um aplicativo Spring Boot

Comece a criar o app usando a linha de comando para gerar um novo app Spring Boot com o 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 -

O Initializr vai 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

Verifique se JAVA_HOME está definido como a versão correta do JDK:

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

Crie e execute o app usando o Maven.

$ ./mvnw spring-boot:run

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

$ curl localhost:8080

Você vai receber uma resposta 404 porque o app ainda não faz nada útil.

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).

5. Ler o arquivo no Cloud Storage

Modifique seu app Spring Boot para acessar my-file.txt, o arquivo que você armazenou anteriormente no Cloud Storage. Seu objetivo é simplesmente retornar o conteúdo do arquivo via HTTP.

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

cloud-editor.png

$ 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 e corrija o URI do recurso com o bucket criado anteriormente. Para verificar o bucket, execute o 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());
  }
}

Crie e execute o app com o Maven:

$ ./mvnw spring-boot:run

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

$ curl localhost:8080

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

6. Gravar no arquivo do Cloud Storage

Você leu o conteúdo do arquivo no Cloud Storage e o expôs por meio de um controlador Spring REST. Agora, altere o conteúdo do arquivo publicando o novo conteúdo no mesmo endpoint HTTP.

Você precisa adicionar outro método a GcsController que responda a HTTP POST e grave os dados no seu arquivo no Cloud Storage. Desta vez, transmita o Resource da mola para WritableResource.

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

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;

Adicione o novo método de endpoint ao 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";
  }
  ...
}

Crie e execute o app com o Maven:

$ ./mvnw spring-boot:run

O app começa a ouvir na 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, para isso, faça uma GET.

$ curl localhost:8080

Você vai encontrar 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 arquivos com facilidade no Cloud Storage. Você criou um app da Web Spring Boot que pode ler e gravar em um arquivo no Cloud Storage. Você também aprendeu sobre o inicializador Spring Boot para Cloud Storage que ativa essa funcionalidade.

Saiba mais

Licença

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