Mit der Spring-Ressourcenabstraktion auf Dateien in Cloud Storage zugreifen

Spring Framework bietet eine Abstraktion von ResourceLoader zum einfachen Lesen und Schreiben von Dateien aus verschiedenen Quellen, z. B. dem Dateisystem, dem Kurspfad oder dem Web. Dazu müssen Sie nur den URI für die Ressource über das bekannte 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-App, die auf Dateien zugreift, die in Cloud Storage gespeichert sind. Dabei werden die Spring-Ressourcen-Abstraktion und das Präfix gs: verwendet.

Verwenden Sie dazu Cloud Shell und das gcloud-Befehlszeilentool des Cloud SDK.

Lerninhalte

  • Cloud Storage Spring Boot-Auslöser verwenden
  • Mit Spring auf Dateien in Cloud Storage zugreifen
  • Spring-Abstraktionen Resource und WritableResource verwenden

Voraussetzungen

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

Wie verwenden Sie das Codelab?

Nur Lesen Übungen lesen und abschließen

Wie würdest du deine Erfahrung beim Erstellen von HTML- und CSS-Webanwendungen bewerten?

Neuling Fortgeschritten Profi

Wie würdest du deine Erfahrung mit der Nutzung der Google Cloud-Dienste bewerten?

Fortgeschritten Fortgeschritten Profi

Umgebung im eigenen Tempo einrichten

Wenn Sie noch kein Google-Konto haben (Gmail oder Google Apps), müssen Sie eines erstellen. Melden Sie sich unter console.cloud.google.com in der Google Cloud Platform Console an und erstellen Sie ein neues Projekt:

Screenshot von 2016-02-10 12:45:26.png

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. In diesem Codelab wird sie später als PROJECT_ID bezeichnet.

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

Das Durchlaufen dieses Codelabs sollte nicht mehr als ein paar Dollar kosten. Es kann aber auch sein, dass Sie mehr Ressourcen brauchen oder sie weiterlaufen möchten (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).

Neuen Google Cloud Platform-Nutzern steht ein kostenloser Testzeitraum im Wert von 300 $ zur Verfügung.

Cloud Shell

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

Google Cloud Shell aktivieren

Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:

Klicken Sie dann auf "Cloud Shell starten":

Die Bereitstellung und Verbindung mit der Umgebung dauert nur einen Moment:

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 auf der Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Sie können die meisten, wenn nicht sogar alle Schritte in diesem Lab einfach mit einem Browser oder Ihrem Google Chromebook durchführen.

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

Führen Sie in Cloud Shell den folgenden Befehl aus, um zu bestätigen, dass Sie authentifiziert sind:

gcloud auth list

Befehlsausgabe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
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].

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

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

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

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

Schreiben Sie die Anwendung mithilfe der Befehlszeile, um eine neue Spring-Boot-App mit Spring Initializr zu generieren:

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

Der Initializr fügt den Abhängigkeiten (spring-boot-starter-web) und spring-cloud-gcp-starter-storage automatisch die pom.xml in der Vorlagen-App hinzu.

Wechseln Sie in das Verzeichnis der Vorlagen-App:

$ cd spring-gcs

Anwendung mit Maven erstellen und ausführen

$ ./mvnw spring-boot:run

Die App beginnt mit der Überwachung auf 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, weil die App noch nichts bietet. 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 unter Macintosh).

Ändern Sie die Spring Boot-App auf my-file.txt, die Datei, die Sie zuvor in Cloud Storage gespeichert haben. Ihr Ziel ist es, die Inhalte 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:

$ cd ~/spring-gcs

Fügen Sie der App den 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.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";
  }
}

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

$ ./mvnw spring-boot:run

Die App beginnt mit der Überwachung auf 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 jetzt sehen, dass der Inhalt der Datei von der App zurückgegeben wurde. Wechseln Sie zum vorherigen Cloud Shell-Tab, auf dem die App ausgeführt wird, und beenden Sie sie mit Control+C (Command+C unter Macintosh).

Sie haben den Inhalt der Datei in Cloud Storage gelesen und über einen Spring REST REST API freigegeben. Ä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. Streamen Sie dieses Mal den Frühling Resource auf WritableResource.

Aktualisieren Sie den GcsController mit zusätzlichen erforderlichen Importen.

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;

Fügen Sie dem Controller die neue Endpunktmethode hinzu.

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

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

$ ./mvnw spring-boot:run

Die App beginnt mit der Überwachung auf 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

Sie sollten eine Bestätigung sehen, dass der Inhalt der Datei aktualisiert wurde. Prüfe das aber mithilfe von GET.

$ curl localhost:8080

Sie sollten die aktualisierten Inhalte der Datei sehen, die 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 unter Macintosh).

Sie haben gelernt, wie Sie mit der Spring Resource-Abstraktion ganz einfach auf Dateien in Cloud Storage zugreifen können. Sie haben eine Spring-Boot-Webanwendung geschrieben, die Dateien in Cloud Storage lesen und schreiben kann. Außerdem haben Sie sich mit dem Spring-Boot-Starter für Cloud Storage vertraut gemacht.

Weitere Informationen

Lizenz

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