1. ภาพรวม
Google Cloud Datastore เป็นฐานข้อมูลเอกสาร NoSQL ที่สร้างขึ้นมาสำหรับการปรับขนาดอัตโนมัติ โดยมีประสิทธิภาพสูง และพัฒนาแอปพลิเคชันได้อย่างง่ายดาย
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ Cloud Datastore เพื่อบันทึกและเรียกออบเจ็กต์ Java ในการเปิดเครื่อง Spring
สิ่งที่คุณต้องมี
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนความพึงพอใจสำหรับประสบการณ์การใช้บริการ Google Cloud Platform อย่างไร
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตวิธีการชำระเงินได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้ใช้งานหรือไม่ คุณจะเปลี่ยนแปลงหลังจากขั้นตอนนี้ไม่ได้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าเหล่านี้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้จะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่นอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud ใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรี$300 USD
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell จาก Cloud Console
หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก หรืองานส่วนใหญ่ใน Codelab นี้ก็สามารถทำได้ผ่านเบราว์เซอร์
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นข้อความตรวจสอบสิทธิ์และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list
เอาต์พุตจากคำสั่ง
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้เกี่ยวกับโปรเจ็กต์ของคุณ
gcloud config list project
เอาต์พุตจากคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตจากคำสั่ง
Updated property [core/project].
3. เริ่มต้น Cloud Datastore
ในคอนโซล GCP ให้ไปที่เมนู -> Datastore (ในส่วนพื้นที่เก็บข้อมูล) หรือคลิกที่นี่
หากคุณไม่เคยใช้ Datastore ในโปรเจ็กต์ปัจจุบัน คุณจะเห็นหน้าจอ "เลือกโหมด Cloud Firestore" เลือกตัวเลือก "โหมดพื้นที่เก็บข้อมูล"
หลังจากนั้น คุณจะเห็นหน้าจอ "เลือกตำแหน่งที่จะจัดเก็บข้อมูล" เลือก us-east1 หรือตำแหน่งระดับภูมิภาคอื่นๆ แล้วคลิก "สร้างฐานข้อมูล"
4. เปิดเครื่องแอปพลิเคชัน Java สำหรับ Spring Boot ใหม่
จากสภาพแวดล้อม CloudShell ให้ใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นและเปิดเครื่องแอปพลิเคชัน 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 -
การดำเนินการนี้จะสร้างไดเรกทอรี datastore-example/
ใหม่พร้อมด้วยโปรเจ็กต์ Maven ใหม่ รวมถึง pom.xml
ของ Maven, Wrapper ของ Maven และจุดแรกเข้าของแอปพลิเคชัน
แอปพลิเคชันของเราจะมี CLI เพื่อให้ผู้ใช้ป้อนคำสั่งและดูผลลัพธ์ เราจะสร้างคลาสเพื่อแสดงหนังสือ จากนั้นจะบันทึกไปยัง Cloud Datastore โดยใช้ Datastore Repository
นอกจากนี้ เรายังต้องเพิ่มทรัพยากร Dependency ที่จำเป็นอีก 1 รายการใน pom.xml
เปิดตัวแก้ไขโค้ดเว็บโดยคลิกเปิดตัวแก้ไขจากเมนู Cloud Shell
หลังจากโหลดเครื่องมือแก้ไขแล้ว ให้แก้ไขไฟล์ pom.xml
เพื่อเพิ่มทรัพยากร Dependency ของ Google Cloud Datastore Starter และ 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. สร้างชั้นเรียนสำหรับหนังสือ
ใช้เครื่องมือแก้ไขเพื่อสร้างชั้นเรียน Book
ที่มีเนื้อหาต่อไปนี้
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 +
'}';
}
}
จะเห็นได้ว่านี่คือ 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 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);
}
อินเทอร์เฟซจะขยาย 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
ดังนั้นระบบจะจัดสรรและกำหนดให้กับช่อง id
โดยอัตโนมัติเมื่อบันทึก เมธอด save
จะยอมรับออบเจ็กต์ประเภท Book
และบันทึกไว้ใน Cloud Datastore โดยจะแสดงผลออบเจ็กต์ Book
ที่มีการป้อนข้อมูลทุกช่อง รวมถึงช่อง id
สุดท้าย เราจะแสดงผลตัวแทนสตริงของออบเจ็กต์นี้
ส่วนวิธีการอื่นๆ ก็ทำงานคล้ายๆ กัน โดยจะยอมรับการส่งผ่านในพารามิเตอร์ไปยังเมธอดที่เก็บที่เหมาะสมและแสดงผลลัพธ์ที่เป็นสตริง
8. เรียกใช้แอปพลิเคชัน
หากต้องการสร้างและเริ่มแอปพลิเคชัน ก่อนอื่นให้ตรวจสอบว่า JAVA_HOME ได้รับการตั้งค่าให้เป็นเวอร์ชันที่ถูกต้อง:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
เรียกใช้คำสั่งนี้ใน Cloud Shell (จากรูทของโปรเจ็กต์ datastore-example/
ที่มี pom.xml
อยู่):
$ ./mvnw spring-boot:run export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
หลังจากขั้นตอนการสร้างสำเร็จ โลโก้ Spring จะปรากฏขึ้นและข้อความแจ้งของ Shell จะปรากฏขึ้นดังนี้
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.5) 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 ป้อน "books" ในช่องชนิด หากจำเป็น
10. ล้างข้อมูล
หากต้องการล้างข้อมูล ให้นำหนังสือทั้งหมดออกโดยใช้คำสั่ง remove-all-books
ชื่อ aptly จาก Application Shell
shell:> remove-all-books
หากต้องการออกจากแอปพลิเคชัน ให้ใช้คำสั่งออก จากนั้น Ctrl+C
11. ยินดีด้วย
ใน Codelab นี้ คุณได้สร้างแอปพลิเคชัน CLI เชิงโต้ตอบที่สามารถจัดเก็บและเรียกวัตถุจาก Cloud Datastore!
ดูข้อมูลเพิ่มเติม
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- โปรเจ็กต์ GCP ในฤดูใบไม้ผลิ: https://spring.io/projects/spring-cloud-gcp
- Spring ในที่เก็บ GitHub ของ GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java บน Google Cloud Platform: https://cloud.google.com/java/
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0