Minio整合到springboot
1.Minio
1.1.Minio介绍
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非
常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而
一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
官网:https://min.io/ http://www.minio.org.cn/
对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服
务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成
本。
Minio优点
-
部署简单: 一个single二进制文件即是一切,还可支持各种平台。
-
minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB;
-
兼容Amazon S3接口,充分考虑开发人员的需求和体验;
-
低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用
磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠删码集合(Erasure
Coding Set)中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。 -
读写性能优异
1.2.MinIO的基础概念
- Object:存储到 Minio 的基本对象,如文件、字节流,Anything…
- Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。对于客户端而
言,就相当于一个存放文件的顶层文件夹。 - Drive:即存储数据的磁盘,在 MinIO 启动时,以参数的方式传入。Minio 中所有的对象数据都会
存储在 Drive 里。 - Set :即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的
Drive 分布在不同位置。一个对象存储在一个 Set 上。(For example: {1…64} is divided into 4
sets each of size 16.) - 一个对象存储在一个Set上
- 一个集群划分为多个Set
- 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出
- 一个SET中的Drive尽可能分布在不同的节点上
1.3.纠删码EC(Erasure Code)
MinIO 使用纠删码机制来保证高可靠性,使用 highwayhash 来处理数据损坏( Bit Rot Protection )。
关于纠删码,简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m
份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失
效,仍然能通过剩下的数据还原出来 。
1.4 存储形式
1.5存储方案
2.java引入Minio
2.1 pom依赖
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.4</version>
</dependency>
我用的是7.1.4版本,最新的是8.3.7,方法会有差异,比如7版本存在的getObjectUrl方法,在8中就没有了,只能生成一个最长有效期7天的URL地址。
Minio官方入门文档
官方文档:https://docs.min.io/docs/
中文文档:http://docs.minio.org.cn/docs/ (中文文档,更新不及时,不建议参考)
Minio官方给的示例项目
官方demo: https://github.com/minio/minio-java
Minio Java Client参考手册
官方文档:https://docs.min.io/docs/java-client-api-reference.html
2.2 Yml配置
#minio配置
spring:
# 配置文件上传大小限制
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
minio:
endpoint: localhost:9000 #服务地址
accessKey: admin #登录密钥,如果没有,就采用登录名
secretKey: admin@2022 #登录密钥,如果没有,就采用登录密码
bucketName: test #桶名称,可以不用配置,可以直接在数据库中建数据字典,新建写入即可
2.3 注解配置类
MinioProperties
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* {阐述类的作用}
*
* @author YPJ
* @since 2022-03-08 11:15
*/
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
private String endPoint;
private String accessKey;
private String secretKey;
private String download;
}
2.3 Bean注入
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* {阐述类的作用}
*
* @author YPJ
* @since 2022-03-07 14:13
*/
@Component
public class MinoConfig {
@Resource
private MinioProperties minioProperties;
@Bean
public MinioClient minioClient() {
MinioClient build = MinioClient.builder()
.endpoint(minioProperties.getEndPoint())
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
.build();
System.out.println(build);
return build;
}
}
注意事项:
1、采用uploadObject上传文件后,需要调用getObjectUrl返回地址!!如果桶不是public是访问不到内容的!!!
/**
* 功能描述:
* minio文件上传
*
* @param file
* @return ReturnMsg
* @author YPJ
* @date 2022/3/9 17:54
*/
@ApiOperation(value = "minio文件上传")
public ReturnMsg fileUploader(MultipartFile file, String bucketName) {
try {
File file1 = multipartFileToFile(file)