SpringBoot整合 MinIO 分布式对象存储

前言

全世界增长最快的对象存储系统

MinIO生产部署涵盖了全球。 作为全球使用最多和下载量最大的对象存储服务系统, 它的影响力在与日俱增 - 由非凡的贡献者和传播者社区提供支持。

特点 :

高性能 : 标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。 对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。

可扩展性:MinIO利用了Web缩放器的来之不易的知识,为对象存储带来了简单的缩放模型。 这是我们坚定的理念 “简单可扩展.” 在 MinIO, 扩展从单个群集开始,该群集可以与其他MinIO群集联合以创建全局名称空间, 并在需要时可以跨越多个不同的数据中心。 通过添加更多集群可以扩展名称空间, 更多机架,直到实现目标。

云的原生支持:MinIO 是在过去4年的时间内从0开始打造的一款软件 ,符合一切原生云计算的架构和构建过程,并且包含最新的云计算的全新的技术和概念。 其中包括支持Kubernetes 、微服和多租户的的容器技术。使对象存储对于 Kubernetes更加友好。

官方文档:http://www.minio.org.cn/

快速入门

使用 docker 快速使用 ,非常方便,不会docker的请看教程 Docker 教程

docker pull minio/minio

拉取minio文档版的镜像文件,拉取好了之后直接查看:

docker images

启动minio:

docker run -p 9000:9000 minio/minio server /data

启动成功后,如果是服务器上面那么就放开9000端口 ,外网访问 ip加端口访问,如果看到minio的登录页面那么就成功了。

在这里插入图片描述

默认登录用户和密码,在启动的时候就提示了 : minioadmin/minioadmin 默认的用户名和密码。

文件上传

Minio java sdk 官方参考文档

先详细的查看官方文档,已经对接的api接口,官方demo,参数等,使用一个技术之前,先了解他。

pom加入依赖:

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

MinioClient 是minio java客户端连接服务器已经操作 minio的一个核心类,大部分的功能都是基于这个类来实现的,所以我们看这个类中的方法就可以了。

yml配置:

minio:
  endpoint: http://139.196.140.243:9000/ //
  accessKey: minioadmin //登录的
  secretKey: minioadmin //登录的
  bucket: backet //minio服务创建的捅

代码操作:

    @Autowired
    MinioConfig minioConfig;


    /**
     * 上传文件:
     */
    public String uploadedFile() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException, RegionConflictException {
        try{
            MinioClient minioClient = init();
            boolean bucketExists = minioClient.bucketExists(minioConfig.getBucket());
            //判断捅是否存在,如果不存在那么就创建捅:
            if(!bucketExists){
                minioClient.makeBucket(minioConfig.getBucket());
            }
            File file = new File("spring-boot-minio-integrat/1122.png");
            FileInputStream fileInputStream = new FileInputStream(file);
            PutObjectOptions putObjectOptions = new PutObjectOptions(fileInputStream.available(), -1);
            //这里根据不同文件 设置不同的 contentype 请看参考文档 https://tool.oschina.net/commons/
            //默认设置的是 application/octet-stream 下载文件。
            putObjectOptions.setContentType(getMimeType(file.getPath()));
//            Map<String, String> headers = new HashMap<>();
//            headers.put("Content-Type",getMimeType(file.getPath()));
//            putObjectOptions.setHeaders(headers);
            minioClient.putObject(minioConfig.getBucket(),file.getName(), fileInputStream,putObjectOptions);
            System.out.println("上次文件成功!");
            /**
             * 成功后 生成一个可以访问的url
             */
            String url = minioClient.getObjectUrl(minioConfig.getBucket(),file.getName());
            //获取到url 直接入库存在线的链接就ok了
            return url;
        }catch (InvalidEndpointException | InvalidPortException e) {
            e.printStackTrace();
        }
        return  "";
    }

    /**
     * 初始化
     * @return
     * @throws InvalidPortException
     * @throws InvalidEndpointException
     */
    public MinioClient init() throws InvalidPortException, InvalidEndpointException {
        MinioClient  minioClient = new MinioClient(minioConfig.getEndpoint(),minioConfig.getAccessKey(),minioConfig.getSecretKey());
        return  minioClient;
    }


    /**
     * 获取文件中的 MimeType
     * @param fileUrl
     * @return
     */
    public  String getMimeType(String fileUrl)
    {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String type = fileNameMap.getContentTypeFor(fileUrl);
        return type;
    }

在线预览问题

1.创建捅的时候。没有设置策略,这就导致分享的文件只能是下载,无法在浏览器中打开就浏览,

在这里插入图片描述

创建捅,填写捅的名字后直接回车 : test ,创建成功后,设置策略
在这里插入图片描述

设置捅的策略:
在这里插入图片描述

点击add 这表示所有文件都支持读和写的策略,这样上传上去的文件,在分享的时候,在浏览器上就能做到预览。

在这里插入图片描述

这样分享的文件有时间限制,最大是7天,7天后就无法访问。

2.getObjectUrl 方法生成在线文件链接,永久有效.

在上面的代码中就能看到,我上传后,立马把当前文件生成了在线访问的文件,但是这样有一个问题,在

浏览器中访问是直接下载的。http://139.196.140.243:9000/backet/1122.png

但是我用img 标签来显示就正常显示了。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<img src="http://139.196.140.243:9000/backet/1122.png" />
	</body>
</html>

在这里插入图片描述

显示正常了。

putObject方法

这个方法是一个重载的方法,基本的参数就是

bucketName : 上传的捅名称

objectName : 上传成功的文件名字

filename : 上传的文件路径 InputStream : 可以通过流的方式上传文件

PutObjectOptions : 设置 Content-Type map等参数

在默认的情况下 Content-Type 设置的 是 application/octet-stream 下载,所以上传的时候我们要区分文件设置不同的 Content-Type 请看参考文档 : https://tool.oschina.net/commons/

在代码中我也处理过这个问题了 URLConnection 来做。

源码:

   if (options.contentType().equals("application/octet-stream")) {
                    String contentType = Files.probeContentType(filePath);
                    if (contentType != null && !contentType.equals("")) {
                        options.setContentType(contentType);
                    }
                }

其他好玩的,请自行读文档,调试开发,实例代码在github上面需要的请自行拉取:spring-boot-integrate 然后后续会集成更多的模块进去,需要请点个star。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Minio分布式对象存储具有可推广性的优点。它的学习成本低,安装和运维简单,开箱即用。目前Minio论坛推广力度大,有问必答,并且提供了Java客户端和JS客户端。在数据保护方面,分布式Minio采用纠删码来防范多个节点宕机和位衰减bit rot。分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。在一致性方面,Minio分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。此外,Minio还支持联盟模式扩展集群。因此,Minio分布式对象存储具有良好的可推广性。\[1\]\[2\] #### 引用[.reference_title] - *1* [minio集群搭建以及与其他分布式存储系统对比](https://blog.csdn.net/liushuiziyouliu/article/details/106938160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [盘点分布式文件存储系统____分布式文件存储系统简介](https://blog.csdn.net/qq_43842093/article/details/121867125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值