2023-03-11
原文作者:柒's Blog 原文地址:https://blog.52itstyle.vip/archives/1304/

202303111618095701.png

前言

在之前的图床开发中撸主曾使用了分布式文件服务FASTDFS和阿里云的OSS对象存储来存储妹子图。奈何OSS太贵,FASTDFS搭建配置又太繁琐,今天给大家推荐一款极易上手的高性能对象存储服务MinIO

简介

MinIO 是高性能的对象存储,兼容 Amazon S3接口,充分考虑开发人员的需求和体验;支持分布式存储,具备高扩展性、高可用性;部署简单但功能丰富。官方的文档也很详细。它有多种不同的部署模式(单机部署,分布式部署)。

为什么说 MinIO 简单易用,原因就在于它的启动、运行和配置都很简单。可以通过 docker 方式进行安装运行,也可以下载二进制文件,然后使用脚本运行。

安装

推荐使用 docker 一键安装:

    docker run -it -p 9000:9000 --name minio \
    -d --restart=always \
    -e "MINIO_ACCESS_KEY=admin" \
    -e "MINIO_SECRET_KEY=admin123456" \
    -v /mnt/minio/data:/data \
    -v /mnt/minio/config:/root/.minio \
    minio/minio server /data

注意:

  • 密钥必须大于8位,否则会创建失败
  • 文件目录和配置文件一定要映射到主机,你懂得

整合Nginx

    server{
        listen 80;
        server_name minio.cloudbed.vip;
        location /{
            proxy_set_header Host $http_host;
            proxy_pass http://localhost:9000;
        }
        location ~ /\.ht {
            deny  all;
        }
    }

这样,通过浏览器访问配置的地址,使用指定的 MINIO_ACCESS_KEYMINIO_SECRET_KEY 登录即可。

简单看了一下,功能还算可以,支持创建Bucket,文件上传、删除、分享、下载,同时可以对Bucket设置读写权限。

202303111618100632.png

202303111618107463.png

202303111618114424.png

整合

Minio支持接入JavaScriptJavaPythonGolang等多种语言,这里我们选择最熟悉的Java语言,使用最流行的框架 SpringBoot 2.x

pom.xml引入:

    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>7.0.2</version>
    </dependency>

application.properties引入:

    # MinIo文件服务器
    min.io.endpoint = http://minio.cloudbed.vip
    min.io.accessKey = admin
    min.io.secretKey = admin123456

MinIoProperties.java 配置实体:

    /**
     * 实体类
     * 爪哇笔记:https://blog.52itstyle.vip
     */
    @Data
    @ConfigurationProperties(prefix = "min.io")
    public class MinIoProperties {
    
        private String endpoint;
        private String accessKey;
        private String secretKey;
    }

撸一个工具类:

    /**
     * 工具类
     * 爪哇笔记:https://blog.52itstyle.vip
     */
    @Component
    @Configuration
    @EnableConfigurationProperties({MinIoProperties.class})
    public class MinIoUtils {
    
        private MinIoProperties minIo;
    
        public MinIoUtils(MinIoProperties minIo) {
            this.minIo = minIo;
        }
    
        private MinioClient instance;
    
        @PostConstruct
        public void init() {
            try {
                instance = new MinioClient(minIo.getEndpoint(),minIo.getAccessKey(),minIo.getSecretKey());
            } catch (InvalidPortException e) {
                e.printStackTrace();
            } catch (InvalidEndpointException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 判断 bucket是否存在
         * @param bucketName
         * @return
         */
        public boolean bucketExists(String bucketName){
            try {
                return instance.bucketExists(bucketName);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        /**
         * 创建 bucket
         * @param bucketName
         */
        public void makeBucket(String bucketName){
            try {
                boolean isExist = instance.bucketExists(bucketName);
                if(!isExist) {
                    instance.makeBucket(bucketName);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 文件上传
         * @param bucketName
         * @param objectName
         * @param filename
         */
        public void putObject(String bucketName, String objectName, String filename){
            try {
                instance.putObject(bucketName,objectName,filename,null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 文件上传
         * @param bucketName
         * @param objectName
         * @param stream
         */
        public void putObject(String bucketName, String objectName, InputStream stream){
            try {
                instance.putObject(bucketName,objectName,stream,null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 删除文件
         * @param bucketName
         * @param objectName
         */
        public void removeObject(String bucketName, String objectName){
            try {
                instance.removeObject(bucketName,objectName);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //省略各种CRUD
    }

目前SDK不支持文件夹的创建,如果想创建文件夹,只能通过文件的方式上传并创建。

    minIoUtils.putObject("itstyle","妹子图/爪哇妹.jpg","C:\\爪哇妹.jpg");

一个实例只能有一个账号,如果想使用多个账号,需要创建多个实例。此外 minio还支持单主机,多块磁盘以及分布式部署,不过对于大部分单体应用来说,单体已经够用了。

小结

撸主在夜深人静的时候花了半个多小时就搞定了,是不是很简单,一键傻瓜式安装,丰富的SDK可供选择,小白用户是不是美滋滋。

重要的是她不仅可以作为文件服务,还可以当做私人网盘使用,一举两得岂不美滋滋。

阅读全文