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

1. ภาพรวม

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

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

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

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud Platform
  • เบราว์เซอร์ เช่น Chrome หรือ Firefox

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

อ่านอย่างเดียว อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้บริการ Google Cloud Platform เท่าใด

ผู้ฝึกหัด ขั้นกลาง ผู้ชำนาญ

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

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

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

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

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png

55efc1aaa7a4d3ad.png

หากคุณเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า Cloud Shell คืออะไร หากเห็นหน้าจอระดับกลาง ให้คลิกต่อไป

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

9f0e51b578fecce5.png

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

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

  1. เรียกใช้คำสั่งต่อไปนี้ใน 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`
  1. เรียกใช้คำสั่งต่อไปนี้ใน 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 Console ให้ไปที่เมนู -> Datastore (ในส่วนพื้นที่เก็บข้อมูล) หรือคลิกที่นี่

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

f938295c7ff297f4.png

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

916ac84fec10fae7.png

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

จากสภาพแวดล้อม Cloud Shell ให้ใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นและ Bootstrap แอปพลิเคชัน 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, Maven Wrapper และจุดแรกเข้าของแอปพลิเคชัน

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

นอกจากนี้ เรายังต้องเพิ่มการอ้างอิงที่จำเป็นอีก 1 รายการลงใน pom.xml

เปิดโปรแกรมแก้ไขโค้ดบนเว็บโดยคลิกเปิดโปรแกรมแก้ไขจากเมนู Cloud Shell

6d823258c76a7452.png

หลังจากที่เอดิเตอร์โหลดแล้ว ให้แก้ไขไฟล์ pom.xml เพื่อเพิ่มการอ้างอิงของ 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

สร้างคลาส 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 class แล้วแก้ไขให้มีลักษณะดังนี้

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 จะปรากฏขึ้นและพรอมต์เชลล์จะปรากฏขึ้น

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



shell:>

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

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 ป้อน "books" ในช่อง kind หากจำเป็น

5fab21a6c89f45a.png

10. ล้างข้อมูล

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

shell:> remove-all-books

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

11. ยินดีด้วย

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

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 2.0 แบบทั่วไป