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
Wie möchten Sie diese Anleitung nutzen?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud Platform-Diensten bewerten?
<ph type="x-smartling-placeholder">2. Einrichtung und Anforderungen
Umgebung für das selbstbestimmte Lernen einrichten
- 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.
- 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.
- 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
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren .
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.
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.
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.
- 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`
- 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.
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":
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.
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:
- Mit dem Befehl
save-book
einige Bücher erstellen - Suche mit dem Befehl
find-all-books
ausführen - 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 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.
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
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Spring on GCP-Projekt: https://spring.io/projects/spring-cloud-gcp
- GitHub-Repository von Spring auf GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java auf der Google Cloud Platform: https://cloud.google.com/java/
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.