当前位置: 首页 > news >正文

【Java项目】Minio的安装部署以及SpringBoot整合Minio

文章目录

  • 前言
  • 安装与部署
  • MC下载
  • SpringBoot整合Minio

前言

minio官方文档
minio中文文档
minio是什么就不多介绍了,直接看上面即可。只需要知道,在项目中需要使用文件存储服务但是又不想使用阿里云,七牛云,华为云等提供的收费的OSS服务,那么就可以考虑使用Minio来存储文件。
本文不讲解任何minio的相关知识,只包含Minio的使用,环境是Centos7。
项目使用的是单机版本的minio,不是分布式版本,因此没有检错纠错数据还原的功能

安装与部署

首先是安装
在这里插入图片描述
按照官方文档一样,下载minio并且启动运行

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
#启动minio server服务,指定数据存储目录/mnt/data
./minio server /mnt/data

安装和启动完毕之后,初始状态如下

在这里插入图片描述

同时注意看,这里还为我们提供了API以及Console的地址
我们想要使用MNIO的API来操控MINIO就需要用到这个端口和ip,ip就是这台服务器的ip
而如果我们想要在控制台看到minio,就使用Console后面为我们提供的端口即可。
这里需要注意,minio的控制台的端口是会动态改变的,所以下一次启动后就可能变化了,我们可以通过命令来设定,如下。
首先,minio的默认的配置目录是${HOME}/.minio,可以通过–config-dir命令自定义配置目录

./minio server --config-dir /mnt/config /mnt/data

控制台监听端口是动态生成的,可以通过–console-address “:port”指定静态端口,方式如下

./minio server --console-address ":46021" /mnt/data

设定用户名和密码的方式如下,这里minio要求用户名长度大于3个字符,密码大于8个字符。
如果配置了这两个环境变量,就不会出现红色警告
在这里插入图片描述
在这里插入图片描述
账号和密码就是人家给你的,端口用人家给你的即可
在这里插入图片描述
之后我们可以先创建一个bucket,它具有隔离的特性,并且它是顶级目录
在这里插入图片描述
在这里插入图片描述

然后我们查看一下对应的挂载目录
在这里插入图片描述
在这里插入图片描述
上面的版本使用的是手动下载,我们也可以使用docker
docker安装单机版minio
在这里插入图片描述

# 在docker里面下载minio
docker pull bitnami/minio

# 之后使用docker run命令来运行minio
docker run -dt                                  \
  -p 9000:9000 -p 46021:46021                     \
  -e "MINIO_ROOT_USER=towelove"			\
  -e "MINIO_ROOT_PASSWORD=towelove"			\
  -v /mnt/data:/data                             	\
  -v /mnt/config:/root/.minio         \
  --name "minio_local"                          \
  bitnami/minio:latest server --console-address ":46021"

如果说想要部署分布式的minio,你需要很多个minio的节点,并且确保他们是可以互相通信的。然后在着每一个服务器上部署完毕minio之后,按照如下方式,就可以获取一个minio的分布式集群,部署集群能获得特别好的效果速度以及安全性,但是很麻烦,这里就单机使用就好了,主要是为了下面整合SpringBoot项目使用

minio server http://192.168.146.11/data1  http://192.168.146.12/data2
 http://192.168.146.13/data3  http://192.168.146.14/data4

MC下载

wget  http://dl.min.io/client/mc/release/linux-arm64/mc

SpringBoot整合Minio

SpringBoot的版本是2.7.7,然后导入如下依赖即可
如果在运行过程中出现其他报错,可以百度或者看看报错是否和我其他博客中出现的一样,Minio的坑还是很多的

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.4.3</version>
        </dependency>
        <dependency>
            <groupId>me.tongfei</groupId>
            <artifactId>progressbar</artifactId>
            <version>0.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.8.1</version>
        </dependency>

首先在配置文件中引入你minio的url,并且提供密码以及对应的桶名称
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

package com.towelove.file.service.impl;


import com.towelove.file.config.MinioConfig;
import com.towelove.file.service.ISysFileService;
import com.towelove.file.utils.FileUploadUtils;
import io.minio.BucketExistsArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * Minio 文件存储
 *
 * @author 张锦标
 */
@Service
public class MinioSysFileServiceImpl implements ISysFileService {
    @Autowired
    private MinioConfig minioConfig;

    @Autowired
    private MinioClient minioClient;

    /**
     * 本地文件上传接口
     *
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception {
        String fileName = FileUploadUtils.extractFilename(file);
        //判断桶是否存在
        boolean found =
                minioClient.bucketExists(BucketExistsArgs.builder()
                        .bucket(minioConfig.getBucketName()).build());
        if (found) {
            InputStream is = file.getInputStream();
            System.out.println("my-bucketname exists");
            PutObjectArgs args = PutObjectArgs.builder()
                    .bucket(minioConfig.getBucketName())
                    .object(fileName)
                    .stream(is, file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build();
            minioClient.putObject(args);
            is.close();
            return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
        } else {
            System.out.println("my-bucketname does not exist");
            throw new RuntimeException("my-bucketname " + minioConfig.getBucketName()
                    + " does not exist");
        }
    }
}

之后就可以使用apifox进行测试了
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 架构设计第一讲:架构设计相关面试题汇总
  • LeetCode笔记:Biweekly Contest 101
  • 【python实操】马上毕业了,你还不懂什么是守护线程、线程、进程?(附12306抢票程序-源代码)
  • Springboot整合rabbitmq并实现消息可靠性和持久性
  • ChatGPT可以作为一个翻译器吗?
  • 一文学会 Spring MVC 表单标签
  • 【联邦学习(Federated Learning)】- 横向联邦学习与联邦平均FedAvg
  • 免费一键生成原创文章-原创文章批量生成
  • 众人围剿,GPT-5招惹了谁
  • Spring Boot 3.0系列【19】核心特性篇之自定义Starter启动器
  • oracle中sql 正则怎么写?
  • 【5G RRC】NR测量Gap介绍
  • 【T+】登录畅捷通T+软件后提示同一个浏览器中不允许存在用户XX同时在线。
  • pom文件详解
  • JVM 类加载器子系统
  • 2017年终总结、随想
  • Android组件 - 收藏集 - 掘金
  • CAP理论的例子讲解
  • Flex布局到底解决了什么问题
  • golang中接口赋值与方法集
  • Python语法速览与机器学习开发环境搭建
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Web标准制定过程
  • XForms - 更强大的Form
  • zookeeper系列(七)实战分布式命名服务
  • 对超线程几个不同角度的解释
  • 关于extract.autodesk.io的一些说明
  • 将回调地狱按在地上摩擦的Promise
  • k8s使用glusterfs实现动态持久化存储
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # Maven错误Error executing Maven
  • (06)金属布线——为半导体注入生命的连接
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)PySpark3:SparkSQL编程
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Scala的“=”符号简介
  • (转)Sql Server 保留几位小数的两种做法
  • .NET 8.0 中有哪些新的变化?
  • .net Application的目录
  • .net FrameWork简介,数组,枚举
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET6实现破解Modbus poll点表配置文件
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @TableLogic注解说明,以及对增删改查的影响
  • @Transient注解
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [DP 训练] Longest Run on a Snowboard, UVa 10285