從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程

1. 前言
文件服務(wù)器是一個(gè)應(yīng)用必要的組件之一。最早我搞過(guò)FTP,然后又用過(guò)FastDFS,接私活的時(shí)候我用MongoDB也湊合湊合?,F(xiàn)如今時(shí)代不同了,開(kāi)始流行起了OSS。
Gitee: https://gitee.com/felord/kono day06 分支 歡迎Star
GitHub: https://github.com/NotFound403/kono day06 分支 歡迎Star
2. 什么是OSS
全稱為Object Storage Service,也叫對(duì)象存儲(chǔ)服務(wù),是一種解決和處理離散單元的方法,可提供基于分布式系統(tǒng)之上的對(duì)象形式的數(shù)據(jù)存儲(chǔ)服務(wù),具有可拓展、可管理、低成本等特點(diǎn),支持中心和邊緣存儲(chǔ),能夠?qū)崿F(xiàn)存儲(chǔ)需求的彈性伸縮,主要應(yīng)用于海量數(shù)據(jù)管理的各類場(chǎng)景。
這概念真是夠難以理解的。簡(jiǎn)單說(shuō)點(diǎn)我知道的吧,平常我們的文件地址都是 /User/felord/video/xxx.mp4的目錄樹(shù)結(jié)構(gòu),系統(tǒng)先要找到User,然后一級(jí)一級(jí)往下找一直到目標(biāo)為止,這是一種結(jié)構(gòu)化的存儲(chǔ)方式。對(duì)象存儲(chǔ)就不一樣了,所有的文件都放在一個(gè)特定的池子里,只不過(guò)文件的攜帶有它自己的元信息,通過(guò)元信息去檢索文件。這里舉一個(gè)形象的例子:
{"oss":[
{"file":"xxxxx","meta":{"id":"1111"},"type":""},
{"content":"xxxxx","meta":{"id":"1211"},"type":"","created":"","name":""},
]}
上圖的oss就是一個(gè)對(duì)象存儲(chǔ),它里面存了攜帶信息不一樣、甚至結(jié)構(gòu)都不一樣的東西,我們可以根據(jù)其元信息meta檢索它們。OSS具有以下特點(diǎn):
- 效率更高。不受復(fù)雜目錄系統(tǒng)對(duì)性能的影響。
- 可擴(kuò)展性更強(qiáng)。
- 分布式架構(gòu),更便于進(jìn)行水平擴(kuò)展,從而容納進(jìn)任意大規(guī)模的數(shù)據(jù)。
- 可用性更強(qiáng)。
- 數(shù)據(jù)一般都會(huì)有多個(gè)位于不同機(jī)器的復(fù)制,確保數(shù)據(jù)不丟失。
- 平臺(tái)無(wú)關(guān),可以通過(guò)Restful接口進(jìn)行操作對(duì)象。
OSS通常被用來(lái)存儲(chǔ)圖片、音視頻等文件,以及對(duì)這些文件的處理。
3. 哪些OSS可以使用
通常我們有兩種選擇,花錢買或者自己搞。
充錢才能變得更強(qiáng)
這句話這里也是很實(shí)用的,目前幾乎所有的云廠商都有自己的對(duì)象存儲(chǔ)產(chǎn)品,你可以對(duì)比一下花錢購(gòu)買它們,通過(guò)配合CDN能達(dá)到非常好的用戶體驗(yàn),胖哥的felord.cn就使用了云廠商的對(duì)象存儲(chǔ)。購(gòu)買他們的服務(wù)
- 可靠性強(qiáng),數(shù)據(jù)丟失可能性低。
- 免維護(hù),不需要自行維護(hù)。
- 可配合其它一些特色功能,比如縮略圖、CDN等等。
自己動(dòng)手豐衣足食
不想花錢就只能自己動(dòng)手了,目前我知道的開(kāi)源方案有兩種。
一種是Ceph,一個(gè)分布式存儲(chǔ)系統(tǒng),高可用,高擴(kuò)展性。但是一般人玩不轉(zhuǎn),就連開(kāi)源中國(guó)的紅薯都被坑慘了😆。

另一種是Minio,用Golang寫(xiě)的。我目前還沒(méi)發(fā)現(xiàn)有什么坑,文檔居然還有中文文檔!我用Docker不到三分鐘就玩起來(lái)了,居然還自帶控制臺(tái)!其它功能也挺齊全,各種客戶端SDK齊全。

因?yàn)榘惭b過(guò)于簡(jiǎn)單就不演示了。
4. 整合到Spring Boot
無(wú)論你花錢還是自己搞都可以,這兩種方式各有各的好處。所以我要把這兩種方式整合到kono Spring Boot腳手架項(xiàng)目中。這種組件封裝成為Spring Boot Starter再好不過(guò)了。在日常開(kāi)發(fā)中這種基礎(chǔ)組件都建議做成Starter。參考我的 最強(qiáng)自定義Spring Boot Starter教程里的方式,我將aliyun的OSS SDK和Minio SDK封裝成Starter了。
達(dá)到了開(kāi)箱即用。而且非常靈活,你配置哪種使用哪種,可以二選一,也可以全都要,還可以全都不要。
項(xiàng)目地址: https://gitee.com/felord/oss-spring-boot.git。
獲取到項(xiàng)目后通過(guò)Maven命令mvn install安裝到本地依賴庫(kù),或者你發(fā)布到你的遠(yuǎn)程私有Maven倉(cāng)庫(kù)。然后再引用Starter,切記先后步驟:
<!-- 一定要先拉取項(xiàng)目通過(guò) mvn install 安裝到本地 --> <dependency> <groupId>cn.felord</groupId> <artifactId>oss-spring-boot-starter</artifactId> <version>1.0.0.RELEASE</version> </dependency>
Minio配置流程
接著就是使用了,先在你Minio的控制臺(tái)上創(chuàng)建一個(gè)bucket,可以理解為一個(gè)對(duì)象池。

然后把策略設(shè)置為可讀寫(xiě)。


搞完開(kāi)始在項(xiàng)目中配置,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控制臺(tái)申請(qǐng)跟Minio差不多的幾樣?xùn)|西用來(lái)配置:
oss: aliyun: active: true access-key-id: LTAI4GH4EQXtKEbJDrADvWNH access-key-secret: XjDpNn5JqHAHPDXGL6xIebyUkyFAZ7 endpoint: oss-cn-beijing.aliyuncs.com
Starter的使用
以下是我對(duì)OSS操作的抽象接口:
package cn.felord.oss;
import java.io.InputStream;
/**
* The interface Storage.
*
* @author felord.cn
* @since 2020 /8/24 19:54
*/
public interface Storage {
/**
* 存放對(duì)象
*
* @param bucketName bucket 名稱
* @param objectName 自定義對(duì)象名稱
* @param inputStream 對(duì)象的輸入流
* @param contentType 參考http 的 MimeType 值
* @throws Exception the exception
*/
void putObject(String bucketName, String objectName, InputStream inputStream, String contentType) throws Exception;
/**
* 獲取對(duì)象
*
* @param bucketName the bucket name
* @param objectName the object name
* @return the object
*/
InputStream getObject(String bucketName, String objectName) throws Exception;
/**
* 獲取對(duì)象的URL
*
* @param bucketName the bucket name
* @param objectName the object name
* @return the object url
*/
String getObjectUrl(String bucketName, String objectName) throws Exception;
/**
* 刪除對(duì)象
*
* @param bucketName the bucket name
* @param objectName the object name
*/
void removeObject(String bucketName, String objectName) throws Exception;
}
然后分別使用了以上兩種OSS進(jìn)行了實(shí)現(xiàn)。

并分別以aliyunStorage、minioStorage為名稱將AliyunStorage和MinioStorage注入Spring IoC。
使用起來(lái)非常簡(jiǎn)單:
@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. 總結(jié)
今天的整合與往常不太一樣,主要是一些通用功能的組件化封裝的實(shí)際演示,另外簡(jiǎn)單描述了對(duì)象存儲(chǔ)的功能和使用場(chǎng)景,希望對(duì)你有用。
到此這篇關(guān)于從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程的文章就介紹到這了,更多相關(guān)Spring Boot整合OSS文件服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用ObjectMapper把Json轉(zhuǎn)換為復(fù)雜的實(shí)體類
這篇文章主要介紹了使用ObjectMapper把Json轉(zhuǎn)換為復(fù)雜的實(shí)體類操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng)步驟詳解
這篇文章主要介紹了SpringBoot?項(xiàng)目的創(chuàng)建與啟動(dòng),本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
mybatis-plus @select動(dòng)態(tài)查詢方式
這篇文章主要介紹了mybatis-plus @select動(dòng)態(tài)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringCloud集成Sleuth和Zipkin的思路講解
Zipkin 是 Twitter 的一個(gè)開(kāi)源項(xiàng)目,它基于 Google Dapper 實(shí)現(xiàn),它致力于收集服務(wù)的定時(shí)數(shù)據(jù),以及解決微服務(wù)架構(gòu)中的延遲問(wèn)題,包括數(shù)據(jù)的收集、存儲(chǔ)、查找和展現(xiàn),這篇文章主要介紹了SpringCloud集成Sleuth和Zipkin,需要的朋友可以參考下2022-11-11
java使用HashMap實(shí)現(xiàn)斗地主(有序版)
這篇文章主要為大家詳細(xì)介紹了java使用ArrayList實(shí)現(xiàn)斗地主游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03

