minio的安装及使用

目录

    • 一、概述
    • 二、下载二进制文件安装minio
    • 三、spring boot整合使用minio
      • 1、使用maven引入minio依赖
      • 2、在`application.yml`中定义连接`minio`的参数
      • 3、定义一个`MinioUtil.java`工具类
    • 四、总结

一、概述

最近在学习使用minio,在这里对自己的学习过程做一个记录和总结,方便自己查阅。
Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。Minio兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java、Python、Javacript、 Golang语言。

Minio可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows、Linux、 OS X和FreeBSD上。安装和配置非常简单,基本是复制可执行程序,单行命令就可以运行起来。minio还可以通过容器部署以及部署到k8s集群,详细部署方式可以查看官方文档。

minio中文官方文档地址: https://docs.min.io/cn/
minio的源码地址:https://github.com/minio/minio

二、下载二进制文件安装minio

使用如下命令快速安装一个单机minio

# 下载 minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 添加可执行权限
chmod +x minio
# 设置登录minio的 access key
export MINIO_ACCESS_KEY=minioadmin
# 设置登录minio的 secret key
export MINIO_SECRET_KEY=minioadmin
# 启动 minio
./minio server /data

安装后使用浏览器访问http://127.0.0.1:9000,如果可以访问,则表示minio已经安装成功。输入上面自定义的access key 和 secret key就可以登录了。
minio的安装及使用_第1张图片

三、spring boot整合使用minio

1、使用maven引入minio依赖

在pom.xml中添加如下依赖,minio的最新依赖版本可以到maven中央仓库搜索,这里使用的最新版7.1.0
minio的安装及使用_第2张图片


<properties>
	<minio.version>7.1.0minio.version>
properties>


<dependency>
	<groupId>io.miniogroupId>
	<artifactId>minioartifactId>
	<version>${minio.version}version>
dependency>

2、在application.yml中定义连接minio的参数

# minio 连接参数
minio:
  endpoint: 127.0.0.1
  port: 9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucketName: image

3、定义一个MinioUtil.java工具类

@Slf4j
@Component
public class MinioUtils {
    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.port}")
    private Integer port;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.bucketName}")
    private String bucketName;


    private static MinioClient minioClient;

    public MinioClient getInstance() {
        if (minioClient == null) {
            minioClient = MinioClient.builder().endpoint(endpoint, port, false).credentials(accessKey, secretKey).build();
        }
        return minioClient;
    }
    /**
     * 
     * @Description 获取minio所有的桶
     * @return java.util.List
     **/
    public List<Bucket> getAllBucket() throws Exception {
        // 获取minio中所以的bucket
        List<Bucket> buckets = getInstance().listBuckets();
        for (Bucket bucket : buckets) {
            log.info("bucket 名称:  {}      bucket 创建时间: {}", bucket.name(), bucket.creationDate());
        }
        return buckets;
    }


    /**
     *
     * @Description  将图片上传到minio服务器
     * @param inputStream: 输入流
     * @param objectName: 对象名称
     * @return void
     **/
    public void uploadToMinio(InputStream inputStream, String objectName) {
        try {
            long size = inputStream.available();
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .stream(inputStream, size, -1)
                    .build();
            // 上传到minio
            getInstance().putObject(putObjectArgs);
            inputStream.close();
        } catch (Exception e) {
            log.error(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     *
     * @Description 根据指定的objectName获取下载链接,需要bucket设置可下载的策略
     * @param objectName: 对象的名称
     * @return java.lang.String
     **/
    public String getUrlByObjectName(String objectName) {
        String objectUrl = null;
        try {
            objectUrl = getInstance().getObjectUrl(bucketName, objectName);
        } catch (Exception e) {
            log.error(e.getMessage());
            e.printStackTrace();
        }
        return objectUrl;
    }



	 /**
     * 
     * @Description 根据objectName从minio中下载文件到指定的目录
     * @param objectName: objectName
     * @param fileName: 文件名称
     * @param dir: 文件目录
     * @return void
     **/
    public void downloadImageFromMinioToFile(String objectName, String fileName, String dir) throws Exception {
        GetObjectArgs objectArgs = GetObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .build();
        File file = new File(dir);
        if (!file.exists()) {
            file.mkdirs();
        }
        InputStream inputStream = getInstance().getObject(objectArgs);
        FileOutputStream outputStream =  new FileOutputStream(new File(dir, fileName.substring(fileName.lastIndexOf("/")+1)));
        int length;
        byte[] buffer = new byte[1024];
        while ((length = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, length);
        }
        outputStream.close();
        inputStream.close();
    }

}

四、总结

最后做一个总结,这里只是对minio做一个简单的介绍和使用,详细的使用方式需要查阅官方文档。对于一些新的api的学习,最好是直接通过IDE(推荐使用Intellij IDEA)下载源码查看java doc 进行学习,举个例子:当使用minio上传对象,我们不知道该怎么传递参数的时候,我们可以通过IDEA提供的快捷键(ctrl + Q)查看api的java doc, 如下图所示:
minio的安装及使用_第3张图片
这样对于快速掌握api的使用是非常有帮助的。

minio参考学习资料:
minio白皮书:http://www.cloudbin.cn/?p=2917

你可能感兴趣的:(java)