全部產品
Search
文件中心

Enterprise Distributed Application Service:實現Object Storage Service

更新時間:Aug 31, 2024

本文檔通過一個樣本向您介紹如何在本地Spring Cloud應用中實現Object Storage Service,並將該應用託管到EDAS中。

為什麼使用OSS

OSS是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存體服務。具有與平台無關的RESTful API介面,您可以在Spring Cloud開發的應用中儲存和訪問任意類型的資料。

準備工作

在應用中實現Object Storage Service功能前,您需要先使用您的阿里雲帳號在OSS建立儲存空間。

  1. 開通OSS服務

  2. 控制台建立儲存空間

在本地實現Object Storage Service

  1. 建立一個Maven工程,命名為oss-example

  2. 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新版本開發您的應用。

  3. src/main/java下建立一個package,如spring.cloud.alicloud.oss

  4. 在packagespring.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);
                    }
                }
            }
        }                        
  5. src/main/resources路徑下再添加一個用於上傳的樣本檔案oss-test.json

     {
       "name": "oss-test"
     }                        
  6. 在packagespring.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();
                }
            }
        }                        
  7. 擷取AccessKey ID、AccessKey Secret和Endpoint,並在本地添加配置。

    1. 登入安全資訊管理頁面,擷取AccessKey ID和AccessKey Secret。

    2. 按建立儲存空間的地區擷取Endpoint,具體操作,請參見訪問網域名稱和資料中心

    3. 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=*                                
  8. 執行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的檔案內容。

     {
       "name": "oss-test"
     }                        
  4. 在瀏覽器訪問http://127.0.0.1:18084/file-resource即可獲得樣本檔案oss-test.json的內容。

     {
       "name": "oss-test"
     }                        

部署應用到EDAS

Spring Cloud AliCloud OSS在設計之初就考慮到了從開發環境遷移到EDAS的情境,您可以直接將應用部署到EDAS中,無需修改任何代碼和配置。關於部署方式和詳細步驟的相關內容,請參見建立和部署應用概述(K8s)應用建立和部署概述(ECS)