Dostęp do plików w Cloud Storage z abstrakcją zasobów Spring

1. Przegląd

Spring Framework udostępnia abstrakcję ResourceLoader, która ułatwia odczytywanie i zapisywanie plików z różnych źródeł, takich jak system plików, ścieżka klasy czy internet. Wystarczy podać identyfikator URI zasobu, używając znanego prefiksu protokołu. Aby na przykład uzyskać dostęp do pliku w lokalnym systemie plików, należy podać identyfikator URI w formacie file:/data/config.yaml.

Napiszesz aplikację Spring Boot, która będzie uzyskiwać dostęp do plików przechowywanych w Cloud Storage za pomocą abstrakcji zasobów Spring i prefiksu protokołu gs:.

Zrobisz to za pomocą Cloud Shell i narzędzia wiersza poleceń gcloud z pakietu Cloud SDK.

Czego się nauczysz

  • Jak korzystać z narzędzia Cloud Storage Spring Boot Starter
  • Dostęp do plików w Cloud Storage za pomocą Spring
  • Jak korzystać z abstrakcji Resource i WritableResource w Springu

Czego potrzebujesz

  • projekt Google Cloud,
  • przeglądarka, np. Google Chrome;
  • Znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, Emacs i GNU Nano

Jak zamierzasz wykorzystać ten codelab?

Tylko do odczytu Czytaj i wykonuj ćwiczenia

Jak oceniasz swoje doświadczenie w tworzeniu aplikacji internetowych w HTML i CSS?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. (Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego ćwiczenia będzie on nazywany PROJECT_ID.

  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów Google Cloud.

Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Wykonaj instrukcje z sekcji „Czyszczenie”, w której znajdziesz informacje o tym, jak wyłączyć zasoby, aby uniknąć naliczenia opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Cloud Shell

Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni (część strony widoczna po przewinięciu) z opisem tego środowiska. W takim przypadku kliknij Dalej, a ten ekran nie będzie się już wyświetlać. Ten wyświetlany jednorazowo ekran wygląda tak:

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

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce lub na Chromebooku.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Tworzenie pliku w Cloud Storage

Po uruchomieniu Cloud Shell możesz zacząć tworzyć pliki i przesyłać 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 plik za pomocą gsutil.

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

Otwórz przeglądarkę pamięci w Cloud Storage i sprawdź, czy zasobnik i plik są na miejscu.

4. Inicjowanie aplikacji Spring Boot

Zacznij pisać aplikację, używając wiersza poleceń do wygenerowania nowej aplikacji Spring Boot za pomocą 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 -

Pamiętaj, że Initializr automatycznie doda spring-boot-starter-webspring-cloud-gcp-starter-storage do zależności w pom.xml aplikacji szablonu.

Przejdź do katalogu aplikacji szablonu:

$ cd spring-gcs

Sprawdź, czy JAVA_HOME ma ustawioną prawidłową wersję JDK:

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

Skompiluj 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 robi jeszcze niczego przydatnego.

Wróć na poprzednią kartę Cloud Shell, na której działa aplikacja, i zamknij ją, naciskając Control+C (Command+C na komputerze Macintosh).

5. Odczytywanie pliku w Cloud Storage

Zmodyfikuj aplikację Spring Boot, aby uzyskać dostęp do pliku my-file.txt, który został wcześniej zapisany w Cloud Storage. Twoim celem jest po prostu zwrócenie zawartości pliku przez HTTP.

W tych instrukcjach do edytowania plików użyjemy edytora Vim, ale możesz też użyć edytora Emacs, GNU Nano lub wbudowanego edytora kodu w Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

Dodaj do aplikacji kontroler REST GcsController.

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

Wklej ten kod i nie zapomnij poprawić identyfikatora URI zasobu, używając utworzonego wcześniej zasobnika. Możesz sprawdzić zasobnik, uruchamiając 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.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());
  }
}

Skompiluj 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 się teraz wyświetlić zawartość pliku zwrócona przez aplikację. Wróć do poprzedniej karty Cloud Shell, na której działa aplikacja, i zamknij ją, naciskając Control+C (Command+C na komputerze Macintosh).

6. Zapisywanie w pliku w Cloud Storage

Odczytujesz zawartość pliku w Cloud Storage i udostępniasz ją za pomocą kontrolera Spring REST. Teraz zmień zawartość pliku, przesyłając nową zawartość pliku do tego samego punktu końcowego HTTP.

Musisz dodać do GcsController kolejną metodę, która będzie odpowiadać na żądania HTTP POST i zapisywać dane w pliku w Cloud Storage. Tym razem rzuć zaklęcie Wiosna Resource na 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;
import org.springframework.web.bind.annotation.PostMapping;

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

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

Skompiluj 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 opublikować wiadomość w aplikacji.

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

Powinno pojawić się potwierdzenie, że zawartość pliku została zaktualizowana. Sprawdź to jednak, wykonując GET.

$ curl localhost:8080

Powinna wyświetlić się zaktualizowana zawartość pliku zwrócona przez aplikację. Wróć do poprzedniej karty Cloud Shell, na której działa aplikacja, i zamknij ją, naciskając Control+C (Command+C na komputerze Macintosh).

7. Gratulacje!

Wiesz już, jak używać abstrakcji zasobów Spring, aby łatwo uzyskiwać dostęp do plików w Cloud Storage. Masz napisaną aplikację internetową Spring Boot, która może odczytywać i zapisywać pliki w Cloud Storage. Poznaliśmy też starter Spring Boot dla Cloud Storage, który umożliwia tę funkcję.

Więcej informacji

Licencja

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