17. MinIO 分布式文件存储

2023年 10月 9日 37.4k 0

Spring Cloud 微服务系列文章,点击上方合集↑

1. 简介

MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。

在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品

官网地址:www.minio.org.cn/

2. 下载

官网下载(8.4.3版本):www.minio.org.cn/download.sh…

网盘下载(推荐):「minio-8.4.3」来自UC网盘分享
drive.uc.cn/s/6f2c8055c…

3. 运行

创建四个文件夹data0data1data2data3,用存放文件。

启动minio服务

# mac/linux
./minio server ./data0 ./data1 ./data2 ./data3
 
# windows
minio.exe server ./data0 ./data1 ./data2 ./data3

访问地址:http://127.0.0.1:9000/,默认账号和密码都是:minioadmin

4. 创建桶

在Minio和其他一些对象存储服务中,"桶"(Bucket)是一个顶层的容器,用于组织和管理存储的对象(Object)。可以将桶类比为文件系统中的文件夹,用于将一组相关的对象进行组织和分类。

每个桶在Minio中具有唯一的名称,并且可以根据需要创建多个桶。用户可以使用桶名称来访问和操作其中的对象。桶名称是全局唯一的,因此需要确保不同应用程序使用不同的桶名称,以避免冲突。

我们创建一个test的桶(bucket)。

5. SpringBoot 集成 MinIO

5.1 pom.xml

添加如下minio依赖


    io.minio
    minio
    8.4.3

5.2 MinioConfiguration

配置minio的地址、账号和密码,配置上传文件的大小1024M。

@Configuration
public class MinioConfiguration {

    private static final String END_POINT = "http://localhost:9000";

    private static final String USERNAME = "minioadmin";

    private static final String PASSWORD = "minioadmin";

    @Bean
    public MinioClient minioClient() {
        return new MinioClient.Builder()
                .endpoint(END_POINT)
                .credentials(USERNAME, PASSWORD)
                .build();
    }

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofMegabytes(1024));
        factory.setMaxRequestSize(DataSize.ofMegabytes(1024));
        return factory.createMultipartConfig();
    }
}

5.3 MinioController

upload上传文件接口:传入参数bucket,文件保存到minio后会返回fileName

getUrl获取文件访问链接接口:传入参数pathbucket,返回可以访问的链接(7天有效)。这里的path就是上传文件的返回值fileName

@RequestMapping("minio")
@RestController
public class MinioController {
    @Resource
    private MinioClient minioClient;

    @PostMapping(value = "upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String upload(@RequestPart("file") MultipartFile file,
                         @RequestParam("bucket") String bucket) {
        try {
            int idx = Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf(".");
            String suffix = file.getOriginalFilename().substring(idx + 1);
            String fileName = UuidUtils.generateUuid() + "." + suffix;

            // 保存文件
            minioClient.putObject(PutObjectArgs.builder()
                    .stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE)
                    .object(fileName)
                    .contentType(file.getContentType())
                    .bucket(bucket)
                    .build());
            return fileName;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    @GetMapping("getUrl")
    public String getUrl(@RequestParam(name = "path") String path,
                         @RequestParam("bucket") String bucket) {
        try {
            // 获取文件访问地址 7天失效
            String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .bucket(bucket)
                    .object(path).
                    method(Method.GET)
                    .expiry(7, TimeUnit.DAYS).build());
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
}

5.4 okhttp3版本不兼容

如果出现okhttp3版本不兼容的问题,需要在pom.xmlproperties节点下加上版本号,如下:

4.8.1 

6. Postman测试

6.1 上传接口

接口地址:http://localhost:20000/minio/upload?bucket=test

  • 请求头 Content-Type:multipart/form-data
  • post请求
  • 路径 http://localhost:20000/minio/upload?bucket=test
  • 请求体为form-data,key为file
  • 该接口会返回一个唯一的文件path,一般业务会将这个文件path存在数据库中
  • 6.2 下载接口

    接口地址:http://localhost:20000/minio/getUrl?bucket=test&path=xxx

    xxx是上一步的返回值。

    • 该接口会返回一个可以访问的下载链接。

    7. 有意思的事

    7.1 删除自动恢复

    可以测试删除其中一半的存放位置,它过一会儿就自动恢复了,比如删除data0和data1,几分钟它就自动重新创建了文件,并且里面的内容也恢复了。

    7.2 文件夹

    上传的单个文件变成了文件夹

    7.3 分块存储

    点击到里面单个文件被拆分成了许多个小块

    8. 总结

    通过Spring Boot集成Minio,我们可以在应用程序中方便地使用Minio的功能,Spring Boot集成Minio可以帮助我们更轻松地开发和管理云存储解决方案。

    Spring Cloud 微服务系列 完整的代码在仓库的sourcecode/spring-cloud-demo目录下。

    gitee(推荐):gitee.com/cunzaizhe/x…

    github:github.com/tigerleeli/…

    关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论