1. Tổng quan
Cloud Spanner là một R DBMS đa khu vực, có thể mở rộng và có khả năng hoạt động cao, có thể mở rộng theo chiều ngang và nhiều khu vực.Lớp học lập trình này sẽ sử dụng một thực thể nhỏ nhất của Cloud Spanner, nhưng bạn đừng quên tắt ứng dụng này sau khi hoàn tất!
Kiến thức bạn sẽ học được
- Cách sử dụng Cloud Spanner để lưu và truy xuất dữ liệu bằng 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á trải nghiệm sử dụng các dịch vụ của Google Cloud Platform như thế nào?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)
Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau 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.
Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. 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í 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 trước đây chưa từng khởi động Cloud Shell, bạn sẽ được trình bày một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện chỉ bằng một trình duyệt hoặc Chromebook.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự á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
Kết quả lệnh
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
Kết quả lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
3. Khởi chạy Cloud Spanner
Bật Cloud Spanner API bằng gcloud CLI:
gcloud services enable spanner.googleapis.com
Tạo một thực thể Cloud Spanner:
gcloud spanner instances create spanner-instance \ --config=regional-us-central1 \ --nodes=1 --description="A Spanner Instance"
Tạo cơ sở dữ liệu trong thực thể:
gcloud spanner databases create orders \ --instance=spanner-instance
Tạo tệp schema.ddl
để mô tả giản đồ dữ liệu:
cat << EOF > schema.ddl CREATE TABLE orders ( order_id STRING(36) NOT NULL, description STRING(255), creation_timestamp TIMESTAMP, ) PRIMARY KEY (order_id); CREATE TABLE order_items ( order_id STRING(36) NOT NULL, order_item_id STRING(36) NOT NULL, description STRING(255), quantity INT64, ) PRIMARY KEY (order_id, order_item_id), INTERLEAVE IN PARENT orders ON DELETE CASCADE; EOF
Áp dụng giản đồ cho cơ sở dữ liệu Cloud Spanner:
gcloud spanner databases ddl update orders \ --instance=spanner-instance \ --ddl="$(<schema.ddl)"
4. Tự thân khởi động một ứng dụng Java khởi động mùa xuân mới
Trong môi trường Cloud Shell, 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=jar \ -d dependencies=cloud-gcp,web,lombok \ -d baseDir=spanner-example \ -d type=maven-project \ -d bootVersion=3.2.6 | tar -xzvf - $ cd spanner-example
Thao tác này sẽ tạo một thư mục spanner-example/
mới có một 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 nhập ứng dụng.
Trong tệp pom.xml
, hãy thêm điều kiện khởi động Spring Data Cloud Spanner.
spanner-example/pom.xml
<project>
...
<dependencies>
...
<!-- Add Spring Cloud GCP Spanner Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-data-spanner</artifactId>
</dependency>
...
</dependencies>
...
</project>
Trong application.properties, hãy định cấu hình thông tin kết nối cơ sở dữ liệu Spanner:
spanner-example/src/main/resources/application.properties
spring.cloud.gcp.spanner.instance-id=spanner-instance spring.cloud.gcp.spanner.database=orders
Hãy đảm bảo bạn đã đặt JAVA_HOME
thành đúng phiên bản:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Tạo lại ứng dụng để đảm bảo cấu hình Maven của bạn là chính xác:
./mvnw package
5. Tạo đối tượng
Với sự hỗ trợ của Spring Data Spanner của Spring Cloud GCP, bạn có thể dễ dàng tạo đối tượng Java và ánh xạ ORM tương thích đến bảng Spanner bằng cách sử dụng Spring Data.
Trước tiên, hãy tạo một lớp Order Item (Mặt hàng đơn đặt hàng).
spanner-example/src/main/java/com/example/demo/OrderItem.java
package com.example.demo;
import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;
@Table(name="order_items")
@Data
class OrderItem {
@PrimaryKey(keyOrder = 1)
@Column(name="order_id")
private String orderId;
@PrimaryKey(keyOrder = 2)
@Column(name="order_item_id")
private String orderItemId;
private String description;
private Long quantity;
}
Đối với mối quan hệ Cấp độ gốc/Con trong Spanner, bạn nên sử dụng khoá chính tổng hợp. Trong ví dụ này, khoá kết hợp là order_id
và order_item_id
.
Tiếp theo, hãy tạo một lớp Order (Đơn đặt hàng):
spanner-example/src/main/java/com/example/demo/Order.java
package com.example.demo;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import com.google.cloud.spring.data.spanner.core.mapping.Column;
import com.google.cloud.spring.data.spanner.core.mapping.Interleaved;
import com.google.cloud.spring.data.spanner.core.mapping.PrimaryKey;
import com.google.cloud.spring.data.spanner.core.mapping.Table;
@Table(name="orders")
@Data
public class Order {
@PrimaryKey
@Column(name="order_id")
private String id;
private String description;
@Column(name="creation_timestamp")
private LocalDateTime timestamp;
@Interleaved
private List<OrderItem> items;
}
Lớp này sử dụng chú giải @Interleaved
để tạo mối quan hệ một với nhiều với các mặt hàng trong đơn đặt hàng.
6. Tạo giao diện OrderRepository
Tạo lớp OrderRepository
với nội dung sau:
spanner-example/src/main/java/com/example/demo/OrderRepository.java
package com.example.demo;
import com.google.cloud.spring.data.spanner.repository.SpannerRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepository extends SpannerRepository<Order, String> {
}
Giao diện mở rộng SpannerRepository<Order, String>
, trong đó Order
là lớp miền và String
là loại Khoá chính. Spring Data sẽ tự động cấp quyền truy cập CRUD thông qua giao diện này và bạn sẽ không cần tạo thêm mã.
7. Tạo Trình điều khiển REST cho các thao tác cơ bản
Mở lớp DemoApplication
của ứng dụng chính rồi sửa đổi thành như sau:
spanner-example/src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import java.time.LocalDateTime;
import java.util.UUID;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@RestController
class OrderController {
private final OrderRepository orderRepository;
OrderController(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
@GetMapping("/api/orders/{id}")
public Order getOrder(@PathVariable String id) {
return orderRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
}
@PostMapping("/api/orders")
public String createOrder(@RequestBody Order order) {
// Spanner currently does not auto generate IDs
// Generate UUID on new orders
order.setId(UUID.randomUUID().toString());
order.setTimestamp(LocalDateTime.now());
order.getItems().forEach(item -> {
// Assign parent ID, and also generate child ID
item.setOrderId(order.getId());
item.setOrderItemId(UUID.randomUUID().toString());
});
Order saved = orderRepository.save(order);
return saved.getId();
}
}
8. Chạy ứng dụng
Tạo lại và chạy ứng dụng!
./mvnw spring-boot:run
Quá trình này sẽ khởi động đúng cách và nghe trên cổng 8080.
Bạn có thể đăng một bản ghi Đơn đặt hàng lên điểm cuối:
curl -H"Content-Type: application/json" -d'{"description": "My orders", "items": [{"description": "Android Phone", "quantity": "1"}]}' \ http://localhost:8080/api/orders
Đơn đặt hàng sẽ phản hồi bằng UUID
của Đơn đặt hàng.
Sau đó, bạn có thể truy xuất Đơn đặt hàng bằng UUID
:
curl http://localhost:8080/api/orders/REPLACE_WITH_ORDER_UUID
Để xem cách dữ liệu được lưu trữ Cloud Spanner, hãy truy cập Cloud Console rồi chuyển đến Spanner → Spanner Instance → cơ sở dữ liệu đơn đặt hàng → bảng đơn đặt hàng → Dữ liệu.
9. Dọn dẹp
Để dọn dẹp, hãy xoá thực thể Spanner để không làm phát sinh phí nữa!
gcloud spanner instances delete spanner-instance -q
10. 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ó tính tương tác có thể lưu trữ và truy xuất dữ liệu từ Cloud Spanner!
Tìm hiểu thêm
- Cloud Spanner: https://cloud.google.com/spanner/
- Mùa xuân trên dự án GCP: https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/
- Spring trên kho lưu trữ 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ả Creative Commons 2.0.