使用 Spring Resource 抽象访问 Cloud Storage 中的文件

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 的 ResourceWritableResource 抽象

所需的条件

  • Google Cloud 项目
  • 浏览器,例如 Google Chrome
  • 熟悉标准的 Linux 文本编辑器,例如 Vim、Emacs 和 GNU Nano

您将如何使用此 Codelab?

仅阅读 阅读并完成练习

您如何评价自己在构建 HTML 和 CSS Web 应用方面的经验水平?

新手水平 中等水平 熟练水平

您如何评价自己在使用 Google Cloud 服务方面的经验水平?

新手水平 中等水平 熟练水平

自定进度的环境设置

如果您还没有 Google 帐号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:

2016-02-10 12:45:26.png 的屏幕截图

请记住项目 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].

启动 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 -

请注意,Initializr 会自动将 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 应用以访问 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)终止它。

您将读取 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)终止它。

您学习了如何使用 Spring Resource 抽象来轻松访问 Cloud Storage 中的文件。您编写了可以对 Cloud Storage 中的文件执行读写操作的 Spring Boot Web 应用。您还了解了适用于 Cloud Storage 的 Spring Boot 入门版(启用了该功能)。

了解详情

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。