Aplikacja wiosennego uruchamiania w Cloud Datastore

Aplikacja wiosennego uruchamiania w Cloud Datastore

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: lut 10, 2020
account_circleDokument stworzony przez pracownika Google

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

  • Projekt Google Cloud Platform
  • Przeglądarka, na przykład Chrome lub Firefox.

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:

Zrzut ekranu z 10 września 2016 r., 12:45:26.png

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:

  1. Utwórz kilka książek za pomocą polecenia save-book
  2. Wyszukiwanie za pomocą polecenia find-all-books
  3. Znajdź książki określonych autorów (find-by-author <author>)
  4. Znajdowanie książek opublikowanych po konkretnym roku (find-by-year-after <year>)
  5. 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

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.