Gitee倒下了,自己造個免費的分散式儲存服務

碼猿技術專欄發表於2022-05-20

大家好,我是不才陳某~

最近真的被Gitee整廢了,昨天又設定了倉庫不能公開,必須申請開源,稽核通過才能公開

難道這是被約談了?先是部落格園,現在又是Gitee

交流群裡小夥伴也都在埋怨,辛苦搭建的圖床也廢了

有些朋友建議直接使用收費的,比如七牛雲,不過技多不壓身,自己造一個豈不美哉!

今天來安利一個開源免費的物件儲存套件MinIO,自己擼一個免費的儲存系統,順帶實現一個圖床。

什麼是MinIO?

Minio 是個基於 Golang 編寫的開源物件儲存套件,基於Apache License v2.0開源協議,雖然輕量,卻擁有著不錯的效能。它相容亞馬遜S3雲端儲存服務介面。可以很簡單的和其他應用結合使用,例如 NodeJS、Redis、MySQL等。

1. 應用場景

MinIO 的應用場景除了可以作為私有云的物件儲存服務來使用,也可以作為雲物件儲存的閘道器層,無縫對接 Amazon S3 或者 MicroSoft Azure

2. 特點

  1. 高效能:作為一款高效能儲存,在標準硬體條件下,其讀寫速率分別可以達到 55Gb/s35Gb/s。並且MinIO 支援一個物件檔案可以是任意大小,從幾kb到最大5T不等。
  2. 可擴充套件:不同MinIO叢集可以組成聯邦,並形成一個全域性的名稱空間,並且支援跨越多個資料中心。
  3. 雲原生:容器化、基於K8S的編排、多租戶支援。
  4. Amazon S3相容:使用 Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK 和 AWS CLI 訪問Minio伺服器。
  5. SDK支援

    1. GO SDK: https://github.com/minio/mini...
    2. JavaSDK: https://github.com/minio/mini...
    3. PythonSDK: https://github.com/minio/mini...
  6. 圖形化介面:有操作頁面
  7. 支援糾刪碼:MinIO使用糾刪碼、Checksum來防止硬體錯誤和靜默資料汙染。在最高冗餘度配置下,即使丟失1/2的磁碟也能恢復資料。
功能很強大,本文只是拋磚引玉,有興趣的朋友自己去探索吧~

安裝MinIO

安裝非常簡單,筆者這裡使用docker安裝,步驟如下:

1. 獲取映象

執行命令如下:

docker pull minio/minio

2. 啟動映象

執行命令如下:

 docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data

命令解釋如下:

  • -p9000是圖形介面的埠,9001是API的埠,在使用SDK連線需要用到
  • MINIO_ACCESS_KEY:指定圖形介面的使用者名稱
  • MINIO_SECRET_KEY:指定圖形介面的密碼

按照上述兩個步驟啟動成功即可。

3. 圖形介面操作

安裝成功後直接訪問地址:http:/ip:9000/login,如下:

輸入使用者名稱和密碼登入成功後,如下:

選單很多,這裡就不再詳細介紹了,筆者這裡直接在Buckets選單中建立一個桶為test,如下圖:

並且設定這個桶的隱私規則為public,如下:

MinIO到此已經安裝設定成功了

Spring Boot 整合MinIO 上傳檔案

雖然MinIO在圖形介面提供了手動上傳的操作,但是也可以通過SDK的方式去上傳,下面介紹一下Spring Boot 整合MinIO上傳檔案。

1. 獲取accessKey和secretKey

這裡的accessKeysecretKey並不是圖形介面登入名和密碼,獲取很簡單,直接在圖形介面中操作,如下圖:

2. 新增依賴

新增MinIO的依賴,如下:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.1</version>
</dependency>

3. 新增配置

這裡筆者對SDK做了簡單的封裝,案例原始碼都會提供,下面只列出部分程式碼。

aplication.yml配置中新增MInIO相關的配置,如下:

minio:
  # 訪問的url
  endpoint: http://192.168.47.148
  # API的埠
  port: 9001
  # 祕鑰
  accessKey: HQGWFYLWGC6FVJ0CQFOG
  secretKey: pUGhAgQhZDxJaLmN3uz65YX7Bb3FyLdLglBvcCr1
  secure: false
  bucket-name: test # 桶名 我這是給出了一個預設桶名
  image-size: 10485760 # 我在這裡設定了 圖片檔案的最大大小
  file-size: 1073741824 # 此處是設定了檔案的最大大小

4. 新建上傳檔案介面

筆者這裡定義了一個上傳檔案介面,如下:

/**
 * @author 公眾號:碼猿技術專欄
 */
@RequestMapping("/minio")
@RestController
public class MinioController {

    @Autowired
    private  MinioService minioService;

    @PostMapping("/upload")
    public String uploadFile(MultipartFile file, String bucketName) {
        String fileType = FileTypeUtils.getFileType(file);
        if (fileType != null) {
            return minioService.putObject(file, bucketName, fileType);
        }
        return "不支援的檔案格式。請確認格式,重新上傳!!!";
    }
}
原始碼已經上傳GitHub,關注公眾號:碼猿技術專欄,回覆關鍵詞:9535 獲取!

5. 測試

上述4個步驟已經整合完成了,下面直接呼叫介面上傳一張圖片試一下,如下:

介面返回的URL就是檔案的訪問地址,直接輸入瀏覽器訪問即可。

在MInIO中也可以看到儲存的檔案,如下圖:

如果你需要分享給別人,也可以手動分享,有效期是7天,一旦過了這個有效期將會失效,如下:

原始碼已經上傳GitHub,關注公眾號:碼猿技術專欄,回覆關鍵詞:9535 獲取!

總結

MInIO雖然是個開源專案,但是功能非常強大,小型專案中完全可以用它實現物件儲存,也可以使用MinIO搭建一個免費的圖床。

圖片地址都能直接返回給你了,圖床搭建就不用多說了吧,自己試試吧~

最後說一句(別白嫖,求關注)

陳某每一篇文章都是精心輸出,已經寫了3個專欄,整理成PDF,獲取方式如下:

  1. 《Spring Cloud 進階》PDF:關注公眾號:【碼猿技術專欄】回覆關鍵詞 Spring Cloud 進階 獲取!
  2. 《Spring Boot 進階》PDF:關注公眾號:【碼猿技術專欄】回覆關鍵詞 Spring Boot進階 獲取!
  3. 《Mybatis 進階》PDF:關注公眾號:【碼猿技術專欄】回覆關鍵詞 Mybatis 進階 獲取!
另外陳某的《Spring Cloud Alibaba 實戰》視訊專欄已經殺青了,需要訂閱的點選左下角閱讀原文

相關文章