<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4161字,需瀏覽 9分鐘

           ·

          2020-09-02 07:26

          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ù),具有可拓展、可管理、低成本等特點(diǎn),支持中心和邊緣存儲,能夠?qū)崿F(xiàn)存儲需求的彈性伸縮,主要應(yīng)用于海量數(shù)據(jù)管理的各類場景。

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

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

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

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

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

          3. 哪些 OSS 可以使用

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

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

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

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

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

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

          自己動手豐衣足食

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

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

          大半年后紅薯被Ceph玩壞了

          另一種是Minio,用Golang寫的。我目前還沒發(fā)現(xiàn)有什么坑,文檔居然還有中文文檔!我用Docker不到三分鐘就玩起來了,居然還自帶控制臺!其它功能也挺齊全,各種客戶端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)目地址可以通過公眾號:碼農(nóng)小胖哥回復(fù)oss獲取。

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


          <dependency>
          ????<groupId>cn.felordgroupId>
          ????<artifactId>oss-spring-boot-starterartifactId>
          ????<version>1.0.0.RELEASEversion>
          dependency>

          Minio 配置流程(可選)

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

          創(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.ossgroupId>
          ????<artifactId>aliyun-sdk-ossartifactId>
          ????<version>2.5.0version>
          dependency>
          <dependency>
          ????<groupId>com.aliyungroupId>
          ????<artifactId>aliyun-java-sdk-coreartifactId>
          ????<version>4.3.8version>
          dependency>

          必須的步驟。

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

          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進(jìn)行了實(shí)現(xiàn)。

          對應(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í)際演示,另外簡單描述了對象存儲的功能和使用場景,希望對你有用。多多關(guān)注:碼農(nóng)小胖哥,跟我一起整合腳手架。

          —?【 THE END 】—
          本公眾號全部博文已整理成一個目錄,請?jiān)诠娞柪锘貜?fù)「m」獲??!


          3T技術(shù)資源大放送!包括但不限于:Java、C/C++,Linux,Python,大數(shù)據(jù),人工智能等等。在公眾號內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!




          瀏覽 55
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼逼AV | 日婷婷| 婷婷五月天综合 | 好看日逼小视频 | a在线免费观看视频 |