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

1. Omówienie

Spring Framework udostępnia abstrakcję ResourceLoader umożliwiającą łatwe odczytywanie i zapisywanie plików z różnych źródeł, takich jak system plików, ścieżka klasy czy sieć. Wystarczy, że podasz identyfikator URI zasobu za pomocą dobrze znanego prefiksu protokołu. Aby na przykład uzyskać dostęp do pliku w lokalnym systemie plików, podaj identyfikator URI taki jak file:/data/config.yaml.

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

Użyjesz do tego Cloud Shell i narzędzia wiersza poleceń gcloud z pakietu SDK Cloud.

Czego się nauczysz

  • Jak używać polecenia inicjującego sprężynowego rozruchu w Cloud Storage
  • Jak uzyskać dostęp do plików w Cloud Storage za pomocą Spring
  • Jak używać abstrakcyjnych abstrakcji z wiosny Resource i WritableResource

Czego potrzebujesz

  • Projekt Google Cloud
  • przeglądarki, na przykład Google Chrome;
  • znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, Emacs czy GNU Nano;

Jak będziesz używać tych ćwiczeń w Codelabs?

Tylko do odczytu Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenia z tworzeniem aplikacji internetowych HTML i CSS?

Początkujący Poziom średnio zaawansowany Biegły

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. 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, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w Codelabs będzie ona określana jako PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.

Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Cloud Shell

Użyjesz Cloud Shell – ś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 dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość czynności z tego ćwiczenia z programowania można wykonać w przeglądarce lub na Chromebooku.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe 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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Utwórz plik w Cloud Storage

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 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 masowej w Cloud Storage i sprawdź, czy zasobnik oraz plik są tam.

4. Inicjowanie aplikacji Spring Boot

Zacznij pisać aplikację, korzystając z wiersza poleceń, aby wygenerować nową aplikację 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 narzędzie Zdarzenie inicjujące automatycznie doda spring-boot-starter-web i spring-cloud-gcp-starter-storage do Twoich zależności w elemencie pom.xml aplikacji z szablonami.

Przejdź do katalogu aplikacji szablonu:

$ cd spring-gcs

Sprawdź, czy JAVA_HOME ma prawidłową wersję pakietu 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

Powinien pojawić się błąd 404, ponieważ aplikacja nie jest jeszcze pomocna.

Wróć do poprzedniej karty Cloud Shell, na której działa aplikacja, i zamknij ją, naciskając Control+C (Command+C na Macu).

5. Odczytywanie pliku w Cloud Storage

Zmodyfikuj aplikację Spring Boot, aby uzyskać dostęp do pliku my-file.txt zapisanego wcześniej w Cloud Storage. Twoim celem jest zwracanie zawartości pliku przez HTTP.

W poniższych instrukcjach będziesz używać Vim do edytowania plików. Możesz też skorzystać z 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. Pamiętaj, aby poprawić identyfikator URI zasobu za pomocą utworzonego wcześniej zasobnika. Zasobnik możesz sprawdzić, 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 zaczyna 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ę zawartość pliku zwrócona z aplikacji. Otwórz poprzednią kartę Cloud Shell, na której działa aplikacja, i zamknij ją, używając polecenia Control+C (Command+C na Macu).

6. Zapisz do pliku w Cloud Storage

Zawartość pliku została odczytana w Cloud Storage i udostępniona za pomocą kontrolera Spring REST. Teraz zmień zawartość pliku, publikując nową treść w tym samym punkcie końcowym HTTP.

Musisz dodać do GcsController inną metodę, która będzie odpowiadać na żądanie HTTP POST i zapisywać dane w Twoim pliku w Cloud Storage. Tym razem ustaw wiosnę Resource na: WritableResource.

Zaktualizuj GcsController, wprowadzając potrzebne dodatkowe 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 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 jednak to sprawdzić, wykonując GET.

$ curl localhost:8080

Powinna pojawić 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 Macu).

7. Gratulacje!

Wiesz już, jak korzystać z abstrakcji zasobów Spring, aby łatwo uzyskiwać dostęp do plików w Cloud Storage. Udało Ci się napisać aplikację internetową Spring Boot, która może odczytywać i zapisywać pliki w Cloud Storage. Omówiliśmy również narzędzie startowe Spring Boot dla Cloud Storage, które umożliwia tę funkcję.

Więcej informacji

Licencja

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