Spring Boot-Anwendung mit Cloud Datastore

1. Übersicht

Google Cloud Datastore ist eine NoSQL-Dokumentdatenbank, die auf automatische Skalierung, hohe Leistung und einfache Anwendungsentwicklung ausgelegt ist.

Aufgaben in diesem Lab

  • Cloud Datastore zum Speichern und Abrufen von Java-Objekten in Spring Boot verwenden

Voraussetzungen

  • Google Cloud Platform-Projekt
  • Ein Browser, z. B. Chrome oder Firefox

Wie möchten Sie diese Anleitung nutzen?

<ph type="x-smartling-placeholder"></ph> Nur bis zum Ende lesen Lies sie dir durch und absolviere die Übungen

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

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

2. Einrichtung und Anforderungen

Umgebung für das selbstbestimmte Lernen einrichten

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf deine Projekt-ID verweisen, die üblicherweise als PROJECT_ID bezeichnet wird. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID generieren. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts erhalten.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab ist kostengünstig. Sie können die von Ihnen erstellten Ressourcen oder das Projekt löschen, um Ressourcen herunterzufahren, um zu vermeiden, dass über diese Anleitung hinaus Kosten anfallen. Neue Google Cloud-Nutzer haben Anspruch auf das kostenlose Testprogramm mit 300$Guthaben.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt, wodurch die Netzwerkleistung und Authentifizierung erheblich verbessert werden. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt 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`
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
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. Cloud Datastore initialisieren

Gehen Sie in der GCP Console zu Menü -> Datastore (im Bereich „Speicher“) oder klicken Sie hier.

Wenn Sie Datastore im aktuellen Projekt noch nie verwendet haben, wird der Bildschirm Cloud Firestore-Modus auswählen angezeigt. Wählen Sie die Option Datenspeichermodus aus.

f938295c7ff297f4.png

Anschließend wird der Bildschirm Speicherort für Daten auswählen angezeigt. Wählen Sie us-east1 oder einen anderen regionalen Speicherort aus und klicken Sie auf "Datenbank erstellen":

916ac84fec10fae7.png

4. Neue Spring Boot-Java-Anwendung bootstrappen

Führen Sie in der Cloud Shell-Umgebung den folgenden Befehl aus, um eine neue Spring Boot-Anwendung zu initialisieren und ein Bootstrapping durchzuführen:

$ curl https://start.spring.io/starter.tgz \
  -d packaging=war \
  -d dependencies=cloud-gcp \
  -d type=maven-project \
  -d baseDir=datastore-example \
  -d bootVersion=3.0.5 | tar -xzvf -

Dadurch wird ein neues datastore-example/-Verzeichnis mit einem neuen Maven-Projekt, zusammen mit der pom.xml von Maven, einem Maven-Wrapper und einem Anwendungseinstiegspunkt erstellt.

Unsere Anwendung bietet eine Befehlszeile, über die Nutzer Befehle eingeben und Ergebnisse anzeigen können. Wir erstellen eine Klasse, die ein Buch darstellt, und speichern es dann mithilfe des Datastore-Repositorys in Cloud Datastore.

Außerdem müssen wir dem pom.xml eine weitere erforderliche Abhängigkeit hinzufügen.

Öffnen Sie den Webcode-Editor, indem Sie im Cloud Shell-Menü auf Editor öffnen klicken.

6d823258c76a7452.png

Nachdem der Editor geladen wurde, ändern Sie die Datei pom.xml, um die Abhängigkeiten von Google Cloud Datastore Starter und Spring Shell Starter hinzuzufügen:

pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add GCP Datastore Starter -->
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>spring-cloud-gcp-starter-data-datastore</artifactId>
        </dependency>

        <!-- Add Spring Shell Starter -->
        <dependency>
                <groupId>org.springframework.shell</groupId>
                <artifactId>spring-shell-starter</artifactId>
                <version>3.0.2</version>
        </dependency>

  </dependencies>
</project>

5. Kurs "Book" erstellen

Erstellen Sie mit dem Editor die Klasse Book mit folgendem Inhalt:

datastore-example/src/main/java/com/example/demo/Book.java

package com.example.demo;

import com.google.cloud.spring.data.datastore.core.mapping.Entity;
import org.springframework.data.annotation.Id;

@Entity(name = "books")
public class Book {
  @Id
  Long id;

  String title;

  String author;

  int year;

  public Book(String title, String author, int year) {
    this.title = title;
    this.author = author;
    this.year = year;
  }

  public long getId() {
    return this.id;
  }

  @Override
  public String toString() {
    return "Book{" +
        "id=" + this.id +
        ", title='" + this.title + '\'' +
        ", author='" + this.author + '\'' +
        ", year=" + this.year +
        '}';
  }
}

Wie Sie sehen, ist dies ein einfaches POJO. Die Klasse ist mit @Entity annotiert, um anzuzeigen, dass sie in Datastore gespeichert werden kann, und den Typnamen bereitstellt. Stellen Sie sich eine Art wie eine Tabelle in SQL-Datenbanken vor. Weitere Informationen finden Sie in der Dokumentation. Der Typname ist optional. Wenn Sie ihn nicht angeben, wird der Typname auf Grundlage des Klassennamens generiert.

Beachten Sie, dass die id-Eigenschaft mit @Id annotiert wurde. Das bedeutet, dass dieses Feld als Kennungsteil des Datenspeicherschlüssels verwendet werden soll. Jede Datastore-Entität benötigt eine Kennung. Unterstützte Typen sind String und Long.

Die Methode toString wird überschrieben, um die Stringdarstellung der Objekte lesbarer zu machen. wenn wir sie ausdrucken.

6. BookRepository-Schnittstelle erstellen

Erstellen Sie die Klasse BookRepository mit folgendem Inhalt:

datastore-example/src/main/java/com/example/demo/BookRepository.java

package com.example.demo;

import java.util.List;

import com.google.cloud.spring.data.datastore.repository.DatastoreRepository;


public interface BookRepository extends DatastoreRepository<Book, Long> {

  List<Book> findByAuthor(String author);

  List<Book> findByYearGreaterThan(int year);

  List<Book> findByAuthorAndYear(String author, int year);
}

Die Schnittstelle erweitert DatastoreRepository<Book, Long>, wobei Book die Domainklasse und Long der Typ Id ist. Wir deklarieren in unserem Repository drei Abfragemethoden, für die Implementierungen automatisch im Hintergrund generiert werden.

Der erste ist findByAuthor. Wie Sie sich vorstellen können, wird bei der Implementierung dieser Methode eine Abfrage ausgeführt, bei der ein vom Nutzer angegebener Wert im Bedingungsfilter für die Gleichheit mit dem Autorenfeld verwendet wird.

Die Methode findByYearGreaterThan führt eine Abfrage aus, die nach dem Feld für das Jahr filtert, das größer als der vom Nutzer angegebene Wert ist.

findByAuthorAndYear führt eine Abfrage aus, die nach Entitäten sucht, bei denen die Felder „Autor“ und „Jahr“ mit den vom Nutzer angegebenen Werten übereinstimmen.

7. Interaktive Befehlszeilenanwendung erstellen

Öffnen Sie die DemoApplication-Hauptklasse der Anwendung und ändern Sie sie so:

datastore-example/src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

import java.util.List;

import com.google.common.collect.Lists;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;

@ShellComponent
@SpringBootApplication
public class DemoApplication {
  @Autowired
  BookRepository bookRepository;

  public static void main(String[] args) {
     SpringApplication.run(DemoApplication.class, args);
  }

  @ShellMethod("Saves a book to Cloud Datastore: save-book <title> <author> <year>")
  public String saveBook(String title, String author, int year) {
     Book savedBook = this.bookRepository.save(new Book(title, author, year));
     return savedBook.toString();
  }

  @ShellMethod("Loads all books")
  public String findAllBooks() {
     Iterable<Book> books = this.bookRepository.findAll();
     return Lists.newArrayList(books).toString();
  }

  @ShellMethod("Loads books by author: find-by-author <author>")
  public String findByAuthor(String author) {
     List<Book> books = this.bookRepository.findByAuthor(author);
     return books.toString();
  }

  @ShellMethod("Loads books published after a given year: find-by-year-after <year>")
  public String findByYearAfter(int year) {
     List<Book> books = this.bookRepository.findByYearGreaterThan(year);
     return books.toString();
  }

  @ShellMethod("Loads books by author and year: find-by-author-year <author> <year>")
  public String findByAuthorYear(String author, int year) {
     List<Book> books = this.bookRepository.findByAuthorAndYear(author, year);
     return books.toString();
  }

  @ShellMethod("Removes all books")
  public void removeAllBooks() {
     this.bookRepository.deleteAll();
  }
}

Beachten Sie, wie wir die Klasse mit @ShellComponent annotiert haben. Das gibt Spring an, dass wir diese Klasse als Quelle für CLI-Befehle verwenden möchten. Die mit @ShellMethod annotierten Methoden werden in unserer Anwendung als Befehlszeilenbefehle bereitgestellt.

Hier verwenden wir die Methoden, die wir in der BookRepository-Schnittstelle deklariert haben: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. Außerdem verwenden wir drei integrierte Methoden: save, findAll und deleteAll.

Sehen wir uns die Methode saveBook an. Wir erstellen ein Book-Objekt mit von Nutzern bereitgestellten Werten für Titel, Autor und Jahr. Wie Sie sehen, ist kein id-Wert angegeben. Er wird beim Speichern automatisch dem id-Feld zugewiesen und dem Feld zugewiesen. Die Methode save akzeptiert ein Objekt vom Typ Book und speichert es in Cloud Datastore. Sie gibt ein Book-Objekt zurück, in dem alle Felder ausgefüllt sind, einschließlich des Felds id. Am Ende wird eine Zeichenfolgendarstellung dieses Objekts zurückgegeben.

Die übrigen Methoden funktionieren ähnlich: Sie akzeptieren die Übergabe von Parametern an die entsprechenden Repository-Methoden und geben String-Ergebnisse zurück.

8. Anwendung ausführen

Stellen Sie zum Erstellen und Starten der Anwendung zunächst sicher, dass JAVA_HOME auf die richtige Version eingestellt ist:

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

Führen Sie diesen Befehl in Cloud Shell aus (vom Stammverzeichnis des Projekts datastore-example/ aus, in dem sich die pom.xml befindet):

$ ./mvnw spring-boot:run
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Nach einer erfolgreichen Build-Phase erscheint das Spring-Logo und die Shell-Eingabeaufforderung:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.5)



shell:>

Jetzt können Sie mit den zuvor definierten Befehlen experimentieren. Verwenden Sie den Befehl help, um die Liste der Befehle anzuzeigen:

shell:> help
...
find-all-books: Loads all books
find-by-author: Loads books by author: find-by-author <author>
find-by-author-year: Loads books by author and year: find-by-author-year <author> <year>
find-by-year-after: Loads books published after a given year: find-by-year-after <year>
remove-all-books: Removes all books
save-book: Saves a book to Cloud Datastore: save-book <title> <author> <year>

Versuchen Sie Folgendes:

  1. Mit dem Befehl save-book einige Bücher erstellen
  2. Suche mit dem Befehl find-all-books ausführen
  3. Bücher von einem bestimmten Autor suchen: find-by-author <author>
  4. Bücher suchen, die nach einem bestimmten Jahr veröffentlicht wurden: find-by-year-after <year>
  5. Bücher nach einem bestimmten Autor oder Jahr suchen: find-by-author-year <author> <year>

9. Über die Weboberfläche sehen, was in Datastore gespeichert ist

Rufen Sie die GCP Console auf, um zu sehen, wie die Entitäten in Cloud Datastore gespeichert sind. Geben Sie „Bücher“ ein. im Feld „kind“ ein, falls erforderlich.

5fab21a6c89f45a.png

10. Bereinigen

Entfernen Sie zum Bereinigen alle Bücher mit dem passenden remove-all-books-Befehl aus der Anwendungs-Shell.

shell:> remove-all-books

Verwenden Sie zum Beenden der Anwendung den Befehl „quit“ und dann Ctrl+C.

11. Glückwunsch!

In diesem Codelab haben Sie eine interaktive Befehlszeilenanwendung erstellt, mit der Objekte in Cloud Datastore gespeichert und daraus abgerufen werden können.

Weitere Informationen

Lizenz

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