Informationen zu diesem Codelab
1. Übersicht
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
Wie werden Sie diese Anleitung verwenden?
Wie würdest du deine Erfahrung mit der Nutzung der Google Cloud Platform-Dienste bewerten?
2. Einrichtung und Anforderungen
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:
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].
3. Cloud Datastore initialisieren
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“:
4. Boottrap eine neue Spring-Boot-Java-Anwendung
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>
5. Buchklasse erstellen
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.
6. BookRepository-Schnittstelle erstellen
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.
7. Interaktive Befehlszeile erstellen
Ö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.
8. Anwendung ausführen
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:
- Erstellen Sie mit dem Befehl
save-book
ein paar Bücher. - Führen Sie eine Suche mit dem Befehl
find-all-books
aus. - Bücher von einem bestimmten Autor suchen (
find-by-author <author>
) - Bücher suchen, die nach einem bestimmten Jahr veröffentlicht wurden (
find-by-year-after <year>
) - Bücher nach bestimmten Autoren und Jahren suchen (
find-by-author-year <author> <year>
)
9. Gespeicherte Daten in Datastore über die Weboberfläche
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).
10. Bereinigen
Zum Bereinigen entfernen Sie alle Bücher mit dem Befehl „apt_name“ remove-all-books
aus der Shell der Anwendung.
shell:> remove-all-books
Beenden Sie die Anwendung, indem Sie den Befehl „quit“ und dann Strg + C drücken.
11. Glückwunsch!
In diesem Codelab haben Sie eine interaktive Befehlszeile erstellt, mit der Objekte aus Cloud Datastore gespeichert und abgerufen werden können.
Weitere Informationen
- Cloud Datastore: https://cloud.google.com/Datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Spring auf dem GCP-Projekt: http://cloud.spring.io/spring-cloud-gcp/
- Spring auf der GCP GitHub-Repository: https://github.com/spring-cloud/spring-cloud-gcp
- Java auf Google Cloud Platform: https://cloud.google.com/java/
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.