從零搭建Spring Boot腳手架(7):整合OSS作為文件服務(wù)器

1. 前言

文件服務(wù)器是一個(gè)應(yīng)用必要的組件之一。最早我搞過FTP衙吩,然后又用過FastDFS互妓,接私活的時(shí)候我用MongoDB也湊合湊合。現(xiàn)如今時(shí)代不同了坤塞,開始流行起了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ù)管理的各類場景。

這概念真是夠難以理解的挣轨。簡單說點(diǎn)我知道的吧军熏,平常我們的文件地址都是 /User/felord/video/xxx.mp4的目錄樹結(jié)構(gòu),系統(tǒng)先要找到User卷扮,然后一級(jí)一級(jí)往下找一直到目標(biāo)為止荡澎,這是一種結(jié)構(gòu)化的存儲(chǔ)方式。對(duì)象存儲(chǔ)就不一樣了晤锹,所有的文件都放在一個(gè)特定的池子里摩幔,只不過文件的攜帶有它自己的元信息,通過元信息去檢索文件鞭铆。這里舉一個(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)無關(guān),可以通過Restful接口進(jìn)行操作對(duì)象拯欧。

OSS通常被用來存儲(chǔ)圖片详囤、音視頻等文件,以及對(duì)這些文件的處理镐作。

3. 哪些OSS可以使用

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

充錢才能變得更強(qiáng)

這句話這里也是很實(shí)用的该贾,目前幾乎所有的云廠商都有自己的對(duì)象存儲(chǔ)產(chǎn)品羔杨,你可以對(duì)比一下花錢購買它們,通過配合CDN能達(dá)到非常好的用戶體驗(yàn)杨蛋,胖哥的felord.cn就使用了云廠商的對(duì)象存儲(chǔ)兜材。購買他們的服務(wù)

  • 可靠性強(qiáng),數(shù)據(jù)丟失可能性低逞力。

  • 免維護(hù)曙寡,不需要自行維護(hù)。

  • 可配合其它一些特色功能寇荧,比如縮略圖举庶、CDN等等。

自己動(dòng)手豐衣足食

不想花錢就只能自己動(dòng)手了揩抡,目前我知道的開源方案有兩種户侥。

一種是Ceph,一個(gè)分布式存儲(chǔ)系統(tǒng),高可用峦嗤,高擴(kuò)展性蕊唐。但是一般人玩不轉(zhuǎn),就連開源中國紅薯都被坑慘了??烁设。

大半年后紅薯被Ceph玩壞了

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

Minio Logo

因?yàn)榘惭b過于簡單就不演示了箕别。

4. 整合到Spring Boot

無論你花錢還是自己搞都可以铜幽,這兩種方式各有各的好處滞谢。所以我要把這兩種方式整合到kono Spring Boot腳手架項(xiàng)目中。這種組件封裝成為Spring Boot Starter再好不過了除抛。在日常開發(fā)中這種基礎(chǔ)組件都建議做成Starter狮杨。參考我的 最強(qiáng)自定義Spring Boot Starter教程里的方式,我將aliyunOSS SDKMinio SDK封裝成Starter了到忽。

達(dá)到了開箱即用橄教。而且非常靈活,你配置哪種使用哪種喘漏,可以二選一护蝶,也可以全都要,還可以全都不要翩迈。

項(xiàng)目地址: https://gitee.com/felord/oss-spring-boot.git持灰。

獲取到項(xiàng)目后通過Maven命令mvn install安裝到本地依賴庫,或者你發(fā)布到你的遠(yuǎn)程私有Maven倉庫负饲。然后再引用Starter堤魁,切記先后步驟

<!--  一定要先拉取項(xiàng)目通過 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ì)象池返十。

創(chuàng)建 bucket

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

編輯名稱為img的bucket的策略
可讀寫策略

搞完開始在項(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)|西用來配置:

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)涛漂。

對(duì)應(yīng)的兩種實(shí)現(xiàn)

并分別以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. 總結(jié)

今天的整合與往常不太一樣匈仗,主要是一些通用功能的組件化封裝的實(shí)際演示,另外簡單描述了對(duì)象存儲(chǔ)的功能和使用場景逢慌,希望對(duì)你有用悠轩。多多關(guān)注:碼農(nóng)小胖哥,跟我一起整合腳手架。

關(guān)注公眾號(hào):碼農(nóng)小胖哥攻泼,獲取更多資訊

個(gè)人博客:https://felord.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末火架,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子忙菠,更是在濱河造成了極大的恐慌何鸡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牛欢,死亡現(xiàn)場離奇詭異骡男,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)傍睹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門隔盛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犹菱,“玉大人,你說我怎么就攤上這事吮炕±巴眩” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵龙亲,是天一觀的道長陕凹。 經(jīng)常有香客問我,道長俱笛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任传趾,我火速辦了婚禮迎膜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浆兰。我一直安慰自己磕仅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布簸呈。 她就那樣靜靜地躺著榕订,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕便。 梳的紋絲不亂的頭發(fā)上劫恒,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音轿腺,去河邊找鬼两嘴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛族壳,可吹牛的內(nèi)容都是我干的憔辫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼仿荆,長吁一口氣:“原來是場噩夢啊……” “哼贰您!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拢操,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤锦亦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后令境,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孽亲,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年展父,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了返劲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玲昧。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖篮绿,靈堂內(nèi)的尸體忽然破棺而出孵延,到底是詐尸還是另有隱情,我是刑警寧澤亲配,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布尘应,位于F島的核電站,受9級(jí)特大地震影響吼虎,放射性物質(zhì)發(fā)生泄漏犬钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一思灰、第九天 我趴在偏房一處隱蔽的房頂上張望玷犹。 院中可真熱鬧,春花似錦洒疚、人聲如沸歹颓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巍扛。三九已至,卻和暖如春乏德,著一層夾襖步出監(jiān)牢的瞬間撤奸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工喊括, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寂呛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓瘾晃,卻偏偏與公主長得像贷痪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹦误,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345