java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 对象存储服务MinIO

对象存储服务MinIO快速入门(集成项目的详细过程)

作者:二本也有大厂梦

MinIO是一个开源的对象存储服务,支持多种操作系统,配置简单且性能高,它使用纠删码进行数据保护,可以容忍硬件故障,MinIO支持多种语言的SDK和丰富的API,本文介绍对象存储服务MinIO快速入门,感兴趣的朋友一起看看吧

对象存储服务MinIO

MinIO简介

MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。

MinIO特点

Minio使用Minio Erasure Code(纠删码)来防止硬件故障。即便损坏一半以上的driver,但是仍然可以从中恢复。

作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率

不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心

基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持

面向用户友好的简单操作界面,非常方便的管理Bucket及里面的文件资源

这一设计原则让MinIO不容易出错、更快启动

支持文件资源的分享连接及分享链接的过期策略、存储桶操作、文件列表访问及文件上传下载的基本功能等。

存储桶(Bucket)如果发生改变,比如上传对象和删除对象,可以使用存储桶事件通知机制进行监控,并通过以下方式发布出去:AMQP、MQTT、Elasticsearch、Redis、NATS、MySQL、Kafka、Webhooks等。

一、安装启动

我采用的是docker安装

docker pull minio/minio

创建配置文件目录和上传目录

mkdir -p /home/minio/configmkdir -p /home/minio/data

启动容器

docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=admin" \
     -e "MINIO_SECRET_KEY=admin123456" \
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"

假设我们的服务器地址为http://192.168.200.100:9000,我们在地址栏输入:http://http://192.168.200.100:9000/ 即可进入登录界面。

Access Key为admin ,Secret_key 为admin123456进入系统后可以看到主界面

一、快速入门

创建springboot项目

1 导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>7.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

在配置文件中导入

minio:
  accessKey: admin
  secretKey: admin123456
  bucket: text
  endpoint: http://192.168.200.100:9000
  readPath: http://192.168.200.100:9000

2 配置类

MinIOProperties

@Configuration
@Data
@ConfigurationProperties(prefix = "minio")
public class MinIOProperties {
    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

MinIOClientConfig

@Data
@Primary
@Configuration
public class MinIOClientConfig {
   @Autowired
   private MinIOProperties minIOProperties;
    @Bean
    public MinioClient buildMinioClient(){
        return MinioClient
                .builder()
                .credentials(minIOProperties.getAccessKey(), minIOProperties.getSecretKey())
                .endpoint(minIOProperties.getEndpoint())
                .build();
    }
}

3 开始业务

Controller

@RestController
@RequestMapping("minio")
public class UploadController {
    @Autowired
    private FileService fileService;
    @PostMapping("/upload")
    public String uploadMinio(@RequestPart("file") MultipartFile file) {
        return fileService.uploadMinio(file);
    }
}

Service

public interface FileService {
    public String uploadMinio(MultipartFile file) ;
}

ServiceImpl

@Slf4j
@Service
public class FileServiceImpl implements FileService {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinIOProperties minioProperties;
    @Override
    public String uploadMinio(MultipartFile file) {
        System.out.println(minioProperties);
        try {
            // 判断桶是否存在
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucket()).build());
            if (!found) {       // 如果不存在,那么此时就创建一个新的桶
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucket()).build());
            } else {  // 如果存在打印信息
                System.out.println("Bucket 'daijia' already exists.");
            }
            // 设置存储对象名称
            String extFileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            String fileName = new SimpleDateFormat("yyyyMMdd")
                    .format(new Date()) + "/" + UUID.randomUUID().toString().replace("-" , "") + "." + extFileName;
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(minioProperties.getBucket())
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .object(fileName)
                    .build();
            minioClient.putObject(putObjectArgs) ;
            return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + fileName ;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }
}

4 测试

点击连接,就可以开始下载图片

如果发现图片报错,去控制台把Access Policy 改成Pubilc

完成。

不用web的方式也可以上传图片:

Service

public interface FileStorageService {
    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    public String uploadImgFile(String prefix, String filename,InputStream inputStream);
  	/**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    public void delete(String pathUrl);
}

ServiceImpl

@Slf4j
@Service
public class MinIOFileStorageServiceImpl implements FileStorageService {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinIOProperties minIOConfigProperties;
    private final static String separator = "/";
    /**
     *  上传图片文件
     * @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("上传文件失败");
        }
    }
    /**
     * 删除文件
     * @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();
        }
    }
}

测试类:

@SpringBootTest
class MinioDemoApplicationTests {
    @Autowired
   private MinIOFileStorageServiceImpl minIOFileStorageServiceImpl;
    @Test
    void imageFileStorage() throws IOException {
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");
        String path = minIOFileStorageServiceImpl.uploadImgFile("text", fileName, Files.newInputStream(new File("D:\\图片\\1.jpg").toPath()));
        System.out.println(path);
    }
    @Test
    void deleteImageFile() throws IOException {
        minIOFileStorageServiceImpl.delete("");//这里填上传的文件路径
    }
}

完成。

到此这篇关于对象存储服务MinIO快速入门(集成项目的详细过程)的文章就介绍到这了,更多相关对象存储服务MinIO内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文