SpringBoot 2.x 開發案例之整合MinIo檔案服務

千鋒Python唐小強發表於2020-05-19

在之前的圖床開發中曾使用了分散式檔案服務FASTDFS和阿里雲的OSS物件儲存來儲存妹子圖。奈何OSS太貴,FASTDFS搭建配置又太繁瑣,今天給大家推薦一款極易上手的高效能物件儲存服務MinIO。

簡介

MinIO 是高效能的物件儲存,相容 Amazon S3介面,充分考慮開發人員的需求和體驗;支援分散式儲存,具備高擴充套件性、高可用性;部署簡單但功能豐富。官方的文件也很詳細。它有多種不同的部署模式(單機部署,分散式部署)。

為什麼說 MinIO 簡單易用,原因就在於它的啟動、執行和配置都很簡單。可以透過 docker 方式進行安裝執行,也可以下載二進位制檔案,然後使用指令碼執行。

安裝

推薦使用 docker 一鍵安裝:

docker run -it -p 9000:9000 --name minio \

-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin123456" \
-v /mnt/minio/data:/data \
-v /mnt/minio/config:/root/.minio \
minio/minio server /data

注意:

  • 金鑰必須大於8位,否則會建立失敗
  • 檔案目錄和配置檔案一定要對映到主機,你懂得

整合Nginx:

server{

   listen 80;
   server_name minio.cloudbed.vip;
   location /{
       proxy_set_header Host $http_host;
       proxy_pass
   }
   location ~ /\.ht {
       deny  all;
   }
}

這樣,透過瀏覽器訪問配置的地址,使用指定的 MINIO_ACCESS_KEY 及 MINIO_SECRET_KEY 登入即可。

簡單看了一下,功能還算可以,支援建立Bucket,檔案上傳、刪除、分享、下載,同時可以對Bucket設定讀寫許可權。

整合

Minio支援接入JavaScript、Java、Python、Golang等多種語言,這裡我們選擇最熟悉的Java語言,使用最流行的框架 SpringBoot 2.x。

pom.xml引入:

<dependency>

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

application.properties引入:

# MinIo檔案伺服器

min.io.endpoint =
min.io.accessKey = admin
min.io.secretKey = admin123456

MinIoProperties.java 配置實體:

/**

* 實體類
* 爪哇筆記:https://blog.52itstyle.vip
*/
@Data
@ConfigurationProperties(prefix = "min.io")
public class MinIoProperties {

   private String endpoint;
   private String accessKey;
   private String secretKey;
}

擼一個工具類:

/**

* 工具類
* 爪哇筆記:https://blog.52itstyle.vip
*/
@Component
@Configuration
@EnableConfigurationProperties({MinIoProperties.class})
public class MinIoUtils {

   private MinIoProperties minIo;

   public MinIoUtils(MinIoProperties minIo) {
       this.minIo = minIo;
   }

   private MinioClient instance;

   @PostConstruct
   public void init() {
       try {
           instance = new MinioClient(minIo.getEndpoint(),minIo.getAccessKey(),minIo.getSecretKey());
       } catch (InvalidPortException e) {
           e.printStackTrace();
       } catch (InvalidEndpointException e) {
           e.printStackTrace();
       }
   }

   /**
    * 判斷 bucket是否存在
    * @param bucketName
    * @return
    */
   public boolean bucketExists(String bucketName){
       try {
           return instance.bucketExists(bucketName);
       } catch (Exception e) {
           e.printStackTrace();
       }
       return false;
   }

   /**
    * 建立 bucket
    * @param bucketName
    */
   public void makeBucket(String bucketName){
       try {
           boolean isExist = instance.bucketExists(bucketName);
           if(!isExist) {
               instance.makeBucket(bucketName);
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   /**
    * 檔案上傳
    * @param bucketName
    * @param objectName
    * @param filename
    */
   public void putObject(String bucketName, String objectName, String filename){
       try {
           instance.putObject(bucketName,objectName,filename,null);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
   /**
    * 檔案上傳
    * @param bucketName
    * @param objectName
    * @param stream
    */
   public void putObject(String bucketName, String objectName, InputStream stream){
       try {
           instance.putObject(bucketName,objectName,stream,null);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
   /**
    * 刪除檔案
    * @param bucketName
    * @param objectName
    */
   public void removeObject(String bucketName, String objectName){
       try {
           instance.removeObject(bucketName,objectName);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
//省略各種CRUD
}

目前SDK不支援資料夾的建立,如果想建立資料夾,只能透過檔案的方式上傳並建立。

minIoUtils.putObject("itstyle","妹子圖/爪哇妹.jpg","C:\\爪哇妹.jpg");

一個例項只能有一個賬號,如果想使用多個賬號,需要建立多個例項。此外 minio還支援單主機,多塊磁碟以及分散式部署,不過對於大部分單體應用來說,單體已經夠用了。

小結

夜深人靜的時候花了半個多小時就搞定了,是不是很簡單,一鍵傻瓜式安裝,豐富的SDK可供選擇,小白使用者是不是美滋滋。

重要的是她不僅可以作為檔案服務,還可以當做私人網盤使用,一舉兩得豈不美滋滋。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2692997/,如需轉載,請註明出處,否則將追究法律責任。

相關文章