Google Cloud Datastore adalah database dokumen NoSQL yang dibuat untuk penskalaan otomatis, performa tinggi, dan kemudahan pengembangan aplikasi.
Yang akan Anda pelajari
- Cara menggunakan Cloud Datastore untuk menyimpan dan mengambil objek java di Spring Boot
Yang Anda butuhkan
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?
Penyiapan lingkungan mandiri
Jika belum memiliki Akun Google (Gmail atau Google Apps), Anda harus membuatnya. Login ke Google Cloud Platform console (console.cloud.google.com) dan buat project baru:
Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID
.
Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource Google Cloud.
Menjalankan melalui codelab ini tidak akan menghabiskan biaya lebih dari beberapa dolar, tetapi bisa lebih jika Anda memutuskan untuk menggunakan lebih banyak resource atau jika Anda membiarkannya berjalan (lihat bagian "pembersihan" di akhir dokumen ini).
Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai$300.
Mengaktifkan Google Cloud Shell
Dari Konsol GCP, klik ikon Cloud Shell di toolbar kanan atas:
Kemudian, klik "Start Cloud Shell":
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan:
Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser atau Google Chromebook.
Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke PROJECT_ID Anda.
Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
Output perintah
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Output perintah
[core] project = <PROJECT_ID>
Jika tidak, Anda dapat menyetelnya dengan perintah ini:
gcloud config set project <PROJECT_ID>
Output perintah
Updated property [core/project].
Di GCP Console, buka Menu -> Datastore (di bagian Storage).
Jika belum pernah menggunakan Datastore dalam project saat ini, Anda akan melihat layar "Pilih mode Cloud Firestore". Pilih opsi "Mode Datastore".
Setelah itu, Anda akan melihat layar "Pilih lokasi untuk menyimpan data Anda". Pilih us-east1 atau lokasi regional lainnya, lalu klik "Create Database":
Dari lingkungan Cloud Shell, gunakan perintah berikut untuk melakukan inisialisasi dan bootstrap aplikasi Spring Boot baru:
$ 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 -
Tindakan ini akan membuat direktori datastore-example/
baru dengan project Maven baru, beserta pom.xml
Maven, wrapper Maven, serta titik entri aplikasi.
Aplikasi kita akan menyediakan CLI bagi pengguna untuk memasukkan perintah dan melihat hasilnya. Kita akan membuat class untuk merepresentasikan buku, lalu menyimpannya ke Cloud Datastore menggunakan Datastore Repository.
Kita juga perlu menambahkan satu lagi dependensi yang diperlukan ke pom.xml
.
Buka Editor Kode Web dengan mengklik Launch code editor dari menu Cloud Shell.
Setelah editor dimuat, ubah file pom.xml
untuk menambahkan dependensi Spring Boot starter Spring Data 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>
Menggunakan editor, buat class Book
dengan konten berikut:
datastore-example/src/main/java/com/example/demo/Book.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 +
'}';
}
}
Seperti yang dapat Anda lihat, ini adalah POJO sederhana. Class ini diberi anotasi dengan @Entity
untuk menunjukkan bahwa class dapat disimpan di Datastore dan memberikan nama jenis (anggap jenis sebagai tabel di database SQL, lihat dokumentasi untuk mengetahui detail selengkapnya). Nama jenis bersifat opsional - jika tidak ada, nama jenis akan dibuat berdasarkan nama class.
Perhatikan bahwa kami menganotasi properti id
dengan @Id
. Hal ini menunjukkan bahwa kita ingin kolom ini digunakan sebagai bagian ID dari Kunci Datastore. Setiap entity Datastore memerlukan ID. Jenis yang didukung adalah String
dan Long
.
Kita mengganti metode toString
untuk membuat representasi string objek lebih mudah dibaca; hal ini akan berguna saat kita mencetaknya.
Jangan lupa menyimpan file.
Buat class BookRepository
dengan konten berikut:
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);
}
Antarmuka memperluas DatastoreRepository<Book, Long>
dengan Book
adalah class domain dan Long
adalah jenis Id
. Kita mendeklarasikan tiga metode kueri di repositori yang implementasinya dibuat secara otomatis di balik layar.
Yang pertama adalah findByAuthor
. Seperti yang dapat Anda duga, penerapan metode ini akan menjalankan kueri yang akan menggunakan nilai yang diberikan pengguna dalam filter kondisi untuk kesetaraan ke kolom penulis.
findByYearGreaterThan
menjalankan kueri yang memfilter kolom tahun yang lebih besar dari nilai yang diberikan pengguna.
findByAuthorAndYear
menjalankan kueri yang mencari entitas dengan kolom penulis dan tahun yang cocok dengan nilai yang diberikan pengguna.
Buka class aplikasi utama DemoApplication
dan ubah agar terlihat seperti ini:
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();
}
}
Perhatikan cara kita menganotasi class dengan @ShellComponent
. Hal ini memberi tahu Spring bahwa kita ingin menggunakan class ini sebagai sumber untuk perintah CLI. Metode yang dianotasi dengan @ShellMethod
akan diekspos sebagai perintah CLI di aplikasi kita.
Di sini kita menggunakan metode yang dideklarasikan di antarmuka BookRepository: findByAuthor
, findByYearGreaterThan
, findByAuthorAndYear
. Kita juga menggunakan tiga metode bawaan: save
, findAll
, dan deleteAll
.
Mari kita lihat metode saveBook
. Kita membuat objek Book
menggunakan nilai yang diberikan pengguna untuk judul, penulis, dan tahun. Seperti yang dapat Anda lihat, kami tidak memberikan nilai id
, sehingga akan dialokasikan dan ditetapkan secara otomatis ke kolom id saat disimpan. Metode save
menerima objek jenis Book
dan menyimpannya ke Cloud Datastore. Objek Book
yang ditampilkan akan berisi semua kolom yang terisi, termasuk kolom id
. Pada akhirnya, kita menampilkan representasi string dari objek ini.
Metode lainnya bekerja serupa: mereka menerima parameter yang diteruskan ke metode repositori yang sesuai dan menampilkan hasil yang di-stringifikasi.
Untuk mem-build dan memulai aplikasi, jalankan perintah ini di Cloud Shell (dari root project datastore-example/
tempat pom.xml
berada) :
$ mvn spring-boot:run
Setelah tahap build berhasil, logo spring akan muncul dan perintah shell akan ditampilkan:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) shell:>
Sekarang Anda dapat bereksperimen dengan perintah yang kita tentukan sebelumnya. Untuk melihat daftar perintah, gunakan perintah bantuan:
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>
Coba langkah berikut untuk mengatasinya:
- Buat beberapa buku menggunakan perintah
save-book
- Menjalankan penelusuran menggunakan perintah
find-all-books
- Menemukan buku dari penulis tertentu (
find-by-author <author>
) - Menemukan buku yang diterbitkan setelah tahun tertentu (
find-by-year-after <year>
) - Menemukan buku berdasarkan penulis dan tahun tertentu (
find-by-author-year <author> <year>
)
Untuk melihat cara entitas disimpan di Cloud Datastore, buka Konsol GCP dan buka Menu -> Datastore (di bagian Storage) -> Entities (pilih namespace "[default]", dan jenis "books", jika perlu).
Untuk membersihkan, hapus semua buku menggunakan perintah remove-all-books
yang dinamai dengan tepat dari shell aplikasi.
shell:> remove-all-books
Untuk keluar dari aplikasi, gunakan perintah keluar, lalu Ctrl+C.
Dalam codelab ini, Anda telah membuat aplikasi CLI interaktif yang dapat menyimpan dan mengambil objek dari Cloud Datastore.
Pelajari Lebih Lanjut
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Project Spring di GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repositori GitHub Spring on GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java di Google Cloud Platform: https://cloud.google.com/java/
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.