Spring-Boot-Anwendung mit Cloud Datastore

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

Lerninhalte

  • Cloud Datastore in Spring Boot speichern und abrufen

Voraussetzungen

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

Wie werden Sie diese Anleitung verwenden?

Nur Lesen Gelesen und die Übungen abschließen

Wie würdest du deine Erfahrung mit der Nutzung der Google Cloud Platform-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.

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

Gehen Sie in der GCP Console zum Abschnitt Menü -> Datastore (im Abschnitt „Speicher“).

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

Anschließend wird & automatisch auswählen, wo Ihre Daten gespeichert werden sollen, angezeigt. Wählen Sie us-east1 oder einen anderen regionalen Standort aus und klicken Sie auf „Datenbank erstellen“:

Verwenden Sie in der Cloud Shell-Umgebung den folgenden Befehl, um eine neue Spring-Boot-Anwendung zu initialisieren und zu starten:

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

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

Die Anwendung stellt eine Befehlszeile zur Verfügung, über die Nutzer Befehle eingeben und Ergebnisse abrufen können. Wir erstellen eine Klasse, die ein Buch darstellt. Anschließend speichern wir es mit Cloud Datastore in Cloud Datastore.

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

Öffnen Sie den Web Code-Editor. Klicken Sie dazu im Cloud Shell-Menü auf Code-Editor starten.

Ändern Sie nach dem Laden des Editors die Datei pom.xml, um die Spring-Starterabhängigkeit von Spring Data Cloud Datastore hinzuzufügen:

pom.xml

<project>
  ...
  <dependencies>
        ...
        <!-- Add GCP Datastore Starter -->
        <dependency>
                <groupId>org.springframework.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>2.0.0.RELEASE</version>
        </dependency>

  </dependencies>
</project>

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

Datenspeicher-beispiel/src/main/java/com/beispiel/demo/Buch.java

package com.example.demo;

import org.springframework.cloud.gcp.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 +
                                '}';
        }
}

Dies ist ein einfaches POJO. Die Klasse ist mit @Entity annotiert, um anzugeben, dass sie in Datastore gespeichert werden kann. Der Name kann wie eine Tabelle in SQL-Datenbanken angegeben werden. Weitere Informationen finden Sie in der Dokumentation. Der Artname ist optional. Wenn er nicht angegeben wird, wird der Typname auf der Grundlage des Klassennamens generiert.

Hinweis: Wir haben id Property mit @Id annotiert. Das bedeutet, dass dieses Feld als Kennung des Datastore-Schlüssels verwendet werden soll. Jede Datastore-Entität benötigt eine Kennung. Unterstützte Typen sind String und Long.

Wir überschreiben die Methode toString , um die Stringdarstellung der Objekte besser lesbar zu machen. Dies ist nützlich, wenn wir sie ausdrucken.

Denken Sie daran, die Datei zu speichern.

Erstelle die BookRepository-Klasse mit dem folgenden Inhalt:

Datenspeicher-beispiel/src/main/java/com/beispiel/demo/BuchRepository.java

package com.example.demo;

import java.util.List;

import org.springframework.cloud.gcp.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 erstreckt sich über DatastoreRepository<Book, Long> , wobei Book die Domainklasse und Long der Typ Id ist. Wir deklarieren drei Abfragemethoden in unserem Repository, für die im Hintergrund automatisch Implementierungen generiert werden.

Die erste ist findByAuthor. Wie Sie erraten haben, wird durch die Implementierung eine Abfrage ausgeführt, bei der ein vom Nutzer angegebener Wert im Bedingungsfilter verwendet wird, um das Feld „Gleichheitszeichen“ zu erstellen.

Die Methode findByYearGreaterThan führt eine Abfrage aus, mit der nach dem Feld für das Jahr gefiltert wird, 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 „author“ und „year“ mit von Nutzern angegebenen Werten übereinstimmen.

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

Datenspeicher-beispiel/src/main/java/com/beispiel/demo/Demo-Anwendung.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();
  }
}

Sehen Sie sich an, wie wir die Klasse mit @ShellComponent annotiert haben. Dadurch wird Spring darüber informiert, dass wir diese Klasse als Quelle für Befehlszeilenbefehle verwenden möchten. Die mit @ShellMethod gekennzeichneten Methoden werden in unserer Anwendung als Befehlszeilenbefehle angezeigt.

Hier verwenden wir die von uns in der BookRepository-Oberfläche deklarierten Methoden: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. Außerdem nutzen wir drei integrierte Methoden: save, findAll und deleteAll.

Sehen wir uns die Methode saveBook an. Wir erstellen ein Book-Objekt mit von Nutzern übermittelten Werten für den Titel, den Autor und das Jahr. Wie Sie sehen, wird kein id-Wert angegeben. Er wird daher beim Speichern automatisch dem ID-Feld zugewiesen. Die Methode save akzeptiert ein Objekt vom Typ Book und speichert es in Cloud Datastore. Es wird ein Book-Objekt mit allen ausgefüllten Feldern zurückgegeben, einschließlich des Felds id. Am Ende wird eine Stringdarstellung dieses Objekts zurückgegeben.

Die restlichen Methoden funktionieren ähnlich: Sie akzeptieren Parameter, die an die entsprechenden Repository-Methoden übergeben werden, und geben String-Ergebnisse zurück.

Führen Sie zum Erstellen und Starten der Anwendung den folgenden Befehl in Cloud Shell aus (vom Stammverzeichnis des Projekts datastore-example/, in dem sich der pom.xml befindet) :

$ mvn spring-boot:run

Nach einer erfolgreichen Build-Phase wird das Frühlings-Logo und die Shell-Eingabeaufforderung angezeigt:

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)


shell:> 

Sie können jetzt mit den zuvor definierten Befehlen experimentieren. Verwenden Sie den Befehl „help“, um die Liste der Befehle aufzurufen:

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>

Geben Sie Folgendes ein:

  1. Erstellen Sie mit dem Befehl save-book ein paar Bücher.
  2. Führen Sie eine Suche mit dem Befehl find-all-books aus.
  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 bestimmten Autoren und Jahren suchen (find-by-author-year <author> <year>)

Wenn Sie wissen möchten, wie die Entitäten in Cloud Datastore gespeichert werden, rufen Sie die GCP Console auf und gehen Sie zu Menü -> Datastore (im Abschnitt „Speicher“) -> Entitäten (wählen Sie gegebenenfalls „"[default]&namespace“ und „quot;books“ aus).

Zum Bereinigen entfernen Sie alle Bücher mit dem Befehl „apt_name“ remove-all-booksaus der Shell der Anwendung.

shell:> remove-all-books

Beenden Sie die Anwendung, indem Sie den Befehl „quit“ und dann Strg + C drücken.

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

Weitere Informationen

Lizenz

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