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

1. ภาพรวม

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

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

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

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

  • โปรเจ็กต์ 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 ของระบบคลาวด์ การใช้งาน Codelab นี้จะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินที่นอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud ใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรี$300 USD

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

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

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

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

f938295c7ff297f4.png

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

916ac84fec10fae7.png

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

6d823258c76a7452.png

หลังจากโหลดเครื่องมือแก้ไขแล้ว ให้แก้ไขไฟล์ 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>

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

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

5fab21a6c89f45a.png

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

หากต้องการล้างข้อมูล ให้นำหนังสือทั้งหมดออกโดยใช้คำสั่ง remove-all-books ชื่อ aptly จาก Application Shell

shell:> remove-all-books

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

11. ยินดีด้วย

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

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

ใบอนุญาต

ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0