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 một lớp trừu tượng ResourceLoader để dễ dàng đọc và ghi tệp từ nhiều nguồn, chẳng hạn như hệ thống tệp, đường dẫn lớp hoặc web. Bạn chỉ cần chỉ định URI cho tài nguyên bằng cách sử dụng tiền tố giao thức đã biết. Ví dụ: để truy cập vào 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 có thể truy cập vào các tệp được lưu trữ trong Cloud Storage bằng cách sử dụng lớp trừu tượng Spring Resource và tiền tố giao thức gs:.

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

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

  • Cách sử dụng trình khởi chạy 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 các thành phần trừu tượng Resource và WritableResource 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 Đọc và hoàn thành bài tập

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

Người mới bắt đầu Trung cấp Thành thạo

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

Người mới bắt đầu 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 tốc độ của riêng bạn

  1. Đăng nhập vào 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 G Suite, bạn phải tạo một tài khoản.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Hãy nhớ mã dự án, một tên duy nhất trên 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.

  1. 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 nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách 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. 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.

Cloud Shell

Bạn sẽ 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-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

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

Quá trình cung cấ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 được trang bị tất cả các công cụ phát triển mà bạn cần. 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 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 lớp học lập trình này 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 rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạ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

Đầ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`
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

3. Tạo tệp trong Cloud Storage

Sau khi Cloud Shell khởi chạy, bạn có thể bắt đầu tạo tệp và chuyển 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 vùng chứa riêng biệt mới trong Cloud Storage và chuyển tệp vào đó bằng cách sử dụ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 rồi xác minh rằng bộ chứa và tệp có ở đó.

4. Khởi động một ứng dụng Spring Boot

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

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

Xin lưu ý rằng Initializr sẽ tự động thêm spring-boot-starter-web và spring-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.

Chuyển sang thư mục của ứng dụng mẫu:

$ cd spring-gcs

Đảm bảo bạn đã đặt JAVA_HOME thành phiên bản JDK chính xác:

$ 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 và 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 chưa làm được việc gì hữu ích.

Quay lại thẻ Cloud Shell trước đó nơi ứng dụng đang chạy và tắt ứng dụng 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à bạn đã lưu trữ trước đó trong Cloud Storage. Mục tiêu của bạn chỉ là trả về nội dung của tệp thông qua HTTP.

Trong 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 chỉnh sửa mã tích hợp trong Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

Thêm một bộ đ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 nhóm mà bạn đã tạo trước đó. Bạn có thể kiểm tra vùng 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 bản dựng 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 và chạy curl để truy cập vào ứng dụng.

$ curl localhost:8080

Giờ đây, 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à tắt ứ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ị nội dung đó thông qua một bộ đ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 vào 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 HTTP POST và ghi dữ liệu vào tệp của bạn trong Cloud Storage. Lần này, hãy truyền Spring Resource đến WritableResource.

Cập nhật GcsController bằng các dữ liệu 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 bản dựng 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 và chạy curl để đăng một 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 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à huỷ ứng dụng 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 lớp trừu tượng Spring Resource để 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ề trình khởi động Spring Boot cho Cloud Storage giúp bật 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 Ghi công theo Creative Commons 2.0 Chung.