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?
Thiết lập môi trường theo tốc độ của riêng bạn
Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:
Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID
.
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 của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy (xem phần "dọn dẹp" ở cuối tài liệu này).
Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí 300 USD.
Kích hoạt Google Cloud Shell
Trên Bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:
Sau đó, hãy nhấp vào "Start Cloud Shell" (Bắt đầu Cloud Shell):
Quá trình cung cấp và kết nối với môi trường chỉ mất vài phút:
Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên 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 trong phòng thí nghiệm này chỉ bằng một trình duyệt hoặc Google Chromebook.
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 PROJECT_ID.
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: - <myaccount>@<mydomain>.com (active)
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].
Trong Bảng điều khiển GCP, hãy chuyển đến Trình đơn -> Datastore (trong phần Bộ nhớ).
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":
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 baseDir=datastore-example \ -d bootVersion=2.1.1.RELEASE | 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, cũng như 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 đó 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ã trên web bằng cách nhấp vào Khởi chạy trình chỉnh sửa mã 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 phần phụ thuộc của trình khởi động Spring Boot Cloud Datastore Spring Data:
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>
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 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 +
'}';
}
}
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á DataStore. 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.
Đừng quên lưu tệp!
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 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);
}
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.
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ú giải 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 ta 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 mã nhận dạng 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, kể 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.
Để tạo và khởi động ứng dụng, hãy thực thi lệnh này trong Cloud Shell (từ gốc của dự án datastore-example/
nơi có pom.xml
) :
$ mvn spring-boot:run
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 :: (v2.1.1.RELEASE) 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 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
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>
)
Để xem các thực thể được lưu trữ trong Cloud Datastore, hãy chuyển đến GCP Console rồi chọn Trình đơn -> Datastore (trong phần Bộ nhớ) -> Thực thể (chọn không gian tên "[mặc định]" và loại "sách" nếu cần).
Để 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 trình bao ứng dụng.
shell:> remove-all-books
Để thoát ứng dụng, hãy dùng lệnh thoát, sau đó nhấn tổ hợp phím Ctrl+C.
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: http://cloud.spring.io/spring-cloud-gcp/
- Kho lưu trữ Spring trên GitHub của GCP: https://github.com/spring-cloud/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 chung Ghi nhận tác giả theo Creative Commons 2.0.