Aplikacja Spring Boot korzystająca z Cloud Datastore

1. Omówienie

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 Boot

Czego potrzebujesz

  • Projekt Google Cloud Platform
  • przeglądarkę, np. Chrome lub Firefox;

Jak wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje wrażenia z korzystania z usług Google Cloud Platform?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

9f0e51b578fecce5.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Inicjowanie Cloud Datastore

W konsoli GCP otwórz Menu -> Datastore (w sekcji Przechowywanie danych) lub kliknij tutaj.

Jeśli w bieżącym projekcie nie używano usługi Datastore, zobaczysz ekran „Wybierz tryb Cloud Firestore”. Wybierz opcję „Tryb magazynu danych”.

f938295c7ff297f4.png

Gdy to zrobisz, pojawi się ekran „Wybierz, gdzie chcesz zapisywać dane”. Wybierz lokalizację us-east1 lub inną lokalizację regionalną i kliknij „Utwórz bazę danych”:

916ac84fec10fae7.png

4. Wczytywanie nowej aplikacji Spring Boot w Javie

W środowisku CloudShell użyj tego polecenia, aby zainicjować i wczytać nową aplikację Spring Boot:

$ 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 -

Spowoduje to utworzenie nowego katalogu datastore-example/ z nowym projektem Maven, a także pom.xml Maven, kod Maven i punkt wejścia aplikacji.

Nasza aplikacja udostępni interfejs wiersza poleceń, aby użytkownicy mogli wpisywać polecenia i wyświetlać wyniki. Utworzymy klasę reprezentującą książkę, a następnie zapiszemy ją w Cloud Datastore za pomocą repozytorium Datastore.

Musimy też dodać do tego elementu pom.xml jeszcze jedną niezbędną zależność.

Otwórz edytor kodu internetowego, klikając Otwórz edytor w menu Cloud Shell.

6d823258c76a7452.png

Po załadowaniu edytora zmodyfikuj plik pom.xml, aby dodać zależności Google Cloud Datastore Starter i Spring Shell Starter:

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. Tworzenie zajęć związanych z książką

W edytorze utwórz klasę Book z tą zawartością:

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 +
        '}';
  }
}

Jak widać, jest to prosty model POJO. Klasa jest oznaczona adnotacją @Entity wskazującą, że można ją zapisać w Datastore, i podaje nazwę rodzaju (pomyśl o rodzaju jako tabeli w bazach danych SQL. Więcej informacji znajdziesz w dokumentacji). Nazwa rodzaju jest opcjonalna – jeśli jej pominiesz, nazwa rodzaju zostanie wygenerowana na podstawie nazwy klasy.

Do właściwości id dodaliśmy adnotację @Id. Oznacza to, że chcemy, aby to pole było używane jako część identyfikatora klucza Datastore. Każda encja Datastore wymaga identyfikatora. Obsługiwane typy to String i Long.

Zastępujemy metodę toString, aby reprezentacja obiektów w ciągu znaków była bardziej czytelna. będą przydatne do wydrukowania.

6. Tworzenie interfejsu BookRepository

Utwórz zajęcia BookRepository z tą zawartością:

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);
}

Rozszerza interfejs DatastoreRepository<Book, Long>, gdzie Book jest klasą domeny, a Long to typ Id. W naszym repozytorium deklarujemy 3 metody zapytań, dla których implementacje są generowane automatycznie.

Pierwsza to findByAuthor. Jak łatwo się domyślić, implementacja tej metody spowoduje uruchomienie zapytania, które użyje wartości podanej przez użytkownika w filtrze warunku „równość względem autora”.

Metoda findByYearGreaterThan wykonuje zapytanie, które odfiltrowuje pole roku z wartością większą niż wartość podana przez użytkownika.

findByAuthorAndYear wykonuje zapytanie, które wyszukuje encje, w których pola autora i roku są zgodne z wartościami podanymi przez użytkownika.

7. Tworzenie interaktywnej aplikacji interfejsu wiersza poleceń

Otwórz klasę DemoApplication aplikacji głównej i zmodyfikuj ją tak, aby wyglądała tak:

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ę na to, jak otrzymywaliśmy adnotacje do zajęć za pomocą funkcji @ShellComponent. To informuje Spring, że chcemy użyć tej klasy jako źródła poleceń interfejsu wiersza poleceń. Metody opisane przy użyciu @ShellMethod będą widoczne w naszej aplikacji jako polecenia interfejsu wiersza poleceń.

Tutaj używamy metod zadeklarowanych w interfejsie BookRepository: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. Używamy też 3 metod wbudowanych: save, findAll i deleteAll.

Przyjrzyjmy się metodzie saveBook. Tworzymy obiekt Book za pomocą wartości podanych przez użytkownika dotyczących tytułu, autora i roku. Jak widać, nie podajemy wartości id, więc zostanie ona automatycznie przydzielona i przypisana do pola id po zapisaniu. Metoda save akceptuje obiekt typu Book i zapisuje go w Cloud Datastore. Zwraca obiekt Book z wypełnionymi wszystkimi polami, w tym polem id. Na koniec zwracamy obiekt w postaci ciągu.

Pozostałe metody działają podobnie: akceptują parametry przekazywane w postaci parametrów do odpowiednich metod repozytorium i zwracają wyniki w postaci ciągów znaków.

8. Uruchamianie aplikacji

Aby skompilować i uruchomić aplikację, najpierw upewnij się, że dla środowiska JAVA_HOME jest ustawiona prawidłowa wersja:

$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Wykonaj to polecenie w Cloud Shell (z poziomu głównego projektu datastore-example/, w którym znajduje się pom.xml):

$ ./mvnw spring-boot:run
export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Po pomyślnym etapie kompilacji pojawi się logo wiosny i prompt powłoki:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.5)



shell:>

Teraz można poeksperymentować ze zdefiniowanymi wcześniej poleceniami. 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>

Wykonaj te czynności:

  1. Utwórz kilka książek za pomocą polecenia save-book
  2. Przeprowadzanie wyszukiwania za pomocą polecenia find-all-books
  3. Znajdź książki konkretnego autora: find-by-author <author>
  4. Znajdź książki opublikowane po określonym roku: find-by-year-after <year>
  5. Znajdź książki według autora i roku: find-by-author-year <author> <year>

9. Zobacz, co jest przechowywane w Datastore, korzystając z interfejsu internetowego

Aby sprawdzić, jak encje są przechowywane w Cloud Datastore, otwórz konsolę GCP. Wpisz „książki” w polu rodzaju, jeśli jest to konieczne.

5fab21a6c89f45a.png

10. Czyszczenie danych

Aby wyczyścić dane, usuń wszystkie książki za pomocą polecenia remove-all-books o prawidłowej nazwie z powłoki aplikacji.

shell:> remove-all-books

Aby zamknąć aplikację, użyj polecenia Zakończ, a następnie Ctrl+C.

11. Gratulacje!

Dzięki tym ćwiczeniom w programie udało Ci się utworzyć interaktywną aplikację interfejsu wiersza poleceń, która może przechowywać i pobierać obiekty Cloud Datastore.

Więcej informacji

Licencja

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