开发者

springboot整合minio实现文件存储功能

开发者 https://www.devze.com 2023-12-30 10:25 出处:网络 作者: 豆豆的java之旅
目录一,minio介绍应用场景单主机单硬盘模式单主机多硬盘模式多主机多硬盘分布式特点存储机制二,搭建安装三,使用3.1引入依赖3.2创建文件上传的controller FileController3.3登陆控制台设置桶的状态为公开四,注意一,mi
目录
  • 一,minio介绍
    • 应用场景
      • 单主机单硬盘模式
      • 单主机多硬盘模式
      • 多主机多硬盘分布式
    • 特点
      • 存储机制
      • 二,搭建安装
        • 三,使用
          • 3.1引入依赖
            • 3.2创建文件上传的controller FileController
              • 3.3登陆控制台设置桶的状态为公开
              • 四,注意

                一,minio介绍

                MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

                MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 Nodejs, Redis 或者 mysql。

                官方文档:MinIO对象存储 Kubernetes — MinIO中文文档 | MinIO Kubernetes中文文档 旧一点

                MinIO Object Storage for Kubernetes — MinIO Object Storage for Kubernetes 新

                应用场景

                单主机单硬盘模式

                springboot整合minio实现文件存储功能

                单主机多硬盘模式

                springboot整合minio实现文件存储功能

                多主机多硬盘分布式

                springboot整合minio实现文件存储功能

                特点

                · 高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率

                · 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心

                · 云原生:容器化、基于K8S的编排、多租户支持

                · Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI访问Minio服务器。

                · 可对接后端存储: 除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。

                · SDK支持: 基于Minio轻量的特点,python它得到类似Java、python或Go等语言的sdk支持

                &mwww.devze.comiddot; Lambda计算: Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。

                · 有操作页面

                · 功能简单: 这一设计原则让MinIO不容易出错、更快启动

                · 支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据**!**

                存储机制

                Minio使用纠删码erasure code和校验和checksum。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。

                纠删码是一种恢复丢失和损坏数据的数学算法**。**

                二,搭建安装

                docker pull minio/minio
                新版本: 
                docker run \
                  -p 9000:9000 \
                  -p 9001:9001 \
                  --name minio \
                  -d --restart=always \
                  -e "MINIO_ROOT_USER=admin" \
                  -e "MINIO_ROOT_PASSWORD=admin123456" \
                  -v /home/data:/data \
                  -v /home/config:/root/.minio \
                  minio/minio server /data --console-address ":9001"
                 
                 

                浏览器访问:http://IP:9000/minio/login,如图:

                springboot整合minio实现文件存储功能

                三,使用

                3.1引入依赖

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

                3.2创建文件上传的controller FileController

                注意:一些参数不能写死,需要写到配置文件里面进行动态读取

                minio:
                  endpointUrl: http://192.168.17.166:9000
                  AccessKey: admin
                  secreKey: admin123456
                  bucketName: gmall
                 
                 @RestController
                @RequestMapping("/admin/product")
                public class FileController {
                    //由于参数不固定,因此需要从配置文件读取,有两种方式①@value注解②创建实体类使用@configurationproperties注解指定前缀注入
                    @Value("${minio.endpointUrl}")
                    private String endpoint编程客栈Url; //文件服务器登录地址
                    @Value("${minio.accessKey}")
                    private String accessKey; //用户名
                    @Value("${minio.secreKey}")
                    private String secreKey;  //密码
                    @Value("${minio.bucketName}")
                    private String bucketName; //储存桶名称
                 
                 
                    /**
                     * @Description: 上传图片到minio文件服务器
                     * @Param: MultipartFile
                     * @return:
                     * @Author: Mr.Zhan
                     * @Date: 2022/3/28  17:59
                     */
                    @PostMapping("/fileUpload")
                    public Result fileUpload(MultipartFile file) {
                        String result =null;
                        try {
                            // 创建minio的客户端
                            MinioClient minioClient =
                                    MinioClient.builder()
                                            .endpoint(endpointUrl)  //指定文件服务器地址,用户名,密码
                                            .credentials(accessKey, secreKey)
                                            .build();
                 
                            // 判断存储桶是否存在
                            boolean found =
                                    minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
                            if (!found) {
                                // 不存在则创建一个桶
                                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
                            } else {
                                throw new GmallException("存储桶已经存在", 20001);
                            }
                 
                            //准备上传的图片名称
                            String fileName = System.currentTimeMillis() + UUID.randomUUID().toString().replaceAll("-", "") + file.getOriginalFilename();
                            //使用流上传文件
                            /*
                             * ①bucketName 存储桶名字
                             * ②fileName   文件名称
                             * ③ file.getInputStream() 文件流
                             * ④file.getSize()文件大小
                             * file.getContentType() 文件类型
                             * */
                            minioClient.putObject(
                                    PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                                            file.getInputStream(), file.getSize(), -1)
                                            .contentType(file.getContentType())
                                            .build());
                            result=endpointUrl + "/" + bucketName + "/" + fileName;
                 
                            
                        } catch (ErrorResponseException e) {
                            e.printStackTrace();
                        } catch (InsufficientDataException e) {
                            e.printStackTrace();
                        } catch (InternalException e) {
                            e.printStackTrace();
                        } catch (InvalidKeyException e) {
                            e.printStackTrace();
                        } catch (InvalidResponseException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (NoSuchAlgorithmException e) {
                            e.printStackTrace();
                        } catch (ServerException e) {
                            e.printStackThttp://www.devze.comrace();
                        } catch (XMLParserException e) {
                            e.printStackTrace();
                        }
                        return Result.ok(result);
                    }
                }
                 

                3.3登陆http://www.devze.com控制台设置桶的状态为公开

                四,注意

                注意:文件上传时,需要调整一下linux 服务器的时间与Windows 时间一致!
                第一步:安装ntp服务
                yum -y install ntp
                 
                第二步:开启开机启动服务
                systemctl enable ntpd
                 
                第三步:启动服务
                systemctl start ntpd
                 
                第四步:更改时区
                timedatectl set-timezone Asia/Shanghai
                 
                第五步:启用ntp同步
                timedatectl set-ntp yes
                 
                第六步:同步时间
                ntpq -p

                以上就是springboot整合minio实现文件存储功能的详细内容,更多关于springboot minio文件存储的资料请关注编程客栈(www.devze.com)其它相关文章!

                0

                精彩评论

                暂无评论...
                验证码 换一张
                取 消

                关注公众号