1. Tổng quan
Google Cloud Datastore là một cơ sở dữ liệu dạng tài liệu NoSQL được xây dựng để hỗ trợ việc tự động cấp tài nguyên bổ sung, duy trì hiệu suất cao và tạo điều kiện dễ dàng cho việc phát triển ứng dụng.
Kiến thức bạn sẽ học được
- Cách sử dụng Cloud Datastore để lưu và truy xuất các đối tượng java trong Spring Boot
Bạn cần có
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud Platform?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.



- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
- Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án. - Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Khởi chạy Cloud Datastore
Trong Bảng điều khiển GCP, hãy chuyển đến Trình đơn -> Datastore (trong phần Bộ nhớ) hoặc nhấp vào đây.
Nếu chưa bao giờ sử dụng Datastore trong dự án hiện tại, bạn sẽ thấy màn hình "Chọn chế độ Cloud Firestore". Chọn chế độ "Datastore".

Sau đó, bạn sẽ thấy màn hình "Chọn nơi lưu trữ dữ liệu của bạn". Chọn us-east1 hoặc một vị trí theo khu vực khác rồi nhấp vào "Tạo cơ sở dữ liệu":

4. Khởi động một Ứng dụng Java Spring Boot mới
Trong môi trường Cloud Shell, hãy dùng lệnh sau để khởi động và khởi động một ứng dụng Spring Boot mới:
$ 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 -
Thao tác này sẽ tạo một thư mục datastore-example/ mới có dự án Maven mới, cùng với pom.xml của Maven, một trình bao bọc Maven và một điểm truy cập ứng dụng.
Ứng dụng của chúng tôi sẽ cung cấp một CLI để người dùng nhập lệnh và xem kết quả. Chúng ta sẽ tạo một lớp để biểu thị một cuốn sách, sau đó lưu lớp này vào Cloud Datastore bằng Datastore Repository.
Chúng ta cũng cần thêm một phần phụ thuộc cần thiết khác vào pom.xml.
Mở Trình chỉnh sửa mã web bằng cách nhấp vào Mở trình chỉnh sửa trong trình đơn Cloud Shell.

Sau khi trình chỉnh sửa tải, hãy sửa đổi tệp pom.xml để thêm các phần phụ thuộc Google Cloud Datastore Starter và 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. Tạo lớp Book
Sử dụng trình chỉnh sửa, tạo lớp Book có nội dung sau:
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 +
'}';
}
}
Như bạn có thể thấy, đây là một POJO đơn giản. Lớp này được chú thích bằng @Entity để cho biết rằng lớp có thể được lưu trữ trong Datastore và cung cấp tên loại (hãy coi loại là một bảng trong cơ sở dữ liệu SQL, hãy xem tài liệu để biết thêm thông tin chi tiết). Tên loại là không bắt buộc. Nếu bạn bỏ qua tên này, tên loại sẽ được tạo dựa trên tên lớp.
Xin lưu ý rằng chúng ta đã chú thích thuộc tính id bằng @Id. Điều đó cho thấy chúng ta muốn trường này được dùng làm phần nhận dạng của Khoá Kho dữ liệu. Mỗi thực thể Datastore đều cần một giá trị nhận dạng. Các loại được hỗ trợ là String và Long.
Chúng ta sẽ ghi đè phương thức toString để giúp chuỗi đại diện của các đối tượng dễ đọc hơn; điều này sẽ hữu ích khi chúng ta in các đối tượng đó ra.
6. Tạo giao diện BookRepository
Tạo lớp BookRepository có nội dung sau:
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);
}
Giao diện này mở rộng DatastoreRepository<Book, Long>, trong đó Book là lớp miền và Long là loại Id. Chúng ta khai báo 3 phương thức truy vấn trong kho lưu trữ mà các phương thức triển khai được tạo tự động ở phía sau.
Tin nhắn đầu tiên là findByAuthor. Như bạn có thể đoán, việc triển khai phương thức này sẽ thực thi một truy vấn sử dụng giá trị do người dùng cung cấp trong bộ lọc điều kiện để so sánh với trường tác giả.
Phương thức findByYearGreaterThan thực thi một truy vấn lọc trường năm lớn hơn giá trị do người dùng cung cấp.
findByAuthorAndYear thực thi một truy vấn tìm kiếm các thực thể có trường tác giả và năm khớp với các giá trị do người dùng cung cấp.
7. Tạo ứng dụng CLI có tính tương tác
Mở lớp ứng dụng chính DemoApplication và sửa đổi để có dạng như sau:
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();
}
}
Lưu ý cách chúng ta chú thích lớp bằng @ShellComponent. Thao tác này thông báo cho Spring rằng chúng ta muốn sử dụng lớp này làm nguồn cho các lệnh CLI. Các phương thức được chú thích bằng @ShellMethod sẽ được hiển thị dưới dạng các lệnh CLI trong ứng dụng của chúng ta.
Ở đây, chúng ta sử dụng các phương thức mà chúng ta đã khai báo trong giao diện BookRepository: findByAuthor, findByYearGreaterThan, findByAuthorAndYear. Ngoài ra, chúng ta sử dụng 3 phương thức tích hợp: save, findAll và deleteAll.
Hãy xem phương thức saveBook. Chúng ta tạo một đối tượng Book bằng cách sử dụng các giá trị do người dùng cung cấp cho tiêu đề, tác giả và năm. Như bạn thấy, chúng tôi không cung cấp giá trị id, vì vậy, giá trị này sẽ được tự động phân bổ và chỉ định cho trường id khi lưu. Phương thức save chấp nhận một đối tượng thuộc loại Book và lưu đối tượng đó vào Cloud Datastore. Phương thức này trả về một đối tượng Book có tất cả các trường được điền sẵn, bao gồm cả trường id. Cuối cùng, chúng ta sẽ trả về một chuỗi đại diện cho đối tượng này.
Các phương thức còn lại hoạt động tương tự: chúng chấp nhận các tham số được truyền vào các phương thức kho lưu trữ thích hợp và trả về kết quả được chuyển đổi thành chuỗi.
8. Chạy ứng dụng
Để tạo và khởi động ứng dụng, trước tiên, hãy đảm bảo JAVA_HOME được đặt thành phiên bản phù hợp:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Thực thi lệnh này trong Cloud Shell (từ gốc của dự án datastore-example/ nơi có pom.xml):
$ ./mvnw spring-boot:run export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Sau giai đoạn tạo thành công, biểu trưng Spring sẽ xuất hiện và lời nhắc shell sẽ xuất hiện:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.5) shell:>
Giờ đây, bạn có thể thử nghiệm với các lệnh mà chúng ta đã xác định trước đó. Để xem danh sách các lệnh, hãy dùng lệnh trợ giúp:
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>
Hãy thử các cách sau:
- Tạo một vài cuốn sách bằng lệnh
save-book - Chạy lệnh tìm kiếm bằng lệnh
find-all-books - Tìm sách của một tác giả cụ thể:
find-by-author <author> - Tìm sách xuất bản sau một năm cụ thể:
find-by-year-after <year> - Tìm sách theo tác giả và năm cụ thể:
find-by-author-year <author> <year>
9. Xem những nội dung được lưu trữ trong Datastore bằng giao diện web
Để xem cách các thực thể được lưu trữ trong Cloud Datastore, hãy truy cập vào Bảng điều khiển GCP. Nhập "books" vào trường loại (nếu cần).

10. Dọn dẹp
Để dọn dẹp, hãy xoá tất cả các cuốn sách bằng lệnh remove-all-books (được đặt tên một cách thích hợp) khỏi giao diện ứng dụng.
shell:> remove-all-books
Để thoát ứng dụng, hãy dùng lệnh quit, sau đó nhấn Ctrl+C.
11. Xin chúc mừng!
Trong lớp học lập trình này, bạn đã tạo một ứng dụng CLI có thể tương tác, có thể lưu trữ và truy xuất các đối tượng từ Cloud Datastore!
Tìm hiểu thêm
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Dự án Spring trên GCP: https://spring.io/projects/spring-cloud-gcp
- Kho lưu trữ Spring trên GCP GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java trên Google Cloud Platform: https://cloud.google.com/java/
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.