专业的编程技术博客社区

网站首页 > 博客文章 正文

MinIO分布式存储从0到Vue+SpringBoot整合开发

baijin 2025-03-12 12:11:11 博客文章 127 ℃ 0 评论

获课地址:789it.top/13655/

MinIO 是一个高性能的分布式对象存储系统,兼容 Amazon S3 API,适合存储非结构化数据(如图片、视频、日志等)。以下是 MinIO 分布式存储从 0 到与 Vue + Spring Boot 整合开发的完整指南。


1. MinIO 简介

  • 特点
    • 高性能:支持高并发读写。
    • 分布式:支持多节点部署,数据自动分片和冗余。
    • 兼容 S3:完全兼容 Amazon S3 API。
    • 开源:基于 Apache License 2.0 开源。
  • 使用场景
    • 文件存储与分享。
    • 大数据存储与分析。
    • 备份与归档。

2. MinIO 安装与部署

2.1 单节点部署

  1. 下载 MinIO
  2. 访问 MinIO 官网 下载对应操作系统的二进制文件。
  3. 或使用 Docker 部署:
  4. bash
  5. 复制
  6. docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"
  7. 启动 MinIO
  8. 命令行启动:
  9. bash
  10. 复制
  11. ./minio server /data
  12. 访问控制台:http://localhost:9000,默认用户名 minioadmin,密码 minioadmin。

2.2 分布式部署

  1. 准备多台服务器(至少 4 台)。
  2. 启动 MinIO 集群
  3. bash
  4. 复制
  5. ./minio server http://node1/data http://node2/data http://node3/data http://node4/data
  6. 访问控制台:通过任意节点的 IP 和端口访问。

3. MinIO 基本操作

3.1 使用 MinIO 控制台

  • 创建 Bucket(存储桶)。
  • 上传、下载、删除文件。
  • 设置 Bucket 的访问权限。

3.2 使用 MinIO 客户端(mc)

  1. 安装 mc
  2. bash
  3. 复制
  4. wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc ./mc --help
  5. 配置 MinIO 服务器
  6. bash
  7. 复制
  8. ./mc alias set myminio http://localhost:9000 minioadmin minioadmin
  9. 常用命令
  10. 列出 Bucket:
  11. bash
  12. 复制
  13. ./mc ls myminio
  14. 上传文件:
  15. bash
  16. 复制
  17. ./mc cp myfile.txt myminio/mybucket/
  18. 下载文件:
  19. bash
  20. 复制
  21. ./mc cp myminio/mybucket/myfile.txt ./

4. Spring Boot 整合 MinIO

4.1 添加依赖

在 pom.xml 中添加 MinIO 客户端依赖:

xml

复制


    io.minio
    minio
    8.5.2

运行 HTML

4.2 配置 MinIO 客户端

在 application.yml 中配置 MinIO 连接信息:

yaml

复制

minio:
  endpoint: http://localhost:9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucket: mybucket

4.3 创建 MinIO 工具类

java

复制

import io.minio.*;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@Component
public class MinioUtil {

    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Value("${minio.bucket}")
    private String bucket;

    private MinioClient minioClient;

    @PostConstruct
    public void init() {
        minioClient = MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }

    // 上传文件
    public void uploadFile(String objectName, InputStream inputStream) throws Exception {
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucket)
                        .object(objectName)
                        .stream(inputStream, -1, 10485760) // 10MB 分片
                        .build());
    }

    // 下载文件
    public InputStream downloadFile(String objectName) throws Exception {
        return minioClient.getObject(
                GetObjectArgs.builder()
                        .bucket(bucket)
                        .object(objectName)
                        .build());
    }

    // 删除文件
    public void deleteFile(String objectName) throws Exception {
        minioClient.removeObject(
                RemoveObjectArgs.builder()
                        .bucket(bucket)
                        .object(objectName)
                        .build());
    }
}

4.4 创建文件上传接口

java

复制

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

@RestController
@RequestMapping("/file")
public class FileController {

    @Autowired
    private MinioUtil minioUtil;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            String fileName = file.getOriginalFilename();
            InputStream inputStream = file.getInputStream();
            minioUtil.uploadFile(fileName, inputStream);
            return "文件上传成功:" + fileName;
        } catch (Exception e) {
            return "文件上传失败:" + e.getMessage();
        }
    }
}

5. Vue 前端整合

5.1 安装依赖

使用 Axios 进行文件上传:

bash

复制

npm install axios

5.2 文件上传组件

vue

复制



<script>
import axios from 'axios';

export default {
  data() {
    return {
      file: null,
      message: '',
    };
  },
  methods: {
    handleFileChange(event) {
      this.file = event.target.files[0];
    },
    async uploadFile() {
      if (!this.file) {
        this.message = '请选择文件';
        return;
      }
      const formData = new FormData();
      formData.append('file', this.file);
      try {
        const response = await axios.post('http://localhost:8080/file/upload', formData, {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        });
        this.message = response.data;
      } catch (error) {
        this.message = '上传失败:' + error.message;
      }
    },
  },
};
</script>

6. 测试与部署

  1. 启动 Spring Boot 应用
  2. 启动 Vue 前端
  3. bash
  4. 复制
  5. npm run serve
  6. 访问前端页面,上传文件并验证 MinIO 存储。

总结

通过以上步骤,你可以从 0 开始搭建 MinIO 分布式存储,并整合 Vue + Spring Boot 实现文件上传与管理。MinIO 的高性能和易用性使其成为分布式存储的理想选择,适合各种规模的应用程序。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表