本文档通过一个示例向您介绍如何在本地Spring Cloud应用中实现对象存储,并将该应用托管到EDAS中。
为什么使用OSS
OSS是阿里云提供的海量、安全、低成本、高可靠的云存储服务。具有与平台无关的RESTful API接口,您可以在Spring Cloud开发的应用中存储和访问任意类型的数据。
在本地实现对象存储
- 创建一个Maven工程,命名为
oss-example
。
- 在
pom.xml
文件中添加如下依赖。
以Spring Boot 2.1.4.RELEASE和Spring Cloud Greenwich.SR1为例。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
说明
- 如果您需要选择使用Spring Boot 1.x的版本,请使用Spring Boot 1.5.x和Spring Cloud Edgware版本,对应的Spring Cloud Alibaba版本为1.5.1.RELEASE。
- Spring Boot 1.x版本的生命周期已结束,推荐使用Spring Boot新版本开发您的应用。
- 在
src/main/java
下创建一个package,如spring.cloud.alicloud.oss
。
- 在package
spring.cloud.alicloud.oss
下创建oss-example
的启动类OssApplication
。 package spring.cloud.alicloud.oss;
import com.aliyun.oss.OSS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.net.URISyntaxException;
@SpringBootApplication
public class OssApplication {
public static final String BUCKET_NAME = "test-bucket";
public static void main(String[] args) throws URISyntaxException {
SpringApplication.run(OssApplication.class, args);
}
@Bean
public AppRunner appRunner() {
return new AppRunner();
}
class AppRunner implements ApplicationRunner {
@Autowired
private OSS ossClient;
@Override
public void run(ApplicationArguments args) throws Exception {
try {
if (!ossClient.doesBucketExist(BUCKET_NAME)) {
ossClient.createBucket(BUCKET_NAME);
}
} catch (Exception e) {
System.err.println("oss handle bucket error: " + e.getMessage());
System.exit(-1);
}
}
}
}
- 在
src/main/resources
路径下再添加一个用于上传的示例文件oss-test.json
。
- 在package
spring.cloud.alicloud.oss
下创建类OssController
并添加配置,包含上传、下载,以及使用Spring的Resouce规范获取文件的功能。 package spring.cloud.alicloud.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.IOUtils;
import com.aliyun.oss.model.OSSObject;
import org.apache.commons.codec.CharEncoding;
import org.springframework.beans.factory.annotation.Autowired;
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;
import java.nio.charset.Charset;
@RestController
public class OssController {
@Autowired
private OSS ossClient;
@Value("oss://" + OssApplication.BUCKET_NAME + "/oss-test.json")
private Resource file;
@GetMapping("/upload")
public String upload() {
try {
ossClient.putObject(OssApplication.BUCKET_NAME, "oss-test.json", this
.getClass().getClassLoader().getResourceAsStream("oss-test.json"));
} catch (Exception e) {
e.printStackTrace();
return "upload fail: " + e.getMessage();
}
return "upload success";
}
@GetMapping("/file-resource")
public String fileResource() {
try {
return "get file resource success. content: " + StreamUtils.copyToString(
file.getInputStream(), Charset.forName(CharEncoding.UTF_8));
} catch (Exception e) {
e.printStackTrace();
return "get resource fail: " + e.getMessage();
}
}
@GetMapping("/download")
public String download() {
try {
OSSObject ossObject = ossClient.getObject(OssApplication.BUCKET_NAME, "oss-test.json");
return "download success, content: " + IOUtils
.readStreamAsString(ossObject.getObjectContent(), CharEncoding.UTF_8);
} catch (Exception e) {
e.printStackTrace();
return "download fail: " + e.getMessage();
}
}
}
- 获取AccessKey ID、AccessKey Secret和Endpoint,并在本地添加配置。
- 登录安全信息管理页面,获取AccessKey ID和AccessKey Secret。
- 按创建存储空间的地域获取Endpoint,具体操作,请参见访问域名和数据中心。
- 在
src/main/resources
路径下创建application.properties
文件,并添加AccessKey ID、AccessKey Secret和Endpoint配置。spring.application.name=oss-example
server.port=18084
# 填写 Access Key ID
spring.cloud.alicloud.access-key=xxxxx
# 填写 Access Key Secret
spring.cloud.alicloud.secret-key=xxxxx
# 填写 Endpoint
spring.cloud.alicloud.oss.endpoint=xxx.aliyuncs.com
management.endpoints.web.exposure.include=*
- 执行
OssApplication
中的main函数,启动服务。
结果验证
- 在浏览器中访问http://127.0.0.1:18084/upload。
如果提示upload success
,则说明示例文件oss-test.json
上传成功。否则,请检查本地代码,排查问题,然后再次执行OssApplication
中的main函数,启动服务。
- 登录OSS控制台,进入您创建并上传文件的Bucket,然后在左侧导航栏单击文件管理,查看是否有示例文件。
如果看到oss-test.json,则说明上传成功。否则,请检查本地代码,排查问题,然后再次执行OssApplication中的main函数,启动服务。
- 在浏览器访问http://127.0.0.1:18084/download即可下载文件,会得到oss-test.json的文件内容。
- 在浏览器访问http://127.0.0.1:18084/file-resource即可获得示例文件oss-test.json的内容。
部署应用到EDAS
Spring Cloud AliCloud OSS在设计之初就考虑到了从开发环境迁移到EDAS的场景,您可以直接将应用部署到EDAS中,无需修改任何代码和配置。关于部署方式和详细步骤的相关内容,请参见创建和部署应用概述(K8s)和应用创建和部署概述(ECS)。