SpringBoot三十六:整合MinIo文件服務

什麼是MinIo

Minio是Apcche旗下的一款開源的輕量級文件服務器,基於對象存儲,協議是基於Apache License v2.0,開源可用於商務。

Minio主要用來存儲非結構化的數據,類似文件,圖片,照片,日誌文件,各類備份文件等,按照官網描述,文件的大小從幾KB到5TB。

Minio提供了非常方便,友好的界面,並且文檔也是非常豐富,具體可以參考它的文檔:https://docs.min.io/cn/

爲什麼選擇MinIo

在之前開發中曾使用了分佈式文件服務FASTDFS和阿里雲的OSS對象存儲來存儲。奈何OSS太貴,FASTDFS搭建配置又太繁瑣,今天給大家推薦一款極易上手的高性能對象存儲服務MinIo。

MinIO 是高性能的對象存儲,兼容 Amazon S3接口,充分考慮開發人員的需求和體驗;支持分佈式存儲,具備高擴展性、高可用性;部署簡單但功能豐富。官方的文檔也很詳細。它有多種不同的部署模式(單機部署,分佈式部署)。

爲什麼說 MinIO 簡單易用,原因就在於它的啓動、運行和配置都很簡單。可以通過 docker 方式進行安裝運行,也可以下載二進制文件,然後使用腳本運行。

安裝MinIo

推薦使用 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.javakf.com.cn;
    location /{
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:9000;
    }
    location ~ /\.ht {
        deny  all;
    }
}

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

簡單看了一下,功能還算可以,支持創建Bucket,文件上傳、刪除、分享、下載,同時可以對Bucket設置讀寫權限。

整合SpringBoot

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

pom.xml引入

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

application.properties配置

# MinIo文件服務器
min.io.endpoint = http://minio.javakf.com.cn
min.io.accessKey = admin
min.io.secretKey = admin123456

MinIoProperties.java 配置實體

@Data
@ConfigurationProperties(prefix = "min.io")
public class MinIoProperties {

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

}

工具類

@Component
@Configuration
@EnableConfigurationProperties({ MinIoProperties.class })
public class MinIoUtils {

	private MinIoProperties minIo;

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

	private static 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 static boolean bucketExists(String bucketName) {
		try {
			return instance.bucketExists(bucketName);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 創建 bucket
	 * 
	 * @param bucketName
	 */
	public static 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 static 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 static 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 static void removeObject(String bucketName, String objectName) {
		try {
			instance.removeObject(bucketName, objectName);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	// 省略各種CRUD
}

目前SDK不支持文件夾的創建,如果想創建文件夾,只能通過文件的方式上傳並創建。

minIoUtils.putObject("javakf","test/1.jpg","C:\\1.jpg");

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章