Informacje o tym ćwiczeniu (w Codelabs)
1. Opis
Google Cloud Datastore to baza danych dokumentów NoSQL zaprojektowana pod kątem automatycznego skalowania, wysokiej wydajności i łatwego tworzenia aplikacji.
Czego się nauczysz:
- Jak używać Cloud Datastore do zapisywania i pobierania obiektów Java w Spring rozruchu
Czego potrzebujesz
Jak będziesz korzystać z tego samouczka?
Jak oceniasz korzystanie z usług Google Cloud Platform?
2. Konfiguracja i wymagania
Konfiguracja środowiska we własnym tempie
Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:
Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID
.
Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.
Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).
Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartości 300 USD.
Aktywuj Google Cloud Shell
W konsoli GCP kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:
Następnie kliknij "Uruchom Cloud Shell"
Udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil:
Ta maszyna wirtualna jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Znaczna część (lub nawet całość) zadań wykonywanych w tym module można wykonać w przeglądarce lub na Chromebooku Google.
Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt i masz już ustawiony identyfikator PROJECT_ID.
Uruchom następujące polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list
Polecenie wyjściowe
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Polecenie wyjściowe
[core] project = <PROJECT_ID>
Jeśli nie, możesz ustawić ją za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Polecenie wyjściowe
Updated property [core/project].
3. Inicjowanie Cloud Datastore
W konsoli GCP wybierz Menu -> Datastore (w sekcji Pamięć).
Jeśli w bieżącym projekcie nigdy nie zdarzyło Ci się korzystać z Datastore, zobaczysz ekran "Wybierz tryb Cloud Firestore. Wybierz opcję "Datastore mode".
Potem zobaczysz ekran "Wybierz, gdzie chcesz przechowywać swoje dane. Wybierz us-east1 lub inną lokalizację regionalną i kliknij „Utwórz bazę danych”.
4. Uruchom nową aplikację Spring rozruchu Java
Aby uruchomić i uruchomić nową aplikację Spring rozruchu w środowisku CloudShell, wykonaj następujące polecenie:
$ 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 -
Zostanie utworzony nowy katalog datastore-example/
z nowym projektem Maven wraz z kodem pom.xml
Maven i kodem towarzyszącym Maven, a także punktem wejścia aplikacji.
Nasza aplikacja udostępnia interfejs wiersza poleceń, który umożliwia użytkownikom wpisywanie poleceń i wyświetlanie wyników. Utworzymy klasę do reprezentowania książki, a następnie zapiszemy ją w Cloud Datastore przy użyciu repozytorium Datastore.
Musimy też dodać jeszcze jedną wymaganą zależność od pom.xml
.
Otwórz edytor kodu internetowego, klikając Uruchom edytor kodu z menu Cloud Shell.
Po wczytaniu edytora zmodyfikuj plik pom.xml
, aby dodać zależność między początekem uruchamiania wiosennego uruchamiania Cloud Datastore:
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. Tworzenie klasy książki
W edytorze utwórz klasę Book
z tą treścią:
datastore-example/src/main/java/com/example/demo/książka.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 +
'}';
}
}
Jak widać, jest to prosty PRÓJ. Klasa ma adnotacje @Entity
, co oznacza, że można ją zapisać w Datastore i podać jej nazwę (rodzaj tabeli w bazach danych SQL). Więcej informacji znajdziesz w dokumentacji). Nazwa rodzaju jest opcjonalna – jeśli zostanie pominięta, nazwa zostanie wygenerowana na podstawie nazwy klasy.
Pamiętaj, że element id
jest oznaczony jako @Id
. Oznacza to, że chcemy, aby to pole było używane jako część identyfikatora klucza Datastore. Każdy element Datastore potrzebuje identyfikatora. Obsługiwane typy to String
i Long
.
Zastąpimy metodę toString
, by zwiększyć czytelność obiektów w postaci ciągu. Przydaje się to podczas ich drukowania.
Nie zapomnij zapisać pliku.
6. Tworzenie interfejsu BookRepository
Utwórz klasę BookRepository
o tej treści:
datastore-example/src/main/java/com/example/demo/BookRepository.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);
}
Interfejs rozszerza się o DatastoreRepository<Book, Long>
, gdzie Book
to klasa domeny, a Long
to typ Id
. W naszym repozytorium deklarujemy 3 metody zapytań, dla których implementacje są generowane automatycznie.
Pierwsza to findByAuthor
. Jak można się domyślić, implementacja tej metody uruchomi zapytanie, które będzie używać wartości podanej przez użytkownika w filtrze warunku w celu równości między autorami.
Metoda findByYearGreaterThan
wykonuje zapytanie, które filtruje pole roku o wartości wyższej niż podana przez użytkownika.
findByAuthorAndYear
wykonuje zapytanie wyszukujące elementy, w których pola autora i roku pasują do wartości podanych przez użytkownika.
7. Utwórz interaktywną aplikację wiersza poleceń
Otwórz główną klasę aplikacji DemoApplication
i zmodyfikuj ją w następujący sposób:
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();
}
}
Zwróć uwagę, jak dodaliśmy klasy do @ShellComponent
. Dzięki temu Spring otrzyma dostęp do tej klasy jako źródła poleceń interfejsu wiersza poleceń. Metody z adnotacją @ShellMethod
będą widoczne w naszej aplikacji jako polecenia interfejsu wiersza poleceń.
Tutaj stosujemy metody zadeklarowane w interfejsie BookRepository: findByAuthor
, findByYearGreaterThan
, findByAuthorAndYear
. Używamy też 3 wbudowanych metod: save
, findAll
i deleteAll
.
Spójrzmy na metodę saveBook
. Tworzysz obiekt Book
na podstawie podanych przez użytkownika wartości tytułu, autora i roku. Jak widać, nie podajemy wartości id
, więc zostanie ona automatycznie przypisana i przypisana do pola id podczas zapisywania. Metoda save
akceptuje obiekt typu Book
i zapisuje go w Cloud Datastore. Zwraca obiekt Book
ze wszystkimi wypełnionymi polami, w tym z polem id
. Na końcu zwracamy ciąg znaków reprezentujący ten obiekt.
Pozostałe metody działają podobnie: akceptują parametry przekazywane do odpowiednich metod repozytorium i zwracają wyniki skończone.
8. Uruchamianie aplikacji
Aby skompilować i uruchomić aplikację, wykonaj to polecenie w Cloud Shell (z poziomu głównego projektu datastore-example/
, w którym znajduje się pom.xml
) :
$ mvn spring-boot:run
Po udanym etapie kompilacji pojawi się logo wiosny. Wyświetli się też okienko powłoki:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) shell:>
Teraz możesz poeksperymentować z poleceniami, które już zdefiniowaliśmy. Aby wyświetlić listę poleceń, użyj polecenia pomocy:
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>
Wypróbuj te rozwiązania:
- Utwórz kilka książek za pomocą polecenia
save-book
- Wyszukiwanie za pomocą polecenia
find-all-books
- Znajdź książki określonych autorów (
find-by-author <author>
) - Znajdowanie książek opublikowanych po konkretnym roku (
find-by-year-after <year>
) - Znajdź książki określonego autora i roku (
find-by-author-year <author> <year>
)
9. Zobacz, co jest zapisane w Datastore za pomocą interfejsu internetowego
Aby zobaczyć, jak jednostki są przechowywane w Cloud Datastore, otwórz konsolę GCP i wybierz Menu -> Datastore (w sekcji Pamięć) -> Encje (wybierz &&tt;[wartość domyślna]" przestrzeń nazw i &&tt;książki"rodzaj, jeśli to konieczne).
10. Czyszczenie danych
Aby wyczyścić dane, usuń wszystkie książki przy użyciu polecenia o nazwie remove-all-books
z powłoki aplikacji.
shell:> remove-all-books
Aby zamknąć aplikację, użyj polecenia Zakończ, a potem Ctrl+C.
11. Gratulacje!
W tym ćwiczeniu z programowania udało Ci się utworzyć interaktywną aplikację wiersza poleceń, w której możesz zapisywać i pobierać obiekty z Cloud Datastore.
Więcej informacji
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Wiosna w projekcie GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring w repozytorium GCP na GitHubie: https://github.com/spring-cloud/spring-cloud-gcp
- Java w Google Cloud Platform: https://cloud.google.com/java/
Licencja
To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.