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

Spring 架構提供了 ResourceLoader 抽象化,可讓您輕鬆讀取和寫入各種來源的檔案,例如檔案系統、classpath 或網路。只要使用知名通訊協定前置字串即可為資源指定 URI。舉例來說,如要存取本機檔案系統中的檔案,請指定 file:/data/config.yaml 之類的 URI。

您會使用「Spring 資源抽象」和「gs:」通訊協定前置字串來編寫 Spring Boot 應用程式,以存取儲存在 Cloud Storage 中的檔案。

只要使用 Cloud Shell 和 Cloud SDK gcloud 指令列工具即可進行這項操作。

您將會瞭解的內容

  • 如何使用 Cloud Storage 的開機啟動器
  • 如何使用 Spring 存取 Cloud Storage 中的檔案
  • 如何使用 Spring's ResourceWritableResource 抽象化

軟硬體需求

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

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

唯讀 閱讀並完成練習

您認為建立 HTML 和 CSS 網路應用程式的體驗如何?

初級 中級 熟練

您對於 Google Cloud 服務的使用體驗評價如何?

初級 中級 專業

自行調整環境設定

如果您還沒有 Google 帳戶 (Gmail 或 Google Apps),請先建立帳戶。登入 Google Cloud Platform 主控台 (console.cloud.google.com),然後建立新專案:

2016-02-10 12:45:26.png 的螢幕擷取畫面

提醒您,專案編號是所有 Google Cloud 專案的不重複名稱 (使用上述名稱後就無法使用,敬請見諒!)此程式碼研究室稍後將稱為 PROJECT_ID

接著,您必須在 Cloud Console 中啟用計費功能,才能使用 Google Cloud 資源。

完成這個程式碼研究室的成本應該不會超過新臺幣 $300 元,但如果您決定繼續使用更多資源,或是讓資源繼續運作 (請參閱本文件結尾的「清除設定」一節),就有可能需要更多成本。

新加入 Google Cloud Platform 的使用者可免費試用$300 美元

Cloud Shell

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

啟用 Google Cloud Shell

在 GCP 主控台中,按一下右上角的工具列的 Cloud Shell 圖示:

然後按一下 [Start Cloud Shell]。

佈建和連線至環境只需要幾分鐘的時間:

這部虛擬機器已載入所有您需要的開發工具。這項服務提供永久性的 5GB 主目錄,可在 Google Cloud 中運作,大幅提升網路效能和驗證效能。在這個研究室中,您可以透過瀏覽器或 Google Chromebook 完成大部分的工作。

連線至 Cloud Shell 之後,您應該會看到您已經通過驗證,且專案已經設定為 PROJECT_ID

在 Cloud Shell 中執行下列指令,確認您的身分已通過驗證:

gcloud auth list

指令輸出

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果沒有,則可使用下列指令設定:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

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 中的儲存空間瀏覽器,確認該值區與檔案是否存在。

使用指令列來撰寫應用程式,透過 Spring Initializr 產生新的 Spring Boot 應用程式:

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

請注意,初始化工具會自動將 spring-boot-starter-webspring-cloud-gcp-starter-storage 加入範本應用程式的 pom.xml 中。

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

$ cd spring-gcs

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

$ ./mvnw spring-boot:run

應用程式隨即會開始透過通訊埠 8080 聽取指令。開啟新的 Cloud Shell 分頁並執行 curl,以存取應用程式。

$ curl localhost:8080

您應該會看到 404 回應,原因是應用程式尚未執行任何操作。返回上一個執行中的 Cloud Shell 分頁,並使用 Control+C (在 Macintosh 上為 Command+C) 將其關閉。

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

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

$ 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

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

  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String readGcsFile() throws IOException {
    return StreamUtils.copyToString(
        gcsFile.getInputStream(),
        Charset.defaultCharset()) + "\n";
  }
}

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

$ ./mvnw spring-boot:run

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

$ curl localhost:8080

你應該會看到應用程式傳回的檔案內容。請前往應用程式正在執行的 Cloud Shell 分頁,然後使用 Control+C 來清除該檔案 (在 Macintosh 上為 Command+C)。

您讀取 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;

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

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

@RestController
public class GcsController {
  @RequestMapping(value = "/", method = RequestMethod.POST)
  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) 刪除該檔案。

您已經瞭解如何使用 Spring Resource 抽象化機制,輕鬆存取 Cloud Storage 中的檔案。您撰寫的春季啟動網頁應用程式可以讀取及寫入 Cloud Storage 中的檔案。您也瞭解 Cloud Storage 的 Spring Boot 啟用程式可啟用這項功能。

瞭解詳情

授權

本作品採用創用 CC 姓名標示 2.0 一般授權。