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 tiền tố giao thức quen thuộc. 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 để 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 Cloud Shell và công cụ dòng lệnh Cloud SDK gcloud.

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

  • Cách sử dụng trình khởi động Spring Boot của Cloud Storage
  • Cách truy cập vào các tệp trong Cloud Storage bằng Spring
  • Cách sử dụng các lớp 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
  • Nắm vững các trình chỉnh sửa văn bản Linux tiêu chuẩn, 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 các bài tập

Bạn đánh giá thế nào về trải nghiệm xây dựng ứ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 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 tự học

  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_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-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 của 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!). Mã 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 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 phát sinh chi phí 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í 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. Trên 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 (dưới màn hình đầ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ữa). Sau đây là giao diện của màn hình một lần đó:

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 được tải sẵn tất cả các công cụ phát triển mà bạn cần. Máy ảo này cung cấp một thư mục chính 5 GB liên tục và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết, nếu không phả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 là my-file.txt:

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

Sau đó, tạo một bộ chứa duy nhất mới trong Cloud Storage và chuyển tệp vào đó 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 rồi xác minh rằng bộ chứa và tệp đó có ở đó.

4. Khởi chạy ứ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-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.

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

$ cd spring-gcs

Đảm bảo JAVA_HOME được đặt 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 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 chưa thực hiện bất kỳ 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 ứ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 là chỉ cần 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 tệp, nhưng 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 trong Cloud Shell:

cloud-editor.png

$ cd ~/spring-gcs

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

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

Dán đoạn mã sau và đừng quên sửa URI tài nguyên bằng bộ chứa mà 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 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 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à 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 trình điều khiển REST Spring. 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 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 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 trình đ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 rồi 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à tắt ứng dụng bằng Control+C (Command+C trên Macintosh).

7. Xin chúc mừng!

Bạn đã học 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.