
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,一個分布式存盤系統,高可用,高擴展性,但是一般人玩不轉,就連開源中國的紅薯都被坑慘了??,

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

因為安裝過于簡單就不演示了,
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,可以理解為一個物件池,

然后把策略設定為可讀寫,


搞完開始在專案中配置,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進行了實作,

并分別以aliyunStorage、minioStorage為名稱將AliyunStorage和MinioStorage注入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. 總結
今天的整合與往常不太一樣,主要是一些通用功能的組件化封裝的實際演示,另外簡單描述了物件存盤的功能和使用場景,希望對你有用,多多關注:碼農小胖哥,跟我一起整合腳手架,
關注公眾號:Felordcn 獲取更多資訊
個人博客:https://felord.cn
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/51221.html
標籤:Java
