Ứng dụng Spring Boot với Cloud Datastore

Google Cloud Datastore là cơ sở dữ liệu tài liệu NoSQL được xây dựng để mở rộng tự động, hiệu suất cao và dễ 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ó

  • Một dự án Google Cloud Platform
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc qua và hoàn thành các bài tập

Bạn đánh giá trải nghiệm sử dụng các dịch vụ Google Cloud Platform của mình như thế nào?

Công ty Trung cấp Đặc biệt

Thiết lập môi trường theo tiến độ riêng

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), thì bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển của Google Cloud Platform (console.cloud.google.com) và tạo một dự án mới:

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Hãy ghi nhớ mã dự án, một tên duy nhất trên tất cả các dự án Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động cho bạn!). Lớp học này sẽ được gọi sau này trong lớp học lập trình này là PROJECT_ID.

Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Nếu tham gia lớp học lập trình này, bạn sẽ không mất quá vài đô la, nhưng có thể sẽ hiệu quả 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 đó hoạt động (xem "cleanup" ở 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ử 300 đô la dùng thử miễn phí.

Kích hoạt Google Cloud Shell

Từ 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 đó nhấp vào "Start Cloud Shell":

Bạn chỉ cần dành vài phút để cấp phép và kết nối với môi trường:

Máy ảo này được tải bằng tất cả các công cụ phát triển mà bạn cần. cung cấp một thư mục gốc 5GB cố định và chạy trên Google Cloud, qua đó nâng cao đáng kể hiệu suất và khả năng xác thực mạng. Phần lớn công việc của bạn trong phòng thí nghiệm này có thể thực hiện 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 bạn đã được xác thực và dự án này đã được đặt thành PROJECT_ID 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 lệnh

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Đầu ra lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt lệnh đó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra lệnh

Updated property [core/project].

Trong Bảng điều khiển GCP, hãy chuyển đến Trình đơn –> Kho dữ liệu (trong phần Bộ nhớ).

Nếu chưa từng sử dụng Datastore trong dự án hiện tại, bạn sẽ thấy màn hình "Select a Cloud Firestore mode". Chọn tùy chọn "Datastore mode".

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

Từ môi trường CloudShell, hãy sử dụng lệnh sau để khởi chạy 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ó một dự án Maven mới, cùng với pom.xml\39;s Maven, một trình bao bọc Maven cũng như một điểm truy cập cho ứng dụng.

Ứng dụng của chúng tôi sẽ cung cấp CLI cho người dùng để nhập lệnh và xem kết quả. Chúng ta sẽ tạo một lớp để đại diện cho một cuốn sách, sau đó lưu lớp đó đó vào Cloud Datastore bằng cách sử dụng Kho lưu trữ dữ liệu.

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 Khởi chạy trình chỉnh sửa mã từ 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 vào Bộ khởi động mùa xuân của kho dữ liệu đám mây của Data 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 nghĩ đến một loại trong 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 tên đó bị bỏ qua, thì tên loại sẽ được tạo dựa trên tên lớp.

Xin lưu ý rằng chúng tôi đã chú thích thuộc tính id bằng @Id. Điều đó cho thấy rằng chúng tôi muốn trường này được sử dụng làm phần nhận dạng của Khóa dữ liệu. Mỗi thực thể Datastore cần một giá trị nhận dạng. Các loại kết quả được hỗ trợ là StringLong.

Chúng ta ghi đè phương thức toString để làm cho cách biểu diễn chuỗi của đối tượng dễ đọc hơn; phương thức này sẽ hữu ích khi chúng ta in các đối tượng đó.

Đừ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 mở rộng DatastoreRepository<Book, Long> trong đó Book là lớp miền và Long là loại Id. Chúng tôi khai báo ba phương thức truy vấn trong kho lưu trữ mà những phương thức triển khai nào được tạo tự động phía sau hệ thống.

Sự kiện đầu tiên là findByAuthor. Như bạn có thể đoán, việc triển khai phương pháp này sẽ thực thi một truy vấn sẽ sử dụng giá trị do người dùng cung cấp trong bộ lọc điều kiện cho trường bình đẳng với tác giả.

Phương thức findByYearGreaterThan thực thi truy vấn lọc ra trường năm lớn hơn giá trị do người dùng cung cấp.

findByAuthorAndYear thực thi truy vấn tìm các thực thể mà trong đó trường tác giả và trường năm khớp với giá trị do người dùng cung cấp.

Mở lớp ứng dụng chính DemoApplication và sửa đổi để trông giố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();
  }
}

Hãy lưu ý cách chúng tôi chú thích lớp học bằng @ShellComponent. Việc này thông báo cho Spring rằng chúng tôi muốn 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ẽ hiển thị dưới dạng lệnh CLI trong ứng dụng của chúng tôi.

Ở đây, chúng ta 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 tôi sử dụng ba phương pháp tích hợp sẵn: save, findAlldeleteAll.

Hãy xem phương thức saveBook . Chúng tôi tạo đố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 có thể thấy, chúng tôi không cung cấp giá trị id nên hệ thống sẽ tự động phân bổ và gán giá trị này cho trường mã khi lưu. Phương thức save chấp nhận đối tượng thuộc loại Book và lưu đối tượng đó vào Cloud Datastore. Thuộc tính này sẽ trả về đối tượng Book có tất cả các trường đã điền, kể cả trường id. Cuối cùng, chúng ta trả về biểu diễn chuỗi của đối tượng này.

Các phương thức còn lại hoạt động tương tự nhau: chúng chấp nhận các tham số được chuyển đến các phương thức kho lưu trữ phù hợp và trả về kết quả theo chuỗi.

Để tạo và khởi động ứng dụng, hãy thực thi lệnh này trong Cloud Shell (từ thư mục gốc của dự án datastore-example/pom.xml) :

$ mvn spring-boot:run

Sau giai đoạn xây dựng thành công, biểu trưng mùa xuân sẽ hiển thị và lời nhắc giao diện 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 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:

  1. Tạo một vài cuốn sách bằng lệnh save-book
  2. Chạy tìm kiếm bằng cách sử dụng lệnh find-all-books
  3. Tìm sách của tác giả cụ thể (find-by-author <author>)
  4. Tìm sách được xuất bản sau một năm cụ thể (find-by-year-after <year>)
  5. Tìm sách theo tác giả và năm cụ thể (find-by-author-year <author> <year>)

Để 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 và chuyển đến Trình đơn -> Kho lưu trữ dữ liệu (trong phần Bộ nhớ) -> Thực thể (chọn "[default]" namespace và "books" type, nếu cần).

Để dọn dẹp, hãy xoá tất cả sách bằng lệnh remove-all-books có tên hợp lý khỏi giao diện ứng dụng.

shell:> remove-all-books

Để thoát ứng dụng, hãy sử dụng lệnh exit, sau đó nhấn Ctrl+C.

Trong lớp học lập trình này, bạn đã tạo một ứng dụng CLI 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

Giấy phép

Tài liệu này được cấp phép theo Giấy phép chung Creative Commons 2.0.