Dostęp do plików w Cloud Storage za pomocą abstrakcji zasobu Spring

Spring Framework korzysta z abstrakcji ResourceLoader, aby móc łatwo odczytywać i zapisywać pliki z różnych źródeł, takich jak system plików, ścieżka klasy czy strona internetowa. Wystarczy, że określisz identyfikator URI zasobu, używając dobrze znanego prefiksu protokołu. Aby na przykład uzyskać dostęp do pliku w lokalnym systemie plików, musisz podać identyfikator URI, taki jak file:/data/config.yaml.

Napiszesz wiosną aplikację rozruchową, która będzie miała dostęp do plików przechowywanych w Cloud Storage, korzystając z abstrakcji zasobu Spring i przedrostka protokołu gs:.

W tym celu użyj narzędzia Cloud Shell i narzędzia wiersza poleceń gcloud z pakietu SDK Cloud.

Czego się nauczysz:

  • Jak zacząć uruchamianie wiosennego rozruchu Cloud Storage
  • Jak uzyskać dostęp do plików w Cloud Storage w Spring
  • Jak korzystać z podsumowań wiosennych Resource i WritableResource

Czego potrzebujesz

  • Projekt Google Cloud
  • Przeglądarka taka jak Google Chrome
  • Znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, Emacs czy GNU Nano

Jak będziesz korzystać z ćwiczeń z programowania?

Tylko do odczytu Przeczytanie i ukończenie ćwiczeń

Jak oceniasz tworzenie aplikacji internetowych HTML i CSS?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

Konfiguracja środowiska we własnym tempie

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

Zrzut ekranu z 10 września 2016 r., 12:45:26.png

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID.

Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.

Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartości 300 USD.

Cloud Shell

Będziesz używać Cloud Shell – środowiska wiersza poleceń uruchomionego w Google Cloud.

Aktywuj Google Cloud Shell

W konsoli GCP kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

Następnie kliknij "Uruchom Cloud Shell"

Udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil:

Ta maszyna wirtualna jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Znaczna część (lub nawet całość) zadań wykonywanych w tym module można wykonać w przeglądarce lub na Chromebooku Google.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt i masz już ustawiony identyfikator PROJECT_ID.

Uruchom następujące polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:

gcloud auth list

Polecenie wyjściowe

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

Polecenie wyjściowe

[core]
project = <PROJECT_ID>

Jeśli nie, możesz ustawić ją za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Polecenie wyjściowe

Updated property [core/project].

Po uruchomieniu Cloud Shell możesz zacząć tworzyć pliki i przenosić je do Cloud Storage.

Utwórz plik o nazwie my-file.txt:

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

Następnie utwórz nowy unikalny zasobnik w Cloud Storage i przenieś do niego tam plik za pomocą gsutil.

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

Otwórz przeglądarkę miejsca na dane w Cloud Storage i sprawdź, czy w zasobniku znajdują się zasobniki i pliki.

Zacznij pisać aplikację, korzystając z wiersza poleceń, aby wygenerować nową aplikację Spring Run Initializr:

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

Pamiętaj, że inicjator automatycznie doda spring-boot-starter-web i spring-cloud-gcp-starter-storage do zależności w pom.xml.

Przejdź do katalogu aplikacji szablonu:

$ cd spring-gcs

Utwórz i uruchom aplikację za pomocą Maven.

$ ./mvnw spring-boot:run

Aplikacja zacznie nasłuchiwać na porcie 8080. Otwórz nową kartę Cloud Shell i uruchom curl, aby uzyskać dostęp do aplikacji.

$ curl localhost:8080

Powinna pojawić się odpowiedź 404, ponieważ aplikacja nie wykonała jeszcze żadnych działań. Wróć do poprzedniej karty Cloud Shell, na której działa aplikacja, i zamknij ją za pomocą Control+C (Command+C na Macu).

Zmodyfikuj swoją aplikację Spring Run, aby uzyskać dostęp do pliku my-file.txt zapisanego wcześniej w Cloud Storage. Celem jest zwracanie treści pliku za pomocą protokołu HTTP.

Za pomocą Vim możesz edytować pliki za pomocą Vim, ale możesz też skorzystać z usług Emacs, GNU Nano lub wbudowanego edytora kodu w Cloud Shell:

$ cd ~/spring-gcs

Dodaj kontroler REST GcsController do aplikacji.

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

Wklej ten kod i nie zapomnij naprawić identyfikatora URI zasobu z utworzonym wcześniej zasobnikiem. Aby sprawdzić zasobnik, uruchom polecenie 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";
  }
}

Utwórz i uruchom aplikację za pomocą Maven:

$ ./mvnw spring-boot:run

Aplikacja zaczyna nasłuchiwać na porcie 8080. Otwórz nową kartę Cloud Shell i uruchom curl, aby uzyskać dostęp do aplikacji.

$ curl localhost:8080

Teraz zobaczysz, że treść pliku zwrócono z aplikacji. Przejdź do poprzedniej karty Cloud Shell, na której działa aplikacja, i zamknij ją, używając Control+C (Command+C na Macu).

Odczytujesz zawartość pliku w Cloud Storage i udostępniasz go za pomocą kontrolera Spring REST. Teraz zmień zawartość pliku, publikując jego zawartość w tym samym punkcie końcowym HTTP.

Musisz dodać do metody GcsController inną metodę, która będzie odpowiadać na żądania HTTP POST i zapisać dane w pliku w Cloud Storage. Tym razem wiosną Resource przesyłaj WritableResource.

Zaktualizuj GcsController, dodając potrzebne importy.

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;

Dodaj nową metodę punktu końcowego do kontrolera.

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

Utwórz i uruchom aplikację za pomocą Maven:

$ ./mvnw spring-boot:run

Aplikacja zaczyna nasłuchiwać na porcie 8080. Otwórz nową kartę Cloud Shell i uruchom curl, aby opublikować wiadomość w aplikacji.

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

Powinno pojawić się potwierdzenie aktualizacji zawartości pliku. Możesz to jednak zweryfikować, wykonując GET.

$ curl localhost:8080

Zobaczysz zaktualizowaną zawartość pliku zwróconego przez aplikację. Wróć do poprzedniej karty Cloud Shell, na której działa aplikacja, i zamknij ją za pomocą Control+C (Command+C na Macu).

Wiesz już, jak używać abstrakcji zasobu Spring, aby mieć łatwy dostęp do plików w Cloud Storage. Masz utworzoną aplikację internetową Spring rozruchu, która może odczytywać i zapisywać pliki w Cloud Storage. Omówiliśmy też funkcję Spring Starter Starter w Cloud Storage, która umożliwia korzystanie z tej funkcji.

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.