全部产品
云市场

实现对象存储

更新时间:2019-07-22 15:12:49

本文档通过一个示例向您介绍如何在本地 Spring Cloud 应用中实现对象存储,并将该应用托管到 EDAS 中。

为什么使用 OSS

OSS 是阿里云提供的海量、安全、低成本、高可靠的云存储服务。具有与平台无关的 RESTful API 接口,您可以在 Spring Cloud 开发的应用中存储和访问任意类型的数据。

准备工作

在应用中实现对象存储功能前,您需要先使用您的阿里云账号在 OSS 创建存储空间。

  1. 开通 OSS 服务

  2. 创建存储空间

在本地实现对象存储

  1. 创建一个 Maven 工程,命名为oss-example

  2. Spring Boot 2.0.6.RELEASESpring Cloud Finchley.SR1 为例,在pom.xml文件中添加如下依赖。

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.0.6.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.cloud</groupId>
    10. <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
    11. <version>0.2.1.RELEASE</version>
    12. </dependency>
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-web</artifactId>
    16. </dependency>
    17. </dependencies>
    18. <dependencyManagement>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.cloud</groupId>
    22. <artifactId>spring-cloud-dependencies</artifactId>
    23. <version>Finchley.SR1</version>
    24. <type>pom</type>
    25. <scope>import</scope>
    26. </dependency>
    27. </dependencies>
    28. </dependencyManagement>

说明

  • 如果您需要选择使用 Spring Boot 1.x 的版本,请使用 Spring Boot 1.5.xSpring Cloud Edgware 版本,对应的 Spring Cloud Alibaba 版本为 0.1.1.RELEASE
  • Spring Boot 1.x 版本的生命周期即将在 2019 年 8 月 结束,推荐使用 Spring Boot 新版本开发您的应用。
  1. src/main/java下创建一个 package,如spring.cloud.alicloud.oss

  2. 在 packagespring.cloud.alicloud.oss下创建oss-example的启动类OssApplication

    1. package spring.cloud.alicloud.oss;
    2. import com.aliyun.oss.OSS;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.boot.ApplicationArguments;
    5. import org.springframework.boot.ApplicationRunner;
    6. import org.springframework.boot.SpringApplication;
    7. import org.springframework.boot.autoconfigure.SpringBootApplication;
    8. import org.springframework.context.annotation.Bean;
    9. import java.net.URISyntaxException;
    10. @SpringBootApplication
    11. public class OssApplication {
    12. public static final String BUCKET_NAME = "test-bucket";
    13. public static void main(String[] args) throws URISyntaxException {
    14. SpringApplication.run(OssApplication.class, args);
    15. }
    16. @Bean
    17. public AppRunner appRunner() {
    18. return new AppRunner();
    19. }
    20. class AppRunner implements ApplicationRunner {
    21. @Autowired
    22. private OSS ossClient;
    23. @Override
    24. public void run(ApplicationArguments args) throws Exception {
    25. try {
    26. if (!ossClient.doesBucketExist(BUCKET_NAME)) {
    27. ossClient.createBucket(BUCKET_NAME);
    28. }
    29. } catch (Exception e) {
    30. System.err.println("oss handle bucket error: " + e.getMessage());
    31. System.exit(-1);
    32. }
    33. }
    34. }
    35. }
  3. src/main/resources路径下再添加一个用于上传的示例文件oss-test.json

    1. {
    2. "name": "oss-test"
    3. }
  4. 在 packagespring.cloud.alicloud.oss下创建类OssController并添加配置,包含上传、下载,以及使用 Spring 的 Resouce 规范获取文件的功能。

    1. package spring.cloud.alicloud.oss;
    2. import com.aliyun.oss.OSS;
    3. import com.aliyun.oss.common.utils.IOUtils;
    4. import com.aliyun.oss.model.OSSObject;
    5. import org.apache.commons.codec.CharEncoding;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.beans.factory.annotation.Value;
    8. import org.springframework.core.io.Resource;
    9. import org.springframework.util.StreamUtils;
    10. import org.springframework.web.bind.annotation.GetMapping;
    11. import org.springframework.web.bind.annotation.RestController;
    12. import java.nio.charset.Charset;
    13. @RestController
    14. public class OssController {
    15. @Autowired
    16. private OSS ossClient;
    17. @Value("oss://" + OssApplication.BUCKET_NAME + "/oss-test.json")
    18. private Resource file;
    19. @GetMapping("/upload")
    20. public String upload() {
    21. try {
    22. ossClient.putObject(OssApplication.BUCKET_NAME, "oss-test.json", this
    23. .getClass().getClassLoader().getResourceAsStream("oss-test.json"));
    24. } catch (Exception e) {
    25. e.printStackTrace();
    26. return "upload fail: " + e.getMessage();
    27. }
    28. return "upload success";
    29. }
    30. @GetMapping("/file-resource")
    31. public String fileResource() {
    32. try {
    33. return "get file resource success. content: " + StreamUtils.copyToString(
    34. file.getInputStream(), Charset.forName(CharEncoding.UTF_8));
    35. } catch (Exception e) {
    36. e.printStackTrace();
    37. return "get resource fail: " + e.getMessage();
    38. }
    39. }
    40. @GetMapping("/download")
    41. public String download() {
    42. try {
    43. OSSObject ossObject = ossClient.getObject(OssApplication.BUCKET_NAME, "oss-test.json");
    44. return "download success, content: " + IOUtils
    45. .readStreamAsString(ossObject.getObjectContent(), CharEncoding.UTF_8);
    46. } catch (Exception e) {
    47. e.printStackTrace();
    48. return "download fail: " + e.getMessage();
    49. }
    50. }
    51. }
  5. 获取 Access Key ID、Access Key Secret 和 Endpoint,并在本地添加配置。

    1. 登录安全信息管理页面,获取 Access Key ID 和 Access Key Secret。

    2. 参考访问域名和数据中心,按创建存储空间的地域获取 Endpoint。

    3. src/main/resources路径下创建application.properties文件,并添加 Access Key ID、Access Key Secret 和 Endpoint 配置。

      1. spring.application.name=oss-example
      2. server.port=18084
      3. # 填写 Access Key ID
      4. spring.cloud.alicloud.access-key=xxxxx
      5. # 填写 Access Key Secret
      6. spring.cloud.alicloud.secret-key=xxxxx
      7. # 填写 Endpoint
      8. spring.cloud.alicloud.oss.endpoint=xxx.aliyuncs.com
      9. management.endpoints.web.exposure.include=*
  6. 执行OssApplication中的 main 函数,启动服务。

结果验证

  1. 在浏览器中访问 http://127.0.0.1:18084/upload。

    如果提示upload success,则说明示例文件oss-test.json上传成功。否则,请检查本地代码,排查问题,然后再次执行OssApplication中的 main 函数,启动服务。

  2. 登录OSS控制台,进入您创建并上传文件的 Bucket,然后在顶部单击文件管理,查看是否有示例文件。

    如果看到oss-test.json,则说明上传成功。否则,请检查本地代码,排查问题,然后再次执行OssApplication中的 main 函数,启动服务。

  3. 在浏览器访问 http://127.0.0.1:18084/download 即可下载文件,会得到 oss-test.json 的文件内容。

    1. {
    2. "name": "oss-test"
    3. }
  4. 在浏览器访问 http://127.0.0.1:18084/file-resource 即可获得示例文件oss-test.json的内容。

    1. {
    2. "name": "oss-test"
    3. }

部署应用到 EDAS

Spring Cloud AliCloud OSS 在设计之初就考虑到了从开发环境迁移到 EDAS 的场景,您可以直接将应用部署到 EDAS 中,无需修改任何代码和配置。部署方式和详细步骤请参考应用部署概述