Minio整合到springboot

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数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。

  • 读写性能优异

Minio整合到springboot_第1张图片

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);

你可能感兴趣的:(spring,boot,java,spring)