เกี่ยวกับ Codelab นี้
1 ภาพรวม
Google Cloud Datastore เป็นฐานข้อมูลเอกสาร NoSQL ที่สร้างขึ้นสําหรับการปรับขนาดอัตโนมัติ ประสิทธิภาพสูง และความสะดวกในการพัฒนาแอปพลิเคชัน
สิ่งที่จะได้เรียนรู้
- วิธีใช้ Cloud Datastore เพื่อบันทึกและเรียกข้อมูลออบเจ็กต์ Java ใน Spring Boot
สิ่งที่ต้องมี
คุณจะใช้บทแนะนํานี้อย่างไร
คุณจะให้คะแนนประสบการณ์ในการใช้บริการของ Google Cloud Platform อย่างไร
2 การตั้งค่าและข้อกําหนด
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้
โปรดทราบว่ารหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ํากันสําหรับโปรเจ็กต์ 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>
ลองทำตามขั้นตอนต่อไปนี้
- สร้างหนังสือ 2-3 เล่มโดยใช้คําสั่ง
save-book
- ทําการค้นหาโดยใช้คําสั่ง
find-all-books
- ค้นหาหนังสือตามผู้เขียนที่ต้องการ (
find-by-author <author>
) - ค้นหาหนังสือที่เผยแพร่หลังจากปีที่ต้องการ (
find-by-year-after <year>
) - ค้นหาหนังสือตามผู้เขียนและปีที่ต้องการ (
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 ได้
ดูข้อมูลเพิ่มเติม
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Spring ในโปรเจ็กต์ GCP: http://cloud.spring.io/spring-cloud-gcp/
- ฤดูใบไม้ผลิบนที่เก็บ GitHub ของ GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java ใน Google Cloud Platform: https://cloud.google.com/java/
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตทั่วไปของ Creative Commons Attribution 2.0