【Minio】分布式对象存储系统安装部署、项目集成、接口调用【企业级开源对象存储】

minio介绍

基础信息

  • 官网:https://min.io/
  • 中文官网:https://www.minio.org.cn/
  • 开源地址:https://github.com/minio/minio
  • MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的云储存服务。
  • MinIO原生支持 Kubernetes,它可用于每个独立的公共云、每个 Kubernetes 发行版、私有云和边缘的对象存储套件。
  • MinIO是软件定义的,不需要购买其他任何硬件,在 GNU AGPL v3 下是 100% 开源的。
    在这里插入图片描述
    在这里插入图片描述

docker安装

镜像拉取

  • 拉取minio镜像
docker pull minio/minio

在这里插入图片描述

安装

  • 执行docker命令安装
docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name rundreams-minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=admin" \
     -e "MINIO_SECRET_KEY=admin123" \
     -v /data/volume/minio/data:/data \
     -v /data/volume/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"
  • /data/volume/minio/data 该路径会存上传的文件,建议挂载到比较大的磁盘

配置访问

创建Buckets

在这里插入图片描述

  • 输入桶名字进行创建
    在这里插入图片描述
    在这里插入图片描述
  • 进行桶配置
    在这里插入图片描述
  • 配置为公共桶
    在这里插入图片描述

上传演示

  • 进入文件列表
    在这里插入图片描述
  • 进行文件上传
    在这里插入图片描述
    在这里插入图片描述
  • 成功访问该图片
    在这里插入图片描述

密钥创建

创建用户

  • 点击创建用户
    在这里插入图片描述
    在这里插入图片描述
  • Access Key 、Secret Key 通过某密码网站随机生成,后面会用到
    -随机密码生成: http://www.jsons.cn/randompwd/

项目使用

搭建文件服务器

核心代码预览

  • 上传文件控制器
    /**
     * 文件上传请求
     */
    @PostMapping("upload")
    public R<File> upload(MultipartFile file) {
    
    
        try {
    
    
            // 上传并返回访问地址
            String url = fileService.uploadFile(file);
            File file1 = new File();
            file1.setName(FileUtils.getName(url));
            file1.setUrl(url);
            return R.ok(file1);
        } catch (Exception e) {
    
    
            log.error("上传文件失败", e);
            return R.fail(e.getMessage());
        }
    }
  • 上传文件service
 /**
     * 本地文件上传接口
     *
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception {
    
    
        String fileName = FileUtils.extractFilename(file);
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .stream(file.getInputStream(), file.getSize(), -1)
                .contentType(file.getContentType())
                .build();
        client.putObject(args);
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }

上传文件

  • 使用postman 或者 ApiPost等模拟调用接口工具
    在这里插入图片描述
  • 可以看到文件的名字和访问地址是通过重命名的,具体可以看代码
    /**
     * 编码文件名
     */
    public static final String extractFilename(MultipartFile file) {
    
    
        return StrUtil.format("{}{}.{}", DateUtil.formatDate(DateUtil.date()).replace("-", ""), RandomUtil.randomString(20), FileTypeUtils.getExtension(file));
    }
  • 直接访问图片地址
    在这里插入图片描述
  • 查看我们的桶目录下也多了一个文件
    在这里插入图片描述

删除文件

  • 调用删除接口
    在这里插入图片描述
  • 删除核心代码
    /**
     * 删除文件
     *
     * @param fileName
     * @return
     * @throws Exception
     */
    public R deleteFile(String fileName) throws Exception {
    
    

        RemoveObjectArgs args = RemoveObjectArgs.builder().
                bucket(minioConfig.getBucketName()).
                object(fileName).
                build();
        client.removeObject(args);
        return R.ok();
    }
  • 桶中文件已经被删除
    在这里插入图片描述

实际业务

在实际业务中,前端直接调用文件服务器进行文件上传、文件删除等api,通过内网restapi调用,切记不用开外网,增加安全风险,然后上传后获取地址进行实际业务存库。

总结

  • 因为演示环境只做了单机部署,没有进行高可用部署操作,生产环境必须使用分布式部署
  • 如果单机部署,minio某些特性演示不能使用的,比如
    在这里插入图片描述
  • 博客中只演示了文件服务器比较基础的文件上传及文件删除功能演示,如果确定要使用minio做为文件服务器,还是建议更深入了解一些。

学 Java,找 rundreamsFly

Java开发工程师如何高质量提示自己 https://bbs.csdn.net/topics/614436959
2023年了,Java还能学么? https://bbs.csdn.net/topics/614415550
为什么有人愿意花几万块就参加IT培训 https://bbs.csdn.net/topics/613885348
2023 年,想转行互联网行业还能吃香了吗? https://bbs.csdn.net/topics/613850238
Java网上私教战老师靠谱吗? https://bbs.csdn.net/topics/613525044

猜你喜欢

转载自blog.csdn.net/u010800804/article/details/130241473