Mit der Spring Resource-Abstraktion auf Dateien in Cloud Storage zugreifen

1. Übersicht

Das Spring Framework bietet eine ResourceLoader-Abstraktion, mit der Dateien aus verschiedenen Quellen wie dem Dateisystem, dem Klassenpfad oder dem Web einfach gelesen und geschrieben werden können. Sie müssen lediglich den URI zur Ressource mit dem bekannten Protokollpräfix angeben. Wenn Sie beispielsweise auf eine Datei im lokalen Dateisystem zugreifen möchten, geben Sie einen URI wie file:/data/config.yaml an.

Sie schreiben eine Spring Boot-Anwendung, mit der Sie mit der Spring Resource-Abstraktion und dem Protokollpräfix gs: auf Dateien zugreifen können, die in Cloud Storage gespeichert sind.

Dazu verwenden Sie Cloud Shell und das Cloud SDK-Befehlszeilentool „gcloud“.

Lerninhalte

  • Cloud Storage Spring Boot-Starter verwenden
  • Mit Spring auf Dateien in Cloud Storage zugreifen
  • Resource- und WritableResource-Abstraktionen von Spring verwenden

Voraussetzungen

  • Ein Google Cloud-Projekt
  • Ein Browser, z. B. Google Chrome
  • Erfahrung mit standardmäßigen Linux-Texteditoren wie Vim, Emacs und GNU Nano

Wie werden Sie das Codelab verwenden?

Nur lesen Lesen und Übungen durchführen

Wie würden Sie Ihre Erfahrung mit der Entwicklung von HTML- und CSS-Web-Apps bewerten?

Anfänger Mittelstufe Fortgeschrittene

Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eines erstellen.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird später in diesem Codelab als PROJECT_ID bezeichnet.

  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“, in der Sie erfahren, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.

Cloud Shell

Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Wenn Sie Cloud Shell noch nie gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:

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

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser oder Ihrem Chromebook erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

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

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Datei in Cloud Storage erstellen

Nachdem Cloud Shell gestartet wurde, können Sie Dateien erstellen und in Cloud Storage übertragen.

Erstellen Sie eine Datei mit dem Namen my-file.txt:

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

Erstellen Sie dann einen neuen eindeutigen Bucket in Cloud Storage und übertragen Sie die Datei mit gsutil dorthin.

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

Rufen Sie den Storage-Browser in Cloud Storage auf und prüfen Sie, ob der Bucket und die Datei vorhanden sind.

4. Spring Boot-Anwendung initialisieren

Beginnen Sie mit dem Schreiben der App, indem Sie über die Befehlszeile eine neue Spring Boot-App mit Spring Initializr generieren:

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

Beachten Sie, dass Initializr automatisch die spring-boot-starter-web und spring-cloud-gcp-starter-storage zu den Abhängigkeiten im pom.xml der Vorlagen-App hinzufügt.

Wechseln Sie in das Verzeichnis der Vorlagen-App:

$ cd spring-gcs

Prüfen Sie, ob JAVA_HOME auf die richtige JDK-Version eingestellt ist:

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

Erstellen und Ausführen der App mit Maven

$ ./mvnw spring-boot:run

Die App beginnt, Port 8080 zu überwachen. Öffnen Sie einen neuen Cloud Shell-Tab und führen Sie curl aus, um auf die App zuzugreifen.

$ curl localhost:8080

Sie sollten eine 404-Antwort erhalten, da die App noch nichts Nützliches tut.

Kehren Sie zum vorherigen Cloud Shell-Tab zurück, auf dem die App ausgeführt wird, und beenden Sie sie mit Control+C (Command+C auf Macintosh).

5. Datei in Cloud Storage lesen

Ändern Sie Ihre Spring Boot-App so, dass sie auf my-file.txt zugreifen kann, die Datei, die Sie zuvor in Cloud Storage gespeichert haben. Ihr Ziel ist es, den Inhalt der Datei einfach über HTTP zurückzugeben.

In der folgenden Anleitung wird Vim zum Bearbeiten der Dateien verwendet. Sie können aber auch Emacs, GNU Nano oder den integrierten Code-Editor in Cloud Shell verwenden:

cloud-editor.png

$ cd ~/spring-gcs

Fügen Sie der App einen REST-Controller GcsController hinzu.

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

Fügen Sie den folgenden Code ein und korrigieren Sie den Ressourcen-URI mit dem Bucket, den Sie zuvor erstellt haben. Sie können den Bucket mit dem Befehl echo $BUCKET prüfen.

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());
  }
}

App mit Maven erstellen und ausführen:

$ ./mvnw spring-boot:run

Die App beginnt, Port 8080 zu überwachen. Öffnen Sie einen neuen Cloud Shell-Tab und führen Sie curl aus, um auf die App zuzugreifen.

$ curl localhost:8080

Sie sollten jetzt sehen, dass der Inhalt der Datei von der App zurückgegeben wurde. Rufen Sie den vorherigen Cloud Shell-Tab auf, auf dem die App ausgeführt wird, und beenden Sie sie mit Control+C (Command+C auf Macintosh).

6. In die Datei in Cloud Storage schreiben

Sie lesen den Inhalt der Datei in Cloud Storage und stellen ihn über einen Spring REST-Controller bereit. Ändern Sie nun den Inhalt der Datei, indem Sie den neuen Dateiinhalt an denselben HTTP-Endpunkt senden.

Sie müssen GcsController eine weitere Methode hinzufügen, die auf HTTP POST reagiert und die Daten in Ihre Datei in Cloud Storage schreibt. Dieses Mal wandeln Sie die Spring-Variable Resource in WritableResource um.

Aktualisieren Sie die Datei GcsController mit zusätzlichen Importen, die Sie benötigen.

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;

Fügen Sie dem Controller die neue Endpunktmethode hinzu.

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

App mit Maven erstellen und ausführen:

$ ./mvnw spring-boot:run

Die App beginnt, Port 8080 zu überwachen. Öffnen Sie einen neuen Cloud Shell-Tab und führen Sie curl aus, um eine Nachricht in der App zu posten.

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

Sie sollten eine Bestätigung sehen, dass der Inhalt der Datei aktualisiert wurde. Prüfen Sie das jedoch mit einem GET.

$ curl localhost:8080

Sie sollten sehen, dass der aktualisierte Inhalt der Datei von der App zurückgegeben wird. Kehren Sie zum vorherigen Cloud Shell-Tab zurück, auf dem die App ausgeführt wird, und beenden Sie sie mit Control+C (Command+C auf Macintosh).

7. Glückwunsch!

Sie haben gelernt, wie Sie mit der Spring Resource-Abstraktion einfach auf Dateien in Cloud Storage zugreifen können. Sie haben eine Spring Boot-Webanwendung geschrieben, die Daten aus einer Datei in Cloud Storage lesen und in eine Datei in Cloud Storage schreiben kann. Außerdem haben Sie den Spring Boot-Starter für Cloud Storage kennengelernt, der diese Funktion ermöglicht.

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.