本文档通过一个示例向您介绍如何在本地Spring Cloud应用中实现对象存储,并将该应用托管到EDAS中。
为什么使用OSS
OSS是阿里云提供的海量、安全、低成本、高可靠的云存储服务。具有与平台无关的RESTful API接口,您可以在Spring Cloud开发的应用中存储和访问任意类型的数据。
准备工作
在应用中实现对象存储功能前,您需要先使用您的阿里云账号在OSS创建存储空间。
在本地实现对象存储
创建一个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
。{ "name": "oss-test" }
在package
spring.cloud.alicloud.oss
下创建类OssController
并添加配置,包含上传、下载,以及使用Spring的Resource规范获取文件的功能。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的文件内容。
{ "name": "oss-test" }
在浏览器访问http://127.0.0.1:18084/file-resource即可获得示例文件oss-test.json的内容。
{ "name": "oss-test" }
部署应用到EDAS
Spring Cloud AliCloud OSS在设计之初就考虑到了从开发环境迁移到EDAS的场景,您可以直接将应用部署到EDAS中,无需修改任何代码和配置。关于部署方式和详细步骤的相关内容,请参见创建和部署应用概述(K8s)和应用创建和部署概述(ECS)。