了解和使用MinIO

MinIO

文章目录

  • MinIO
    • MinIO简介
      • MinIO概述
    • 开箱使用
      • 基本概念
    • 快速入门
    • 封装MinIO为starter
      • 在项目中集成

MinIO简介

MinIO 是一个开源的对象存储服务器,可以帮助用户构建高度可扩展的存储基础架构。它采用分布式架构,可以在多个节点上部署,实现数据的高可用性和容错性。minIO 支持标准的 S3 协议,提供了简单易用的 API,使开发人员可以方便地与存储系统进行交互。同时,minIO 还具备出色的性能和低延迟,适用于各种大规模数据存储和处理场景。无论是中小型企业还是大型云计算环境,minIO 都是一款可靠且灵活的对象存储方案。通过利用minIO,用户可以构建高度可靠的分布式存储系统,满足不断增长的数据存储需求。

对象存储方式对比

存储方式 优点 缺点
服务器磁盘 开发便捷,成本低 扩展困难
分布式文件系统 容易实现扩容 复杂度高
第三方存储 开发简单,功能强大,免维护 收费

分布式文件系统

存储方式 优点 缺点
FastDFS 1,主备服务,高可用
2,支持主从文件,支持自定义扩展名
3,支持动态扩容
1,没有完备官方文档,近几年没有更新
2,环境搭建较为麻烦
MinIO 1,性能高,准硬件条件下它能达到55GB/s的读、35GB/s的写速率
2,部署自带管理界面
3,MinI0.Inc运营的开源项目,社区活跃度高
4,提供了所有主流开发语言的SDK
不支持动态增加节点

MinIO概述

MinlO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。

  • Golang语言实现,配置简单,兽行命令可以运行起来。
  • MinlO兼容亚马逊S3云存储服务接口,适合于存储大容量非结构化的数据,一个对象文件可以是任意大小,从几kb到最大5T不等。
  • MinIO官网文档

开箱使用

Docker安装MinIO

  1. 拉取镜像

    docker pull minio/minio
    
  2. 创建容器

    docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e
    "MINIO_SECRET_KEY=minio123" -v /home/data:/data -v /home/config:/root/.minio minio/minio server /data
    
  3. 访问minIO系统

    http://192.168.100.130:9000
    

基本概念

  • bucket:类比于文件系统的目录
  • Object:类比文件系统的文件
  • Keys:类比文件名

快速入门

上传文件进行静态访问

<dependency>
    <groupId>io.miniogroupId>
    <artifactId>minioartifactId>
    <version>7.1.0version>
dependency>
public static void main(string[] args) {
    FileInputStream fileInputStream = null;
    try {
        fileInputStream = new FileInputStream("D:\\list.html");
        //1.获取minio的连接信息, 创建minio连接客户端
        MinioClient miniocClient = MinioClient.builder().credentials("minio","minio123").endpoint("http://192.168.100.130:9000").build();
        //2.上传
        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
            .object("list.html")	//文件名
            .contentType("text/html")	//文件类型
            .bucket("leadnews")		//桶名词与minio创建的名词一致
            .stream(fileInputStream,fileInputStream.available(), -1)	//文件流
            .build();
        minioClient.putObject(putObjectArgs);
        System.out.println("http://192.168.100.130:9000/leadnews/list.html");
    }catch (Exception ex) {
        ex.printStackTrace();
    }
}

如果文件上传成功后不能访问,则需要设置bucket的访问权限,改为Read and Write

封装MinIO为starter

MinIOConfigProperties

@Data
@ConfigurationProperties(prefix = "minio")  // 文件上传 配置前缀file.oss
public class MinIOConfigProperties implements Serializable {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

MinIOConfig

@Data
@Configuration
@EnableConfigurationProperties({MinIOConfigProperties.class})
//当引入FileStorageService接口时
@ConditionalOnClass(FileStorageService.class)
public class MinIOConfig {

    @Autowired
    private MinIOConfigProperties minIOConfigProperties;

    @Bean
    public MinioClient buildMinioClient() {
        return MinioClient
                .builder()
                .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
                .endpoint(minIOConfigProperties.getEndpoint())
                .build();
    }
}

FileStorageService

public interface FileStorageService {

    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    public String uploadImgFile(String prefix, String filename,InputStream inputStream);

    /**
     *  上传html文件
     * @param prefix  文件前缀
     * @param filename   文件名
     * @param inputStream  文件流
     * @return  文件全路径
     */
    public String uploadHtmlFile(String prefix, String filename,InputStream inputStream);

    /**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    public void delete(String pathUrl);

    /**
     * 下载文件
     * @param pathUrl  文件全路径
     * @return
     *
     */
    public byte[]  downLoadFile(String pathUrl);

}

MinIOFileStorageService

import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Import;
import org.springframework.util.StringUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

@Slf4j
@EnableConfigurationProperties(MinIOConfigProperties.class)
@Import(MinIOConfig.class)
public class MinIOFileStorageService implements FileStorageService {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinIOConfigProperties minIOConfigProperties;

    private final static String separator = "/";

    /**
     * @param dirPath
     * @param filename  yyyy/mm/dd/file.jpg
     * @return
     */
    public String builderFilePath(String dirPath,String filename) {
        StringBuilder stringBuilder = new StringBuilder(50);
        if(!StringUtils.isEmpty(dirPath)){
            stringBuilder.append(dirPath).append(separator);
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        String todayStr = sdf.format(new Date());
        stringBuilder.append(todayStr).append(separator);
        stringBuilder.append(filename);
        return stringBuilder.toString();
    }

    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    @Override
    public String uploadImgFile(String prefix, String filename,InputStream inputStream) {
        String filePath = builderFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .object(filePath)
                .contentType("image/jpg")
                .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
            urlPath.append(separator+minIOConfigProperties.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        }catch (Exception ex){
            log.error("minio put file error.",ex);
            throw new RuntimeException("上传文件失败");
        }
    }

    /**
     *  上传html文件
     * @param prefix  文件前缀
     * @param filename   文件名
     * @param inputStream  文件流
     * @return  文件全路径
     */
    @Override
    public String uploadHtmlFile(String prefix, String filename,InputStream inputStream) {
        String filePath = builderFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .object(filePath)
                .contentType("text/html")
                .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
            urlPath.append(separator+minIOConfigProperties.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        }catch (Exception ex){
            log.error("minio put file error.",ex);
            ex.printStackTrace();
            throw new RuntimeException("上传文件失败");
        }
    }

    /**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    @Override
    public void delete(String pathUrl) {
        String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
        int index = key.indexOf(separator);
        String bucket = key.substring(0,index);
        String filePath = key.substring(index+1);
        // 删除Objects
        RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
        try {
            minioClient.removeObject(removeObjectArgs);
        } catch (Exception e) {
            log.error("minio remove file error.  pathUrl:{}",pathUrl);
            e.printStackTrace();
        }
    }


    /**
     * 下载文件
     * @param pathUrl  文件全路径
     * @return  文件流
     *
     */
    @Override
    public byte[] downLoadFile(String pathUrl)  {
        String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
        int index = key.indexOf(separator);
        String bucket = key.substring(0,index);
        String filePath = key.substring(index+1);
        InputStream inputStream = null;
        try {
            inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
        } catch (Exception e) {
            log.error("minio down file error.  pathUrl:{}",pathUrl);
            e.printStackTrace();
        }

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while (true) {
            try {
                if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;
            } catch (IOException e) {
                e.printStackTrace();
            }
            byteArrayOutputStream.write(buff, 0, rc);
        }
        return byteArrayOutputStream.toByteArray();
    }
}

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.liner.file.service.impl.MinIOFileStorageService

在项目中集成

  1. 导入文件管理依赖

  2. 添加minio的配置文件

    minio:
     accessKey: minio
     secretKey: minio123
     bucket: leadnews
     endpoint: http://192.168.100.130:9000
     readPath: http://192.168.100.130:9000
    
  3. 在spring管理的bean中注入FileStorageService

    @SpringBootTest(classes = MinIOApplication.class)
    @Runwith(SpringRunner.class)
    public class MinIOTest {
        @Autowired
        private FileStorageService fileStorageService;
        //把List.htmL文件上传到minio中,并且可以在浏览器中访问
        @Test
        public void test() throws FileNotFoundException{
            FileInputStream fileInputStream = new FileInputStream("D:\\list.html");
            String path = fileStorageService.uploadHtmlFile("","list.html",fileInputStream);
            System.out.println(path);
        }
    }
    

你可能感兴趣的:(实用工具及技术篇,minio,spring,cloud,java)