文件服務器是一個應用必要的組件之一。最先我搞過FTP,而後又用過FastDFS,接私活的時候我用MongoDB也湊合湊合。現現在時代不一樣了,開始流行起了OSS。java
Gitee: https://gitee.com/felord/kono day06 分支 歡迎StarGitHub: https://github.com/NotFound40... day06 分支 歡迎Stargit
全稱爲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
OSS一般被用來存儲圖片、音視頻等文件,以及對這些文件的處理。
一般咱們有兩種選擇,花錢買或者本身搞。服務器
這句話這裏也是很實用的,目前幾乎全部的雲廠商都有本身的對象存儲產品,你能夠對比一下花錢購買它們,經過配合CDN能達到很是好的用戶體驗,胖哥的felord.cn就使用了雲廠商的對象存儲。購買他們的服務架構
不想花錢就只能本身動手了,目前我知道的開源方案有兩種。app
一種是Ceph,一個分佈式存儲系統,高可用,高擴展性。可是通常人玩不轉,就連開源中國的紅薯都被坑慘了😆。分佈式
另外一種是Minio,用Golang寫的。我目前還沒發現有什麼坑,文檔竟然還有中文文檔!我用Docker不到三分鐘就玩起來了,竟然還自帶控制檯!其它功能也挺齊全,各類客戶端SDK齊全。ide
由於安裝過於簡單就不演示了。
不管你花錢仍是本身搞均可以,這兩種方式各有各的好處。因此我要把這兩種方式整合到kono Spring Boot腳手架項目中。這種組件封裝成爲Spring Boot Starter再好不過了。在平常開發中這種基礎組件都建議作成Starter。參考個人 最強自定義Spring Boot Starter教程裏的方式,我將aliyun的OSS SDK和Minio 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的控制檯上建立一個bucket,能夠理解爲一個對象池。
而後把策略設置爲可讀寫。
搞完開始在項目中配置,application.yaml
中:
oss: minio: # 啓用 active: true access-key: minio_access_key secret-key: felord_cn_sec_key # minio 地址 endpoint: http://localhost:9000
額外引入依賴:
<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
如下是我對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); }
今天的整合與往常不太同樣,主要是一些通用功能的組件化封裝的實際演示,另外簡單描述了對象存儲的功能和使用場景,但願對你有用。多多關注:碼農小胖哥,跟我一塊兒整合腳手架。
關注公衆號:Felordcn 獲取更多資訊