從零搭建Spring Boot腳手架(7):整合OSS做爲文件服務器

1. 前言

文件服務器是一個應用必要的組件之一。最先我搞過FTP,而後又用過FastDFS,接私活的時候我用MongoDB也湊合湊合。現現在時代不一樣了,開始流行起了OSSjava

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

GitHub: https://github.com/NotFound40... day06 分支 歡迎Stargit

2. 什麼是OSS

全稱爲Object Storage Service,也叫對象存儲服務,是一種解決和處理離散單元的方法,可提供基於分佈式系統之上的對象形式的數據存儲服務,具備可拓展、可管理、低成本等特色,支持中心和邊緣存儲,可以實現存儲需求的彈性伸縮,主要應用於海量數據管理的各種場景。github

這概念真是夠難以理解的。簡單說點我知道的吧,日常咱們的文件地址都是 /User/felord/video/xxx.mp4的目錄樹結構,系統先要找到User,而後一級一級往下找一直到目標爲止,這是一種結構化的存儲方式。對象存儲就不同了,全部的文件都放在一個特定的池子裏,只不過文件的攜帶有它本身的元信息,經過元信息去檢索文件。這裏舉一個形象的例子:spring

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

上圖的oss就是一個對象存儲,它裏面存了攜帶信息不同、甚至結構都不同的東西,咱們能夠根據其元信息meta檢索它們。OSS具備如下特色:json

  • 效率更高。不受複雜目錄系統對性能的影響。
  • 可擴展性更強。分佈式架構,更便於進行水平擴展,從而容納進任意大規模的數據。
  • 可用性更強。數據通常都會有多個位於不一樣機器的複製,確保數據不丟失。
  • 平臺無關,能夠經過Restful接口進行操做對象。
OSS一般被用來存儲圖片、音視頻等文件,以及對這些文件的處理。

3. 哪些OSS可使用

一般咱們有兩種選擇,花錢買或者本身搞。服務器

充錢才能變得更強

這句話這裏也是很實用的,目前幾乎全部的雲廠商都有本身的對象存儲產品,你能夠對比一下花錢購買它們,經過配合CDN能達到很是好的用戶體驗,胖哥的felord.cn就使用了雲廠商的對象存儲。購買他們的服務架構

  • 可靠性強,數據丟失可能性低。
  • 免維護,不須要自行維護。
  • 可配合其它一些特點功能,好比縮略圖、CDN等等。

本身動手豐衣足食

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

一種是Ceph,一個分佈式存儲系統,高可用,高擴展性。可是通常人玩不轉,就連開源中國紅薯都被坑慘了😆。分佈式

大半年後紅薯被Ceph玩壞了

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

Minio Logo

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

4. 整合到Spring Boot

不管你花錢仍是本身搞均可以,這兩種方式各有各的好處。因此我要把這兩種方式整合到kono Spring Boot腳手架項目中。這種組件封裝成爲Spring Boot Starter再好不過了。在平常開發中這種基礎組件都建議作成Starter。參考個人 最強自定義Spring Boot Starter教程裏的方式,我將aliyunOSS SDKMinio SDK封裝成Starter了。

達到了開箱即用。並且很是靈活,你配置哪一種使用哪一種,能夠二選一,也能夠全都要,還能夠全都不要。

項目地址: https://gitee.com/felord/oss-...

獲取到項目後經過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,能夠理解爲一個對象池。

建立 bucket

而後把策略設置爲可讀寫

編輯名稱爲img的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進行了實現。

對應的兩種實現

並分別以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. 總結

今天的整合與往常不太同樣,主要是一些通用功能的組件化封裝的實際演示,另外簡單描述了對象存儲的功能和使用場景,但願對你有用。多多關注:碼農小胖哥,跟我一塊兒整合腳手架。

關注公衆號:Felordcn 獲取更多資訊

我的博客:https://felord.cn

相關文章
相關標籤/搜索