1. 程式人生 > 程式設計 >從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

1. 前言

檔案伺服器是一個應用必要的元件之一。最早我搞過FTP,然後又用過FastDFS,接私活的時候我用MongoDB也湊合湊合。現如今時代不同了,開始流行起了OSS。

Gitee: https://gitee.com/felord/kono day06 分支 歡迎Star

GitHub: https://github.com/NotFound403/kono day06 分支 歡迎Star

2. 什麼是OSS

全稱為Object Storage Service,也叫物件儲存服務,是一種解決和處理離散單元的方法,可提供基於分散式系統之上的物件形式的資料儲存服務,具有可拓展、可管理、低成本等特點,支援中心和邊緣儲存,能夠實現儲存需求的彈性伸縮,主要應用於海量資料管理的各類場景。

這概念真是夠難以理解的。簡單說點我知道的吧,平常我們的檔案地址都是 /User/felord/video/xxx.mp4的目錄樹結構,系統先要找到User,然後一級一級往下找一直到目標為止,這是一種結構化的儲存方式。物件儲存就不一樣了,所有的檔案都放在一個特定的池子裡,只不過檔案的攜帶有它自己的元資訊,通過元資訊去檢索檔案。這裡舉一個形象的例子:

{"oss":[
 {"file":"xxxxx","meta":{"id":"1111"},"type":""},{"content":"xxxxx","meta":{"id":"1211"},"type":"","created":"","name":""},]}

上圖的oss就是一個物件儲存,它裡面存了攜帶資訊不一樣、甚至結構都不一樣的東西,我們可以根據其元資訊meta檢索它們。OSS具有以下特點:

  • 效率更高。不受複雜目錄系統對效能的影響。
  • 可擴充套件性更強。
  • 分散式架構,更便於進行水平擴充套件,從而容納進任意大規模的資料。
  • 可用性更強。
  • 資料一般都會有多個位於不同機器的複製,確保資料不丟失。
  • 平臺無關,可以通過Restful介面進行操作物件。

OSS通常被用來儲存圖片、音視訊等檔案,以及對這些檔案的處理。

3. 哪些OSS可以使用

通常我們有兩種選擇,花錢買或者自己搞。

充錢才能變得更強

這句話這裡也是很實用的,目前幾乎所有的雲廠商都有自己的物件儲存產品,你可以對比一下花錢購買它們,通過配合CDN能達到非常好的使用者體驗,胖哥的felord.cn就使用了雲廠商的物件儲存。購買他們的服務

  • 可靠性強,資料丟失可能性低。
  • 免維護,不需要自行維護。
  • 可配合其它一些特色功能,比如縮圖、CDN等等。

自己動手豐衣足食

不想花錢就只能自己動手了,目前我知道的開源方案有兩種。

一種是Ceph,一個分散式儲存系統,高可用,高擴充套件性。但是一般人玩不轉,就連開源中國的紅薯都被坑慘了😆。

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

另一種是Minio,用Golang寫的。我目前還沒發現有什麼坑,文件居然還有中文文件!我用Docker不到三分鐘就玩起來了,居然還自帶控制檯!其它功能也挺齊全,各種客戶端SDK齊全。

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

因為安裝過於簡單就不演示了。

4. 整合到Spring Boot

無論你花錢還是自己搞都可以,這兩種方式各有各的好處。所以我要把這兩種方式整合到kono Spring Boot腳手架專案中。這種元件封裝成為Spring Boot Starter再好不過了。在日常開發中這種基礎元件都建議做成Starter。參考我的 最強自定義Spring Boot Starter教程裡的方式,我將aliyun的OSS SDK和Minio SDK封裝成Starter了。

達到了開箱即用。而且非常靈活,你配置哪種使用哪種,可以二選一,也可以全都要,還可以全都不要。

專案地址: https://gitee.com/felord/oss-spring-boot.git。

獲取到專案後通過Maven命令mvn install安裝到本地依賴庫,或者你釋出到你的遠端私有Maven倉庫。然後再引用Starter,切記先後步驟:

<!-- 一定要先拉取專案通過 mvn install 安裝到本地 -->
<dependency>
 <groupId>cn.felord</groupId>
 <artifactId>oss-spring-boot-starter</artifactId>
 <version>1.0.0.RELEASE</version>
</dependency>

Minio配置流程

接著就是使用了,先在你Minio的控制檯上建立一個bucket,可以理解為一個物件池。

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

然後把策略設定為可讀寫。

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

搞完開始在專案中配置,application.yaml中:

oss:
 minio:
 # 啟用 
 active: true 
 access-key: minio_access_key
 secret-key: felord_cn_sec_key
 # minio 地址 
 endpoint: http://localhost:9000

aliyun OSS 配置流程

額外引入依賴:

<dependency>
 <groupId>com.aliyun.oss</groupId>
 <artifactId>aliyun-sdk-oss</artifactId>
 <version>2.5.0</version>
</dependency>
<dependency>
 <groupId>com.aliyun</groupId>
 <artifactId>aliyun-java-sdk-core</artifactId>
 <version>4.3.8</version>
</dependency>

這是必須的步驟。

去ali OSS控制檯申請跟Minio差不多的幾樣東西用來配置:

oss:
 aliyun:
 active: true
 access-key-id: LTAI4GH4EQXtKEbJDrADvWNH
 access-key-secret: XjDpNn5JqHAHPDXGL6xIebyUkyFAZ7
 endpoint: oss-cn-beijing.aliyuncs.com

Starter的使用

以下是我對OSS操作的抽象介面:

package cn.felord.oss;

import java.io.InputStream;

/**
 * The interface Storage.
 *
 * @author felord.cn
 * @since 2020 /8/24 19:54
 */
public interface Storage {


 /**
  * 存放物件
  *
  * @param bucketName bucket 名稱
  * @param objectName 自定義物件名稱
  * @param inputStream 物件的輸入流
  * @param contentType 參考http 的 MimeType 值
  * @throws Exception the exception
  */
 void putObject(String bucketName,String objectName,InputStream inputStream,String contentType) throws Exception;

 /**
  * 獲取物件
  *
  * @param bucketName the bucket name
  * @param objectName the object name
  * @return the object
  */
 InputStream getObject(String bucketName,String objectName) throws Exception;

 /**
  * 獲取物件的URL
  *
  * @param bucketName the bucket name
  * @param objectName the object name
  * @return the object url
  */
 String getObjectUrl(String bucketName,String objectName) throws Exception;

 /**
  * 刪除物件
  *
  * @param bucketName the bucket name
  * @param objectName the object name
  */
 void removeObject(String bucketName,String objectName) throws Exception;

}

然後分別使用了以上兩種OSS進行了實現。

從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程

並分別以aliyunStorageminioStorage為名稱將AliyunStorageMinioStorage注入Spring IoC。

使用起來非常簡單:

@Autowired
@Qualifier("minioStorage")
Storage storage;

@Test
public void testOss() throws Exception {
 File file = new File("./456.jpg");

 InputStream inputStream = new FileInputStream(file);

 storage.putObject("img","pic_122",inputStream,MimeTypeUtils.IMAGE_JPEG_VALUE);
}

5. 總結

今天的整合與往常不太一樣,主要是一些通用功能的元件化封裝的實際演示,另外簡單描述了物件儲存的功能和使用場景,希望對你有用。

到此這篇關於從零搭建Spring Boot腳手架整合OSS作為檔案伺服器的詳細教程的文章就介紹到這了,更多相關Spring Boot整合OSS檔案伺服器內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!