Truy cập các tệp trong Cloud Storage bằng tính năng trừu tượng hoá Tài nguyên Spring

1. Tổng quan

Spring Framework cung cấp bản tóm tắt ResourceLoader để dễ dàng đọc và ghi các tệp từ nhiều nguồn, chẳng hạn như hệ thống tệp, classpath hoặc web. Bạn chỉ cần chỉ định URI cho tài nguyên bằng tiền tố giao thức đã biết. Ví dụ: để truy cập một tệp trên hệ thống tệp cục bộ, bạn sẽ chỉ định một URI như file:/data/config.yaml.

Bạn sẽ viết một ứng dụng Spring Boot. Ứng dụng này sẽ truy cập vào các tệp được lưu trữ trong Cloud Storage bằng cách sử dụng tính năng tóm tắt tài nguyên Spring và tiền tố giao thức gs:.

Bạn sẽ thực hiện việc này bằng cách sử dụng Cloud Shell và công cụ dòng lệnh gcloud của Cloud SDK.

Kiến thức bạn sẽ học được

  • Cách sử dụng điều kiện khởi động Cloud Storage Spring Boot
  • Cách truy cập vào các tệp trong Cloud Storage bằng Spring
  • Cách sử dụng đối tượng trừu tượng ResourceWritableResource của Spring

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Google Chrome
  • Quen thuộc với các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, Emacs và GNU Nano

Bạn sẽ sử dụng lớp học lập trình này như thế nào?

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

Bạn đánh giá thế nào về kinh nghiệm xây dựng ứng dụng web HTML và CSS?

Người mới tập Trung cấp Thành thạ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?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

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

  1. Đă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.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. 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.

Cloud Shell

Bạn sẽ dùng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuyFP1RzVad_4nCa0Zszrz5LtwQZZ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

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 5 GB ổn định 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.

  1. 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ể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Tạo tệp trong Cloud Storage

Sau khi Cloud Shell chạy, bạn có thể bắt đầu tạo tệp và chuyển các tệp đó sang Cloud Storage.

Tạo một tệp có tên my-file.txt:

$ echo "Hello World from GCS" > my-file.txt

Sau đó, hãy tạo một bộ chứa mới, riêng biệt trong Cloud Storage rồi chuyển tệp đến bộ chứa đó bằng gsutil.

$ BUCKET=spring-bucket-$USER
$ gsutil makebucket gs://$BUCKET
$ gsutil copy my-file.txt gs://$BUCKET

Chuyển đến trình duyệt bộ nhớ trong Cloud Storage và xác minh rằng bộ chứa và tệp đều có ở đó.

4. Khởi chạy ứng dụng Spring Boot

Bắt đầu viết ứng dụng bằng cách dùng dòng lệnh để tạo một ứng dụng mới có tên Spring Boot bằng Spring Boot:

$ curl https://start.spring.io/starter.tgz \
  -d type=maven-project \
  -d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -

Lưu ý rằng Trình khởi tạo sẽ tự động thêm spring-boot-starter-webspring-cloud-gcp-starter-storage vào các phần phụ thuộc của bạn trong pom.xml của ứng dụng mẫu.

Thay đổi thư mục của ứng dụng mẫu:

$ cd spring-gcs

Hãy đảm bảo bạn đặt JAVA_HOME thành đúng phiên bản JDK:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Tạo bản dựng và chạy ứng dụng bằng Maven.

$ ./mvnw spring-boot:run

Ứng dụng sẽ bắt đầu nghe trên cổng 8080. Mở một thẻ Cloud Shell mới rồi chạy curl để truy cập vào ứng dụng.

$ curl localhost:8080

Bạn sẽ nhận được phản hồi 404 vì ứng dụng này chưa thực hiện được thao tác hữu ích nào.

Quay lại thẻ Cloud Shell trước đó, nơi ứng dụng đang chạy và tắt bằng Control+C (Command+C trên Macintosh).

5. Đọc tệp trong Cloud Storage

Sửa đổi ứng dụng Spring Boot để truy cập vào my-file.txt, tệp mà trước đây bạn đã lưu trữ trong Cloud Storage. Mục tiêu của bạn chỉ là trả về nội dung của tệp qua HTTP.

Trong các hướng dẫn sau, bạn sẽ sử dụng Vim để chỉnh sửa các tệp. Tuy nhiên, bạn cũng có thể sử dụng Emacs, GNU Nano hoặc trình soạn thảo mã tích hợp sẵn trong Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

Thêm trình điều khiển REST GcsController vào ứng dụng.

$ vi src/main/java/com/example/demo/GcsController.java

Dán mã sau và đừng quên sửa URI tài nguyên bằng bộ chứa bạn đã tạo trước đó. Bạn có thể kiểm tra bộ chứa bằng cách chạy lệnh echo $BUCKET.

src/main/java/com/example/demo/GcsController.java

package com.example.demo;

import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

  @Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
  private Resource gcsFile;

  @GetMapping("/")
  public String readGcsFile() throws IOException {
    return StreamUtils.copyToString(
        gcsFile.getInputStream(),
        Charset.defaultCharset());
  }
}

Tạo và chạy ứng dụng bằng Maven:

$ ./mvnw spring-boot:run

Ứng dụng bắt đầu nghe trên cổng 8080. Mở một thẻ Cloud Shell mới rồi chạy curl để truy cập vào ứng dụng.

$ curl localhost:8080

Bây giờ, bạn sẽ thấy nội dung của tệp được trả về từ ứng dụng. Chuyển đến thẻ Cloud Shell trước nơi ứng dụng đang chạy và loại bỏ ứng dụng đó bằng Control+C (Command+C trên Macintosh).

6. Ghi vào tệp trong Cloud Storage

Bạn đọc nội dung của tệp trong Cloud Storage và hiển thị tệp thông qua trình điều khiển Spring REST. Bây giờ, hãy thay đổi nội dung của tệp bằng cách đăng nội dung tệp mới lên cùng một điểm cuối HTTP.

Bạn cần thêm một phương thức khác vào GcsController để phản hồi yêu cầu POST qua HTTP và ghi dữ liệu vào tệp trong Cloud Storage. Lần này, hãy truyền Resource của Spring đến WritableResource.

Cập nhật GcsController với các lệnh nhập bổ sung mà bạn cần.

src/main/java/com/example/demo/GcsController.java

import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PostMapping;

Thêm phương thức điểm cuối mới vào bộ điều khiển.

src/main/java/com/example/demo/GcsController.java

@RestController
public class GcsController {

  @PostMapping("/")
  String writeGcs(@RequestBody String data) throws IOException {
    try (OutputStream os = ((WritableResource) gcsFile).getOutputStream()) {
      os.write(data.getBytes());
    }
    return "file was updated\n";
  }
  ...
}

Tạo và chạy ứng dụng bằng Maven:

$ ./mvnw spring-boot:run

Ứng dụng bắt đầu nghe trên cổng 8080. Mở một thẻ Cloud Shell mới rồi chạy curl để đăng thông báo lên ứng dụng.

$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080

Bạn sẽ thấy thông báo xác nhận rằng nội dung của tệp đã được cập nhật. Tuy nhiên, hãy xác minh điều đó bằng cách thực hiện GET.

$ curl localhost:8080

Bạn sẽ thấy nội dung cập nhật của tệp được trả về từ ứng dụng. Quay lại thẻ Cloud Shell trước đó, nơi ứng dụng đang chạy và tắt bằng Control+C (Command+C trên Macintosh).

7. Xin chúc mừng!

Bạn đã tìm hiểu cách sử dụng tính năng trừu tượng hoá Tài nguyên Spring để dễ dàng truy cập vào các tệp trong Cloud Storage. Bạn đã viết một ứng dụng web Spring Boot có thể đọc và ghi vào một tệp trong Cloud Storage. Bạn cũng đã tìm hiểu về điều kiện khởi động Spring Boot dành cho Cloud Storage để hỗ trợ chức năng đó.

Tìm hiểu thêm

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.