SpringBoot+MinIO实现minio部署和使用

这篇具有很好参考价值的文章主要介绍了SpringBoot+MinIO实现minio部署和使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Minio是一个go编写基于Apache License v2.0开源协议的对象存储系统,是为海量数据存储、人工智能、大数据分析而设计,它完全兼容Amazon S3接口,十分符合存储大容量的非结构化数据从几十kb到最大5T不等。是一个小而美的开源分布式存储软件。

特点
简单、可靠:Minio采用简单可靠的集群方案,摒弃复杂的大规模的集群调度管理,减少风险与性能瓶颈,聚焦产品的核心功能,打造高可用的集群、灵活的扩展能力以及超过的性能。建立众多的中小规模、易管理的集群,支持跨数据中心将多个集群聚合成超大资源池,而非直接采用大规模、统一管理的分布式集群。

功能完善:Minio支持云原生,能与Kubernetes、Docker、Swarm编排系统良好对接,实现灵活部署。且部署简单,只有一个可执行文件,参数极少,一条命令即可启动一个Minio系统。Minio为了高性能采取无元数据数据库设计,避免元数据库成为整个系统的性能瓶颈,并将故障限制在单个集群之内,从而不会涉及其他集群。Minio同时完全兼容S3接口,因此也可以作为网关使用,对外提供S3访问。同时使用Minio Erasure code和checksum 来防止硬件故障。即使损失一半以上的硬盘,但是仍然可以从中恢复。分布式中也允许(N/2)-1个节点故障。

docker+rancher部署minio集群
在rancher上创建三个minio服务,这三个选择的服务器ip是三台不同的服务器ip,在主机调度中进行选择不同的主机
端口映射:
SpringBoot+MinIO实现minio部署和使用,spring boot,后端,java
配置环境变量:

主机调度
每个指定不同的主机,三台机器分别运行一个minio
配置数据卷
在三台主机主机的host文件中添加host对应关系

ip1 minio-1
ip2 minio-2
ip3 minio-3

数据卷配置
SpringBoot+MinIO实现minio部署和使用,spring boot,后端,java
SpringBoot+MinIO实现minio部署和使用,spring boot,后端,java

网络
使用主机网络:是
入库命令
server --console-address :9090 http://minio-{1…3}/data{1…2}
SpringBoot+MinIO实现minio部署和使用,spring boot,后端,java

安装ngxin负载均衡访问minio在rancher上创建nginx服务
SpringBoot+MinIO实现minio部署和使用,spring boot,后端,java

数据卷映射
进入主机目录配置nginx,
vi /mnt/nginx/conf.d

内容如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http{
  
  #上面安装主机的三台机器记得修改
    upstream http_minio_back{
        server ip1:9000;
        server ip2:9000;
        server ip3:9000;
    }
    server{
        listen 6555;
        server_name localhost;
        ignore_invalid_headers off;
        #配置成上传文件不限制大小
        client_max_body_size 0;
        proxy_buffering off;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

            proxy_connect_timeout 300;
            proxy_http_version 1.1;
            chunked_transfer_encoding off;
            proxy_ignore_client_abort on;

            proxy_pass http_minio_back

        }
    }
    }
}

数据卷配置引入conf.d
SpringBoot+MinIO实现minio部署和使用,spring boot,后端,java

springboot+minio 实例如下:

pom.xml

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

application.yml配置:

spring:
  # 配置文件上传大小限制
  servlet:
    multipart:
      max-file-size: 500MB
      max-request-size: 500MB
oss:
  endpoint: ${ENDPOINT:http://nginx的ip:nginx的端口号}
  access-key: ${ACCESS_KEY:minio}
  secret-key: ${SECRET_KEY:minio}

minio配置类

@Configuration
@ApiModel(value = "minio配置")
public class MinIoClientConfig {
	@Value("${oss.endpoint}")
    private String url;
    @Value("${oss.access-key}")
    private String accessKey;
    @Value("${oss.secret-key}")
    private String secretKey;
    @Bean
    public MinioClient minioClient(){
 
        return MinioClient.builder()
                .endpoint(url)
                .credentials(accessKey, secretKey)
                .build();
    }
 }

编写工具类用于将公用方法写到工具类中,实现调用

import cn.hutool.core.io.FastByteArrayOutputStream;
import com.alibaba.nacos.common.util.UuidUtils;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

@Component
@Slf4j
@RequiredArgsConstructor
public class MinioUtil {
//必须使用注入的方式否则会出现空指针
    @Autowired
   MinioClient minioClient;

    /**
     * 查看存储bucket是否存在
     *  bucketName 需要传入桶名
     * @return boolean
     */
    public Boolean bucketExists(String bucketName) {
        Boolean found;
        try {
            found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return found;
    }

    /**
     * 创建存储bucket
     *  bucketName 需要传入桶名
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 删除存储bucket
     * bucketName 需要传入桶名
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 获取全部bucket
     */
    public List<Bucket> getAllBuckets() {
        try {
            List<Bucket> buckets = minioClient.listBuckets();
            return buckets;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }



    /**
     * 文件上传
     *
     * @param file 文件
     * BucketName 需要传入桶名
     * @return Boolean
     */
    public String upload(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (StringUtils.isBlank(originalFilename)){
            throw new RuntimeException();
        }
        String fileName = UuidUtils.generateUuid() + originalFilename.substring(originalFilename.lastIndexOf("."));
        String objectName = "sssss" + "/" + fileName;
        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket("BucketName").object(objectName)
                    .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
            //文件名称相同会覆盖
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return objectName;
    }

    /**
     * 预览
     * @param fileName
     * BucketName 需要传入桶名
     * @return
     */
    public String preview(String fileName){
        // 查看文件地址
        GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket("BucketName").object(fileName).method(Method.GET).build();
        try {
            String url = minioClient.getPresignedObjectUrl(build);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 文件下载
     * @param fileName 文件名称
     * BucketName 需要传入桶名
     * @param res response
     * @return Boolean
     */
    public void download(String fileName, HttpServletResponse res) {
        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket("BucketName")
                .object(fileName).build();
        try (GetObjectResponse response = minioClient.getObject(objectArgs)){
            byte[] buf = new byte[1024];
            int len;
            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
                while ((len=response.read(buf))!=-1){
                    os.write(buf,0,len);
                }
                os.flush();
                byte[] bytes = os.toByteArray();
                res.setCharacterEncoding("utf-8");
                // 设置强制下载不打开
                // res.setContentType("application/force-download");
                res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
                try (ServletOutputStream stream = res.getOutputStream()){
                    stream.write(bytes);
                    stream.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 查看文件对象
     * BucketName 需要传入桶名
     * @return 存储bucket内文件对象信息
     */
    public List<Item> listObjects() {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket("BucketName").build());
        List<Item> items = new ArrayList<>();
        try {
            for (Result<Item> result : results) {
                items.add(result.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return items;
    }

    /**
     * 删除
     * @param fileName
     * BucketName 需要传入桶名
     * @return
     * @throws Exception
     */
    public boolean remove(String fileName){
        try {
            minioClient.removeObject( RemoveObjectArgs.builder().bucket("BucketName").object(fileName).build());
        }catch (Exception e){
            return false;
        }
        return true;
    }
    }

测试

@RequestMapping("/tesss")
@RestController
public class TestCon {
    @Autowired
    MinioUtil minioUtil;
    @GetMapping("/test")
    public Boolean bucketExists(String bucketName) {
        return minioUtil.bucketExists(bucketName);
    }

    @GetMapping("/test123")
    public Boolean makeBucket(String bucketName) {
        return minioUtil.makeBucket(bucketName);
    }
}

如果想要在上传完成后再进行下一步的操作 ,应该进行如下操作

@Async
	public CompletableFuture<String> uploadFile(String bucketName, String fileName, InputStream stream,PutObjectOptions putObjectOptions){
		CompletableFuture<String> future = new CompletableFuture<>();
		try {
			minioClient.putObject(bucketName, fileName, stream, putObjectOptions);
			future.complete("上传成功");
		} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException
				| IllegalArgumentException e) {
			future.completeExceptionally(e);
		}
		return future;
	}

调用上述方法实现判断文件是否上传成功文章来源地址https://www.toymoban.com/news/detail-546230.html

public String uploadFileCallAlgorithm(MultipartFile file, String algType,String arithmeticCode) throws IOException {
PutObjectOptions putObjectOptions = new PutObjectOptions(file.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
			CompletableFuture<String> future = this.uploadFile(BucketName, fileName, file.getInputStream(), putObjectOptions);
				future.thenAccept(results -> {
				//此处可写上传文件完成后的实现逻辑
				}).exceptionally(ex -> {
				return null;
			}).join();
			return miningCode;
		}else {
			return "请上传csv文件";
		}
}

到了这里,关于SpringBoot+MinIO实现minio部署和使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 集成Minio

    1、docker创建minio容器 (1)Dockerfile文件  (2) 创建镜像 (3)创建容器  访问minio管理后台 http://192.168.81.200:8341/login  账号密码  masterminio /  mastermminio 2、Spring Boot 集成minio (1) pom加入minio依赖 (2)yml文件加入配置 (3) 后端代码编写    链接配置  上传文件工具类  上传接口开发

    2024年02月12日
    浏览(54)
  • 在 Spring Boot 中集成 MinIO 对象存储

    MinIO 是一个开源的对象存储服务器,专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO,以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 创建minio数据和配置目录 运行minio容器,设置访问和密钥并

    2024年02月10日
    浏览(49)
  • spring boot + minio 分布式文件上传

    1、分布式文件系统 简单理解为:一个计算机无法存储海量的文件,通过网络将若干计算机组织起来共同去存储海量的文件,去接收海量用户的请求,这些组织起来的计算机通过网络进行通信。 好处: 一台计算机的文件系统处理能力扩充到多台计算机同时处理。 一台计算机

    2024年02月08日
    浏览(58)
  • MinIO【部署 01】MinIO安装及SpringBoot集成简单测试

    下载 https://min.io/download#/linux; 安装文档 https://min.io/docs/minio/linux/index.html。 工作台详细使用文档 https://min.io/docs/minio/linux/administration/minio-console.html#minio-console 登录页面: 登录成功: Java Quickstart Guide https://min.io/docs/minio/linux/developers/java/minio-java.html#minio-java-quickstart Java SDK htt

    2024年02月11日
    浏览(35)
  • Linux下使用Docker部署MinIO存储服务实现远程上传

    本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句:努力一点,优秀一点 前言 MinIO是一个开源的对象存储服务器,可以在各种环

    2024年02月19日
    浏览(42)
  • 开源对象存储系统minio部署配置与SpringBoot客户端整合访问

    官方介绍: MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的私有云储存服务。在 GNU AGPL v3 下是 100% 开源的。 部署简单,只有一个minio可执行文件。 高性能,在 32 个 NVMe 驱动器节点和 100Gbe 网络上发布的 GET/PUT 结果超过 325 GiB/秒和 165 GiB/秒。 Kubernetes原

    2024年02月09日
    浏览(47)
  • springboot实现文件上传到minio

    一、前言 最近在项目中用的使用minio来上传文件,因此在这里给告诉大家如何实现 二、实现文件上传至minio 1.添加相关的maven依赖 2.minio连接配置 (1)首先配置minio属性 (2)接着配置minio连接,代码如下: (3)在YAML添加minio配置 3.定义minio工具类,代码如下: 4.编写实现文件

    2024年02月09日
    浏览(41)
  • springboot实现minio文件分片上传

    在Spring Boot中实现MinIO的文件分片上传涉及到几个关键步骤。MinIO是一个高性能的分布式对象存储服务,它兼容Amazon S3的API。分片上传主要用于上传大文件,将大文件分成多个部分,分别上传,最后再将这些部分合并成一个完整的文件。这样做的好处是提高了上传的可靠性,并

    2024年01月17日
    浏览(61)
  • SpringBoot + minio实现分片上传、秒传、续传

    MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议,项目地址是https://github.com/minio/minio。 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工

    2024年02月08日
    浏览(55)
  • SpringBoot整合Minio(实现上传与下载)

    MinIO 是一款高性能、分布式的对象存储系统 . 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 1.导入环境所需要的依赖 2.application.yml中进行minio的配置 3.MinIoConfig.class 配置类  此类主要做一些连接Minio实例化对象的配置  4.AjaxResult.cl

    2024年02月07日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包