使用 Spring Resource 抽象層存取 Cloud Storage 中的檔案

1. 總覽

Spring Framework 提供 ResourceLoader 抽象化功能,以便從檔案系統、類別路徑或網頁等各種來源中輕鬆讀取及寫入檔案。只要使用常見的通訊協定前置字串,即可指定資源的 URI。舉例來說,如要存取本機檔案系統中的檔案,您需要指定類似 file:/data/config.yaml 的 URI。

您將編寫 Spring Boot 應用程式,該應用程式會使用 Spring Resource 抽象層和 gs: 通訊協定前置字串存取儲存在 Cloud Storage 中的檔案。

方法很簡單,只要使用 Cloud Shell 和 Cloud SDK gcloud 指令列工具即可。

課程內容

  • 如何使用 Cloud Storage Spring Boot 範例應用程式
  • 如何透過 Spring 存取 Cloud Storage 中的檔案
  • 如何使用 Spring 的 ResourceWritableResource 抽象層

軟硬體需求

  • Google Cloud 專案
  • 瀏覽器,例如 Google Chrome
  • 熟悉標準的 Linux 文字編輯器,例如 Vim、Emacs 和 GNU Nano

您會如何使用本程式碼研究室?

唯讀 閱讀並完成練習

針對建立 HTML 和 CSS 網頁應用程式的經驗,您會給予什麼評價?

新手 中級 還算容易

針對使用 Google Cloud 服務的經驗,您會給予什麼評價?

新手 中級 還算容易

2. 設定和需求

自修環境設定

  1. 登入 Cloud 控制台建立新專案,或是重複使用現有專案。(如果您還沒有 Gmail 或 G Suite 帳戶,請先建立帳戶)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID

  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。

執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

Cloud Shell

您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfpXXLZUzLzLZLZDZLZD

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

如果您從未啟動 Cloud Shell,您會看見中繼畫面 (需捲動位置),說明螢幕內容。如果出現這種情況,請按一下「繼續」 (之後不會再顯示)。以下是單次畫面的外觀:

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

佈建並連線至 Cloud Shell 只需幾分鐘的時間。

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可以透過瀏覽器或 Chromebook 完成。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  1. 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list

指令輸出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果尚未設定,請使用下列指令進行設定:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

3. 在 Cloud Storage 中建立檔案

啟動 Cloud Shell 後,您就可以開始建立檔案並將檔案轉移至 Cloud Storage。

建立名為 my-file.txt 的檔案:

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

接著,請在 Cloud Storage 中建立新的不重複的值區,並使用 gsutil 將檔案轉移至該值區。

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

前往 Cloud Storage 中的 Storage 瀏覽器,確認值區和檔案是否位於其中。

4. 初始化 Spring Boot 應用程式

使用指令列,透過 Spring Initializr 產生新的 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 -

請注意,Initializr 會自動在範本應用程式的 pom.xml 中將 spring-boot-starter-webspring-cloud-gcp-starter-storage 新增至依附元件。

變更為範本應用程式的目錄:

$ cd spring-gcs

確認 JAVA_HOME 設為正確的 JDK 版本:

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

使用 Maven 建構及執行應用程式。

$ ./mvnw spring-boot:run

應用程式會開始監聽通訊埠 8080。請開啟新的 Cloud Shell 分頁,並執行 curl 來存取應用程式。

$ curl localhost:8080

由於應用程式還沒有任何用途,您應該會收到 404 回應。

返回執行應用程式的上一個 Cloud Shell 分頁,然後使用 Control+C (Macintosh 為 Command+C) 終止應用程式。

5. 讀取 Cloud Storage 中的檔案

修改 Spring Boot 應用程式以存取 my-file.txt,也就是先前儲存在 Cloud Storage 中的檔案。您的目標是僅透過 HTTP 傳回檔案內容。

在下列操作說明中,您將使用 Vim 編輯檔案,但您也可以使用 Emacs、GNU Nano 或 Cloud Shell 內建的程式碼編輯器:

cloud-editor.png

$ cd ~/spring-gcs

將 REST 控制器 GcsController 新增至應用程式。

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

貼上下列程式碼,別忘了使用先前建立的值區修正資源 URI。您可以執行 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());
  }
}

使用 Maven 建構及執行應用程式:

$ ./mvnw spring-boot:run

應用程式會開始監聽通訊埠 8080。請開啟新的 Cloud Shell 分頁,並執行 curl 來存取應用程式。

$ curl localhost:8080

現在,您應該會看到應用程式傳回的檔案內容。前往執行應用程式的上一個 Cloud Shell 分頁,然後使用 Control+C (Macintosh 為 Command+C) 終止應用程式。

6. 寫入 Cloud Storage 中的檔案

您已讀取 Cloud Storage 中的檔案內容,並透過 Spring REST 控制器公開檔案。現在,請將新的檔案內容發布至同一個 HTTP 端點,變更檔案內容。

您需要在 GcsController 新增其他方法,用來回應 HTTP POST,並將資料寫入 Cloud Storage 中的檔案。這次將春天 Resource 投放到 WritableResource

使用所需的其他匯入項目更新 GcsController

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;

將新的端點方法新增至控制器。

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";
  }
  ...
}

使用 Maven 建構及執行應用程式:

$ ./mvnw spring-boot:run

應用程式會開始監聽通訊埠 8080。開啟新的 Cloud Shell 分頁並執行 curl,即可將訊息發布至應用程式。

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

系統應會顯示檔案內容已更新的確認訊息。不過,請執行 GET 來驗證。

$ curl localhost:8080

畫面上應會顯示應用程式傳回的更新檔案內容。返回執行應用程式的上一個 Cloud Shell 分頁,然後使用 Control+C (Macintosh 為 Command+C) 終止應用程式。

7. 恭喜!

您已學會如何使用 Spring Resource 抽象層輕鬆存取 Cloud Storage 中的檔案。您編寫了可讀取及寫入 Cloud Storage 檔案的 Spring Boot 網頁應用程式。您也學到了可使用這項功能的 Cloud Storage Spring Boot 啟動條件。

瞭解詳情

授權

這項內容採用的是創用 CC 姓名標示 2.0 通用授權。