关于此 Codelab
1. 概览
Spring Framework 提供了 ResourceLoader
抽象,可让您轻松地从文件系统、类路径或网页等各种来源读取和写入文件。您只需使用众所周知的协议前缀来指定资源的 URI。例如,如需访问本地文件系统上的文件,需指定 URI,如 file:/data/config.yaml
。
您将编写一个 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
您将如何使用此 Codelab?
您如何评价自己在构建 HTML 和 CSS Web 应用方面的经验水平?
您如何评价自己在使用 Google Cloud 服务方面的经验水平?
2. 设置和要求
自定进度的环境设置
如果您还没有 Google 帐号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:
请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_ID
。
接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Google Cloud 资源。
在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“清理”部分)。
Google Cloud Platform 的新用户有资格获享 $300 免费试用。
Cloud Shell
您将使用 Cloud Shell,它是在 Google Cloud 中运行的命令行环境。
激活 Google Cloud Shell
在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:
然后点击“启动 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].
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 中的存储浏览器,并验证该存储桶和文件是否存在。
4. 初始化 Spring Boot 应用
使用命令行开始编写应用,以通过 Spring Initializr 生成一个新的 Spring Boot 应用:
$ curl https://start.spring.io/starter.tgz \ -d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -
请注意,Initializr 会自动将 spring-boot-starter-web
和 spring-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
)终止它。
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.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
)终止它。
6. 写入 Cloud Storage 中的文件
您将读取 Cloud Storage 中文件的内容,并通过 Spring REST 控制器将其公开。现在,将新文件内容发布到同一 HTTP 端点,以更改该文件的内容。
您需要向 GcsController
添加另一个响应 HTTP POST 的方法,并将数据写入 Cloud Storage 中的文件。这次,将 Spring 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
)终止它。
7. 恭喜!
您学习了如何使用 Spring Resource 抽象来轻松访问 Cloud Storage 中的文件。您编写了可以对 Cloud Storage 中的文件执行读写操作的 Spring Boot Web 应用。您还了解了适用于 Cloud Storage 的 Spring Boot 入门版(启用了该功能)。
了解详情
许可
此作品已获得 Creative Commons Attribution 2.0 通用许可授权。