แอปพลิเคชัน Spring Boot ที่มี Cloud Datastore

แอปพลิเคชัน Spring Boot ที่มี Cloud Datastore

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ก.พ. 10, 2020
account_circleเขียนโดย Googler

1 ภาพรวม

Google Cloud Datastore เป็นฐานข้อมูลเอกสาร NoSQL ที่สร้างขึ้นสําหรับการปรับขนาดอัตโนมัติ ประสิทธิภาพสูง และความสะดวกในการพัฒนาแอปพลิเคชัน

สิ่งที่จะได้เรียนรู้

  • วิธีใช้ Cloud Datastore เพื่อบันทึกและเรียกข้อมูลออบเจ็กต์ Java ใน Spring Boot

สิ่งที่ต้องมี

  • โครงการ Google Cloud Platform
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox

คุณจะใช้บทแนะนํานี้อย่างไร

คุณจะให้คะแนนประสบการณ์ในการใช้บริการของ Google Cloud Platform อย่างไร

2 การตั้งค่าและข้อกําหนด

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

โปรดทราบว่ารหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ํากันสําหรับโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อข้างต้นมีผู้อื่นนําไปใช้แล้ว ขออภัยในความไม่สะดวก) และจะเรียกใน Codelab นี้ว่า PROJECT_ID ในภายหลัง

จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากรของ Google Cloud

การเรียกใช้ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่อาจมากกว่านั้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทํางาน (ดู "cleanup" ในตอนท้ายของเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์รับช่วงทดลองใช้ฟรี $300

เปิดใช้งาน Google Cloud Shell

จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบน ดังนี้

จากนั้นคลิก "เริ่ม Cloud Shell"

ระบบจะใช้เวลาเพียงครู่เดียวในการจัดสรรและเชื่อมต่อกับสภาพแวดล้อม

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหน้าแรกขนาด 5 GB ถาวรและทํางานอยู่ใน Google Cloud ซึ่งช่วยปรับปรุงประสิทธิภาพและการตรวจสอบสิทธิ์ของเครือข่ายได้อย่างมาก ไม่เพียงเท่านั้น งานของคุณในห้องทดลองนี้ก็ทําได้โดยใช้เพียงเบราว์เซอร์หรือ Google Chromebook

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ระบบจะตรวจสอบว่าคุณตรวจสอบสิทธิ์แล้ว และมีการตั้งค่าโปรเจ็กต์เป็น PROJECT_ID แล้ว

เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์

gcloud auth list

เอาต์พุตจากคําสั่ง

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

เอาต์พุตจากคําสั่ง

[core]
project = <PROJECT_ID>

หากไม่ใช่ คุณจะตั้งค่าได้โดยใช้คําสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตจากคําสั่ง

Updated property [core/project].

3 เริ่มต้น Cloud Datastore

ในคอนโซล GCP ให้ไปที่เมนู -> Datastore (ในส่วนพื้นที่เก็บข้อมูล)

หากไม่เคยใช้ Datastore ในโปรเจ็กต์ปัจจุบัน คุณจะเห็นหน้าจอ "Select a Cloud Firestore Mode" เลือกตัวเลือก "Datastore Mode"

หลังจากนั้น คุณจะเห็นหน้าจอ "เลือกตําแหน่งที่จะจัดเก็บข้อมูลของคุณ เลือก us-east1 หรือตําแหน่งอื่นๆ ในภูมิภาคแล้วคลิก "Create Database":

4 เริ่มต้นแอปพลิเคชัน Java Spring Boot ใหม่

จากสภาพแวดล้อม CloudShell ให้ใช้คําสั่งต่อไปนี้เพื่อเริ่มต้นและเปิดเครื่องแอปพลิเคชัน Spring Boot ใหม่

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

การดําเนินการนี้จะสร้างไดเรกทอรี datastore-example/ ใหม่ที่มีโปรเจ็กต์ Maven ใหม่ รวมถึง Maven' pom.xml, Wrapper ของ Maven รวมถึงจุดแรกเข้าของแอปพลิเคชัน

แอปพลิเคชันของเราจะให้ CLI แก่ผู้ใช้ในการป้อนคําสั่งและดูผลลัพธ์ เราจะสร้างชั้นเรียนให้แสดงถึงหนังสือ จากนั้นจะบันทึกลงใน Cloud Datastore โดยใช้ Datastore Repository

นอกจากนี้ เรายังจําเป็นต้องเพิ่มทรัพยากร Dependency ที่จําเป็นอีก 1 รายการไปยัง pom.xml ด้วย

เปิดเครื่องมือแก้ไขรหัสเว็บโดยคลิกเปิดตัวแก้ไขโค้ดจากเมนู Cloud Shell

หลังจากที่ตัวแก้ไขโหลดขึ้นมาแล้ว ให้แก้ไขไฟล์ pom.xml เพื่อเพิ่มทรัพยากร Dependency สําหรับ Spring Data Cloud Datastore Spring Starter โดยทําดังนี้

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 สร้างคลาสหนังสือ

สร้างคลาส Book ด้วยตัวแก้ไขที่มีเนื้อหาต่อไปนี้

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

จะเห็นว่านี่คือ POJO ง่ายๆ ชั้นเรียนจะมีคําอธิบายประกอบด้วย @Entity เพื่อระบุว่าจะจัดเก็บใน Datastore และระบุชื่อประเภทได้ (ให้คิดว่าเป็นตารางในฐานข้อมูล SQL โปรดดูรายละเอียดเพิ่มเติมที่เอกสารประกอบ) ชื่อประเภทเป็นข้อมูลเสริม ถ้าไม่ระบุไว้ ระบบจะสร้างชื่อประเภทตามชื่อชั้นเรียน

โปรดทราบว่าเราใส่คําอธิบายประกอบ id รายการที่มี @Id ซึ่งหมายความว่าเราต้องการใช้ช่องนี้เป็นส่วนหนึ่งของตัวระบุของคีย์ Datastore เอนทิตี Datastore ทั้งหมดต้องมีตัวระบุ ประเภทที่รองรับคือ String และ Long

เราลบล้างเมธอด toString เพื่อให้การแสดงแทนสตริงของวัตถุอ่านได้ง่ายขึ้น ซึ่งจะเป็นประโยชน์เมื่อพิมพ์วัตถุออกมา

อย่าลืมบันทึกไฟล์

6 สร้างอินเทอร์เฟซ BookRepository

สร้างชั้นเรียน BookRepository ด้วยเนื้อหาต่อไปนี้

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

}

อินเทอร์เฟซจะขยาย DatastoreRepository<Book, Long> โดยที่ Book คือคลาสโดเมน และ Long เป็นประเภท Id เราประกาศวิธีการสืบค้น 3 วิธีในที่เก็บซึ่งระบบสร้างการติดตั้งใช้งานขึ้นมาโดยอัตโนมัติในเบื้องหลัง

อันแรกคือ findByAuthor ขณะที่คุณเดา การติดตั้งใช้งานวิธีการนี้จะเรียกใช้คําค้นหาที่จะใช้ค่าที่ผู้ใช้ให้ไว้ในตัวกรองเงื่อนไขเพื่อให้เกิดความเท่าเทียมกับช่องผู้เขียน

เมธอด findByYearGreaterThan จะดําเนินการกับคําค้นหาที่กรองในช่องปีมากกว่าค่าที่ผู้ใช้ระบุ

findByAuthorAndYear จะทําการค้นหาที่ค้นหาเอนทิตีที่มีช่องผู้เขียนและปีตรงกับค่าที่ผู้ใช้ระบุ

7 สร้างแอปพลิเคชัน CLI แบบอินเทอร์แอกทีฟ

เปิดคลาสหลักของแอปพลิเคชัน DemoApplication แล้วแก้ไขให้มีลักษณะดังนี้

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

โปรดสังเกตวิธีที่เราใช้คําอธิบายประกอบกับ @ShellComponent ในชั้นเรียน แจ้ง Spring ว่าต้องการใช้คลาสนี้เป็นแหล่งที่มาของคําสั่ง CLI เมธอดที่มีคําอธิบายประกอบ @ShellMethod จะแสดงในคําสั่ง CLI ในแอปพลิเคชันของเรา

ในที่นี้เราจะใช้วิธีการที่ประกาศในอินเทอร์เฟซ BookRepository: findByAuthor, findByYearGreaterThan, findByAuthorAndYear นอกจากนี้ เรายังมีวิธีในตัว 3 วิธี ได้แก่ save, findAll และ deleteAll

มาดูวิธีการ saveBook กัน เราสร้างออบเจ็กต์ Book โดยใช้ค่าที่ผู้ใช้ให้ไว้สําหรับชื่อ ผู้แต่ง และปี ดังที่เห็นว่าเราไม่ได้ระบุค่า id เพื่อที่ระบบจะจัดสรรและให้สิทธิ์แก่ช่องรหัสโดยอัตโนมัติเมื่อบันทึก เมธอด save จะยอมรับออบเจ็กต์ประเภท Book และบันทึกลงใน Cloud Datastore โดยจะแสดงออบเจ็กต์ Book ซึ่งมีการป้อนข้อมูลทุกช่อง รวมถึงช่อง id ด้วย และสุดท้ายเราจะแสดงสตริงสตริงของออบเจ็กต์นี้

วิธีการที่เหลือจะทํางานคล้ายกัน โดยยอมรับพารามิเตอร์ที่ผ่านไปยังวิธีการจัดเก็บที่เหมาะสมและแสดงผลลัพธ์แบบสตริง

8 เรียกใช้แอปพลิเคชัน

หากต้องการสร้างและเริ่มต้นแอปพลิเคชัน ให้เรียกใช้คําสั่งนี้ใน Cloud Shell (จากรากของโปรเจ็กต์ datastore-example/ ที่มี pom.xml อยู่) :

$ mvn spring-boot:run

หลังขั้นตอนบิลด์เสร็จสมบูรณ์ โลโก้ช่วงฤดูใบไม้ผลิจะปรากฏขึ้นและข้อความแจ้งของเปลือกหอยจะปรากฏขึ้น

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)


shell:> 

ตอนนี้คุณสามารถทดสอบกับคําสั่งที่เรากําหนดไว้ก่อนหน้านี้ได้ หากต้องการดูรายการคําสั่ง ให้ใช้คําสั่งช่วยเหลือ ดังนี้

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>

ลองทำตามขั้นตอนต่อไปนี้

  1. สร้างหนังสือ 2-3 เล่มโดยใช้คําสั่ง save-book
  2. ทําการค้นหาโดยใช้คําสั่ง find-all-books
  3. ค้นหาหนังสือตามผู้เขียนที่ต้องการ (find-by-author <author>)
  4. ค้นหาหนังสือที่เผยแพร่หลังจากปีที่ต้องการ (find-by-year-after <year>)
  5. ค้นหาหนังสือตามผู้เขียนและปีที่ต้องการ (find-by-author-year <author> <year>)

9 ดูสิ่งที่เก็บไว้ใน Datastore โดยใช้อินเทอร์เฟซบนเว็บ

หากต้องการดูวิธีจัดเก็บเอนทิตีใน Cloud Datastore ให้ไปที่คอนโซล GCP และไปที่เมนู -> Datastore (ในส่วนพื้นที่เก็บข้อมูล) -> เอนทิตี (เลือก "[default]"เนมสเปซ และ "books" หากจําเป็น)

10 ล้างข้อมูล

หากต้องการล้างข้อมูล ให้นําหนังสือทั้งหมดออกโดยใช้คําสั่ง remove-all-books ที่ชื่อที่ปรับแล้วจาก Shell ของแอปพลิเคชัน

shell:> remove-all-books

หากต้องการออกจากแอปพลิเคชัน ให้ใช้คําสั่ง Ctrl แล้วกด Ctrl+C

11 ยินดีด้วย

ใน Codelab นี้ คุณได้สร้างแอปพลิเคชัน CLI แบบอินเทอร์แอกทีฟที่จัดเก็บและเรียกข้อมูลวัตถุจาก Cloud Datastore ได้

ดูข้อมูลเพิ่มเติม

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตทั่วไปของ Creative Commons Attribution 2.0