天天看點

「一站式」相容所有雲廠商檔案存儲Spring Boot 實作

背景

在網際網路發展的今天,近乎所有的雲廠商都提供對象存儲服務。一種海量、安全、低成本、高可靠的雲存儲服務,适合存放任意類型的檔案。容量和處理能力彈性擴充,多種存儲類型供選擇,全面優化存儲成本。

當我們在使用對應雲廠商産品的時候,隻需要引入對應嘗試提供的 SDK ,根據其開發文檔實作即可。但是當我們接入的雲廠商較多(或者能夠保證接口水準遷移時),我們要根據目标廠商接口破壞性修改。

如下提供了幾家廠商接口 SDK 上傳執行個體:

阿裡雲

// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// 建立OSSClient執行個體。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 建立PutObjectRequest對象。
String content = "Hello OSS";
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes()));

// 上傳字元串。
ossClient.putObject(putObjectRequest);

// 關閉OSSClient。
ossClient.shutdown();           

華為雲

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// 建立ObsClient執行個體
ObsClient obsClient = new ObsClient(ak, sk, endPoint);

obsClient.putObject("bucketname", "objectname", new File("localfile")); // localfile為待上傳的本地檔案路徑,需要指定到具體的檔案名           

七牛雲

Configuration cfg = new Configuration(Region.region0());
UploadManager uploadManager = new UploadManager(cfg);
String accessKey = "your access key";
String secretKey = "your secret key";
String localFilePath = "/home/qiniu/test.png";
String key = null;

Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
Response response = uploadManager.put(localFilePath, key, upToken);           

解決方案

Amazon S3 協定

Amazon 是最早提供對象存儲服務 的廠商,制定檔案存儲相關的業内标準,這意味着隻需要實作 S3 協定即可接入相容此協定的檔案存儲廠商和中間件。當然 S3 協定不僅僅是技術實作要求标準,對于可用性等都有具體的要求。

相容 S3 協定國内雲廠商

如何使用

  • 引入依賴。 引入此依賴,無需在引入雲廠商 SDK
<dependency>
    <groupId>com.pig4cloud.plugin</groupId>
    <artifactId>oss-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</dependency>           
  • 配置檔案存儲
oss:
  path-style-access: false    #請求路徑是否 XXX/{bucketName}
  endpoint: s3-cn-east-1.qiniucs.com
  access-key: xxx    # 雲廠商提供的key
  secret-key: xxx    # 雲廠商提供的密鑰
  bucketName: pig4cloud     # 上文建立的桶名稱           
  • 操作
@Autowire
private final OssTemplate ossTemplate;

ossTemplate.putObject(CommonConstants.BUCKET_NAME, fileName, file.getInputStream());           

支援 MINIO 等自建檔案存儲

  • 建立 minio
docker run -p 9000:9000 --name minio1 \
  -e "MINIO_ACCESS_KEY=lengleng" \
  -e "MINIO_SECRET_KEY=lengleng" \
  minio/minio server /data           
  • 配置 minio 參數
# 檔案系統
oss:
  path-style-access: true
  endpoint: http://IP:9000
  access-key: lengleng
  secret-key: lengleng
  bucketName: lengleng           
  • 使用 OssTemplate 上傳即可

源碼位址:

https://github.com/pig-mesh/oss-spring-boot-starter

歡迎 fork 擴充

項目推薦: Spring Cloud 、Spring Security OAuth2的RBAC權限管理系統 歡迎關注