本文檔通過一個樣本向您介紹如何在本地Spring Cloud應用中實現Object Storage Service,並將該應用託管到EDAS中。
為什麼使用OSS
OSS是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存體服務。具有與平台無關的RESTful API介面,您可以在Spring Cloud開發的應用中儲存和訪問任意類型的資料。
準備工作
在應用中實現Object Storage Service功能前,您需要先使用您的阿里雲帳號在OSS建立儲存空間。
在本地實現Object Storage Service
建立一個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)。