Minio

xiaojiuaigc@163.com 发布于 2024-11-19 527 次阅读


MinIO一个基于Go编写的开源对象存储套件,虽然轻量,却拥有着不错的性能。

MinIO非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

官方文档:https://docs.min.io/docs/

  • 高性能:全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。
  • 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心
  • 云原生:容器化、基于K8S的编排、多租户支持
  • Amazon S3兼容:亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界内大家都认可的标准。
  • SDK支持: 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持
  • 功能简单: 这一设计原则让MinIO不容易出错、更快启动

小,从几kb到最大5T不等。

我们在地址栏输入:ip+端口:9001(默认)/ 即可进入登录界面

 Access Key为minio   Secret_key 为minio123  进入系统后可以看到主界面

集成

① 在dkd-common模块,添加依赖

XML
<!–  hutool工具–>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

<!–  文件存储–>
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.1.0</version>
</dependency>

② 在dkd-admin模块,添加配置

YAML
minio:
  accessKey: minio
  secretKey: minio123
  bucket: dkd
  endpoint: http://192.168.200.128:9001
  readPath: http://192.168.200.128:9001

③ 在dkd-common模块,创建MinIOConfig类

Java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(“minio”)
@Data
public class MinIOConfig {
    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
    @Bean
    public MinioClient buildMinioClient(){
        return MinioClient
                .builder()
                .credentials(accessKey,secretKey)
                .endpoint(endpoint)
                .build();
    }
}

④ 在dkd-common模块,创建工具类

Java
import com.dkd.common.config.MinIOConfig;
import com.dkd.common.exception.ServiceException;
import com.dkd.common.utils.StringUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
封装minio客户端方法
上传文件
*/
@Slf4j
@Component
public class MinIOUtils{
    @Autowired
    private MinIOConfig minIOConfig;
    @Autowired
    private MinioClient minioClient;

    /**
     * 上传文件到MinIO
     *
     * @param file
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     */
    public String uploadFile(MultipartFile file) {
        try {
            String newFileName = new SimpleDateFormat(“yyyy/MM/dd/”).format(new Date()) + UUID.randomUUID().toString() +
                    “.” +
                    StringUtils.substringAfterLast(file.getOriginalFilename(), “.”);

            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(newFileName)
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(), file.getSize(), -1)  // partSize -1表示整体(不分片)上传
                    .bucket(minIOConfig.getBucket())
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder stringBuilder = new StringBuilder(minIOConfig.getReadPath());
            stringBuilder.
                    append(“/”).
                    append(minIOConfig.getBucket()).
                    append(“/”).
                    append(newFileName);
            return stringBuilder.toString();
        } catch (Exception ex) {
            log.error(“minio put file error.”, ex);
            throw new ServiceException(“上传文件失败”);
        }
    }
}