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

1. Übersicht

Spring Framework bietet eine ResourceLoader-Abstraktion, um Dateien aus verschiedenen Quellen wie Dateisystem, Klassenpfad oder Web einfach zu lesen und zu schreiben. 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, die mithilfe der Spring Resource-Abstraktion und des Protokollpräfixes gs: auf Dateien zugreift, die in Cloud Storage gespeichert sind.

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

Aufgaben in diesem Lab

  • So verwenden Sie den Cloud Storage Spring Boot-Starter
  • 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?

<ph type="x-smartling-placeholder"></ph> Schreibgeschützt Übungen lesen und abschließen

Wie würden Sie Ihre Erfahrung mit der Erstellung von HTML- und CSS-Webanwendungen bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

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

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

2. Einrichtung und Anforderungen

Umgebung für das selbstbestimmte 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 ein Konto 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 in diesem Codelab später als PROJECT_ID bezeichnet.

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

Dieses Codelab sollte möglichst wenig kosten. Folgen Sie der Anleitung im Abschnitt „Bereinigen“, . Hier erfahren Sie, wie Sie Ressourcen herunterfahren, damit Ihnen über dieses Tutorial hinaus keine Kosten entstehen. Neue Google Cloud-Nutzer können an einem kostenlosen Testzeitraum mit 300$Guthaben teilnehmen.

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Wenn Sie Cloud Shell zum ersten Mal verwenden, wird ein Zwischenbildschirm (below the fold) angezeigt, in dem beschrieben wird, worum es sich dabei handelt. Klicken Sie in diesem Fall auf Weiter. Der Chat wird nie wieder angezeigt. So sieht dieser einmalige Bildschirm aus:

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

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können Sie ganz einfach mit einem Browser oder Ihrem Chromebook erledigen.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in 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

Nach dem Start von Cloud Shell können Sie Dateien erstellen und an 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 mithilfe von 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 Anwendung über die Befehlszeile, um mit Spring Initializr eine neue Spring Boot-Anwendung zu 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 der Initializr die spring-boot-starter-web und die spring-cloud-gcp-starter-storage automatisch zu Ihren Abhängigkeiten im pom.xml der Vorlagen-App hinzufügt.

Wechseln Sie in das Verzeichnis der Vorlagenanwendung:

$ cd spring-gcs

Achten Sie darauf, dass JAVA_HOME auf die richtige JDK-Version eingestellt ist:

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

Erstellen Sie die Anwendung mit Maven und führen Sie sie aus.

$ ./mvnw spring-boot:run

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

$ curl localhost:8080

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

Kehren Sie zum vorherigen Cloud Shell-Tab zurück, in dem die Anwendung 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-Anwendung, um auf die Datei my-file.txt zuzugreifen, 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 verwenden Sie Vim, um die Dateien zu bearbeiten. 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 vergessen Sie nicht, den Ressourcen-URI mit dem Bucket zu korrigieren, den Sie zuvor erstellt haben. Sie können den Bucket prüfen, indem Sie den Befehl echo $BUCKET ausführen.

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

Erstellen Sie die Anwendung mit Maven und führen Sie sie aus:

$ ./mvnw spring-boot:run

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

$ curl localhost:8080

Sie sollten nun sehen, dass der Inhalt der Datei, die von der Anwendung zurückgegeben wurde, angezeigt wird. Wechseln Sie zum vorherigen Cloud Shell-Tab, in dem die Anwendung ausgeführt wird, und beenden Sie sie mit Control+C (Command+C auf Macintosh).

6. In die Datei in Cloud Storage schreiben

Sie haben den Inhalt der Datei in Cloud Storage gelesen und über einen Spring REST-Controller verfügbar gemacht. Ä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 antwortet und die Daten in Ihre Datei in Cloud Storage schreibt. Dieses Mal kannst du den Frühlings-Resource auf WritableResource streamen.

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

Erstellen Sie die Anwendung mit Maven und führen Sie sie aus:

$ ./mvnw spring-boot:run

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

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

Es sollte eine Bestätigung angezeigt werden, dass der Inhalt der Datei aktualisiert wurde. Führe dies jedoch mit GET aus, um dies zu überprüfen.

$ curl localhost:8080

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

7. Glückwunsch!

Sie haben gelernt, die Spring Resource-Abstraktion zu verwenden, um auf einfache Weise auf Dateien in Cloud Storage zuzugreifen. Sie haben eine Spring Boot-Webanwendung geschrieben, die eine Datei in Cloud Storage lesen und darin schreiben kann. Sie haben auch den Spring Boot-Starter für Cloud Storage kennengelernt, der diese Funktionalität ermöglicht.

Weitere Informationen

Lizenz

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