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 的
Resource
和WritableResource
抽象層
軟硬體需求
- Google Cloud 專案
- 瀏覽器,例如 Google Chrome
- 熟悉標準的 Linux 文字編輯器,例如 Vim、Emacs 和 GNU Nano
您會如何使用本程式碼研究室?
針對建立 HTML 和 CSS 網頁應用程式的經驗,您會給予什麼評價?
針對使用 Google Cloud 服務的經驗,您會給予什麼評價?
2. 設定和需求
自修環境設定
提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID
。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。
執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
Cloud Shell
您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境。
啟用 Cloud Shell
- 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 。
如果您從未啟動 Cloud Shell,您會看見中繼畫面 (需捲動位置),說明螢幕內容。如果出現這種情況,請按一下「繼續」 (之後不會再顯示)。以下是單次畫面的外觀:
佈建並連線至 Cloud Shell 只需幾分鐘的時間。
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可以透過瀏覽器或 Chromebook 完成。
連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。
- 在 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-web
和 spring-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 內建的程式碼編輯器:
$ 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 啟動條件。
瞭解詳情
- Cloud Storage
- 在 Google Cloud 中使用 Spring Framework
- Google Cloud GitHub 存放區 Spring
- 在 Google Cloud 中使用 Java
授權
這項內容採用的是創用 CC 姓名標示 2.0 通用授權。