自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java程序員不缺對象,缺的是對象存儲

存儲 存儲軟件
文件服務(wù)器是一個應(yīng)用必要的組件之一。最早我搞過FTP,然后又用過FastDFS,接私活的時候我用MongoDB也湊合湊合?,F(xiàn)如今時代不同了,開始流行起了OSS。

 [[339165]]

1. 前言

文件服務(wù)器是一個應(yīng)用必要的組件之一。最早我搞過FTP,然后又用過FastDFS,接私活的時候我用MongoDB也湊合湊合?,F(xiàn)如今時代不同了,開始流行起了OSS。

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

GitHub: https://github.com/NotFound403/kono day06 分支 歡迎 Star

2. 什么是 OSS

全稱為Object Storage Service,也叫對象存儲服務(wù),是一種解決和處理離散單元的方法,可提供基于分布式系統(tǒng)之上的對象形式的數(shù)據(jù)存儲服務(wù),具有可拓展、可管理、低成本等特點,支持中心和邊緣存儲,能夠?qū)崿F(xiàn)存儲需求的彈性伸縮,主要應(yīng)用于海量數(shù)據(jù)管理的各類場景。

這概念真是夠難以理解的。簡單說點我知道的吧,平常我們的文件地址都是 /User/felord/video/xxx.mp4的目錄樹結(jié)構(gòu),系統(tǒng)先要找到User,然后一級一級往下找一直到目標(biāo)為止,這是一種結(jié)構(gòu)化的存儲方式。對象存儲就不一樣了,所有的文件都放在一個特定的池子里,只不過文件的攜帶有它自己的元信息,通過元信息去檢索文件。這里舉一個形象的例子:

  1. {"oss":[ 
  2.     {"file":"xxxxx","meta":{"id":"1111"},"type":""}, 
  3.     {"content":"xxxxx","meta":{"id":"1211"},"type":"","created":"","name":""}, 
  4. ]} 

上圖的oss就是一個對象存儲,它里面存了攜帶信息不一樣、甚至結(jié)構(gòu)都不一樣的東西,我們可以根據(jù)其元信息meta檢索它們。OSS具有以下特點:

  • 效率更高。不受復(fù)雜目錄系統(tǒng)對性能的影響。
  • 可擴展性更強。分布式架構(gòu),更便于進行水平擴展,從而容納進任意大規(guī)模的數(shù)據(jù)。
  • 可用性更強。數(shù)據(jù)一般都會有多個位于不同機器的復(fù)制,確保數(shù)據(jù)不丟失。
  • 平臺無關(guān),可以通過Restful接口進行操作對象。

OSS通常被用來存儲圖片、音視頻等文件,以及對這些文件的處理。

3. 哪些 OSS 可以使用

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

充錢才能變得更強

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

  • 可靠性強,數(shù)據(jù)丟失可能性低。
  • 免維護,不需要自行維護。
  • 可配合其它一些特色功能,比如縮略圖、CDN 等等。

自己動手豐衣足食

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

一種是Ceph,一個分布式存儲系統(tǒng),高可用,高擴展性。但是一般人玩不轉(zhuǎn),就連開源中國的紅薯都被坑慘了 。

大半年后紅薯被Ceph玩壞了

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

Minio Logo

因為安裝過于簡單就不演示了。

4. 整合到 Spring Boot

無論你花錢還是自己搞都可以,這兩種方式各有各的好處。所以我要把這兩種方式整合到kono Spring Boot腳手架項目中。這種組件封裝成為Spring Boot Starter再好不過了。在日常開發(fā)中這種基礎(chǔ)組件都建議做成Starter。參考我的 最強自定義 Spring Boot Starter 教程里的方式,我將aliyun的OSS SDK和Minio SDK封裝成Starter了。

達到了開箱即用。而且非常靈活,你配置哪種使用哪種,可以二選一,也可以全都要,還可以全都不要。

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

  1. <!--  一定要先拉取項目通過 mvn install 安裝到本地  --> 
  2. <dependency> 
  3.     <groupId>cn.felord</groupId> 
  4.     <artifactId>oss-spring-boot-starter</artifactId> 
  5.     <version>1.0.0.RELEASE</version> 
  6. </dependency> 

Minio 配置流程(可選)

接著就是使用了,先在你Minio的控制臺上創(chuàng)建一個bucket,可以理解為一個對象池。

創(chuàng)建 bucket

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

編輯名稱為img的bucket的策略

可讀寫策略

搞完開始在項目中配置,application.yaml中:

  1. @Autowired 
  2. @Qualifier("minioStorage"
  3. Storage storage; 
  4.  
  5. @Test 
  6. public void testOss() throws Exception { 
  7.     File file = new File("./456.jpg"); 
  8.  
  9.     InputStream inputStream = new FileInputStream(file); 
  10.  
  11.     storage.putObject("img","pic_122",inputStream, MimeTypeUtils.IMAGE_JPEG_VALUE); 

aliyun OSS 配置流程(可選)

額外引入依賴:

  1. <dependency> 
  2.     <groupId>com.aliyun.oss</groupId> 
  3.     <artifactId>aliyun-sdk-oss</artifactId> 
  4.     <version>2.5.0</version> 
  5. </dependency> 
  6. <dependency> 
  7.     <groupId>com.aliyun</groupId> 
  8.     <artifactId>aliyun-java-sdk-core</artifactId> 
  9.     <version>4.3.8</version> 
  10. </dependency> 

這是必須的步驟。

去ali OSS 控制臺申請跟Minio差不多的幾樣?xùn)|西用來配置:

  1. oss: 
  2.   aliyun: 
  3.     active: true 
  4.     access-key-id: LTAI4GH4EQXtKEbJDrADvWNH 
  5.     access-key-secret: XjDpNn5JqHAHPDXGL6xIebyUkyFAZ7 
  6.     endpoint: oss-cn-beijing.aliyuncs.com 

Starter 的使用

以下是我對OSS操作的抽象接口:

  1. package cn.felord.oss; 
  2.  
  3. import java.io.InputStream; 
  4.  
  5. /** 
  6.  * The interface Storage. 
  7.  * 
  8.  * @author felord.cn 
  9.  * @since 2020 /8/24 19:54 
  10.  */ 
  11. public interface Storage { 
  12.  
  13.  
  14.     /** 
  15.      * 存放對象 
  16.      * 
  17.      * @param bucketName   bucket  名稱 
  18.      * @param objectName  自定義對象名稱 
  19.      * @param inputStream  對象的輸入流 
  20.      * @param contentType  參考http 的 MimeType 值 
  21.      * @throws Exception the exception 
  22.      */ 
  23.     void putObject(String bucketName, String objectName, InputStream inputStream, String contentType) throws Exception; 
  24.  
  25.     /** 
  26.      *  獲取對象 
  27.      * 
  28.      * @param bucketName the bucket name 
  29.      * @param objectName the object name 
  30.      * @return the object 
  31.      */ 
  32.     InputStream getObject(String bucketName, String objectName) throws Exception; 
  33.  
  34.     /** 
  35.      *  獲取對象的URL 
  36.      * 
  37.      * @param bucketName the bucket name 
  38.      * @param objectName the object name 
  39.      * @return the object url 
  40.      */ 
  41.     String getObjectUrl(String bucketName, String objectName) throws Exception; 
  42.  
  43.     /** 
  44.      *  刪除對象 
  45.      * 
  46.      * @param bucketName the bucket name 
  47.      * @param objectName the object name 
  48.      */ 
  49.     void removeObject(String bucketName, String objectName) throws Exception; 
  50.  

然后分別使用了以上兩種OSS進行了實現(xiàn)。

對應(yīng)的兩種實現(xiàn)

并分別以aliyunStorage、minioStorage為名稱將AliyunStorage和MinioStorage注入Spring IoC。

使用起來非常簡單:

  1. @Autowired 
  2. @Qualifier("minioStorage"
  3. Storage storage; 
  4.  
  5. @Test 
  6. public void testOss() throws Exception { 
  7.     File file = new File("./456.jpg"); 
  8.  
  9.     InputStream inputStream = new FileInputStream(file); 
  10.  
  11.     storage.putObject("img","pic_122",inputStream, MimeTypeUtils.IMAGE_JPEG_VALUE); 

5. 總結(jié)

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

本文轉(zhuǎn)載自微信公眾號「碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號。

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2015-03-16 11:14:26

Java程序員面向?qū)ο?/a>程序員

2012-03-13 09:24:30

Java

2015-03-19 14:53:17

面向?qū)ο?/a>程序員新手程序員

2013-08-16 11:26:24

程序員面向?qū)ο?/a>

2019-07-18 08:00:49

對象存儲IHS Markit

2015-07-08 10:15:30

程序員對象不解風(fēng)情

2015-07-06 13:15:01

2015-04-10 19:37:34

程序員

2019-04-10 16:17:02

程序員結(jié)構(gòu)源代碼

2021-02-20 13:55:35

程序員計算機技術(shù)

2012-11-08 09:49:30

C++Java程序員

2013-08-20 09:33:59

程序員

2018-05-03 08:53:41

Redis存儲對象

2015-02-03 02:40:33

程序員盲人程序員

2009-06-02 13:43:04

程序員定義職場

2013-06-08 14:12:13

程序員招聘

2013-11-04 09:39:16

程序員信仰

2020-12-07 11:29:24

ReactVueVue3

2009-02-23 13:05:32

程序員學(xué)習(xí)方法

2012-12-03 10:22:24

程序員
點贊
收藏

51CTO技術(shù)棧公眾號