MINIO对象存储管理的使用

MINIO对象存储管理的使用

1.前言

1.1 Minio定义

Minio是一个高性能的分布式对象存储系统,专为云原生应用设计。它是开源的,兼容 Amazon S3 API,允许用户在私有云或公有云环境中存储和管理海量数据。

1.2 Minio特点

  1. 高性能
    MinIO 采用高效的存储架构,能够提供极低的延迟和高吞吐量,适合大数据和机器学习工作负载。
  2. S3 兼容性
    MinIO 完全兼容 Amazon S3 API,使得现有的 S3 应用和工具可以轻松迁移到 MinIO,而无需进行大量修改。
  3. 简易部署
    MinIO 的部署非常简单,支持容器化(如 Docker 和 Kubernetes),可以快速在各种环境中运行。
  4. 高可用性和可扩展性
    支持分布式架构,可以水平扩展以满足不断增长的数据存储需求,同时提供高可用性和容错能力。
  5. 安全性
    提供多种安全功能,包括数据加密(静态和传输中的加密)、身份验证和访问控制,确保数据的安全性。
  6. 多种存储后端支持
    MinIO 可以与多种存储后端集成,如本地磁盘、云存储等,灵活适应不同的存储需求。

2.图片上传流程分析

这里本人通过自己的Spring Boot项目,在浏览器中上传了一张照片,解释了一下上传图片的流程
在这里插入图片描述

3.Minio使用

接下来我将使用我自己的一个spring boot项目,展示一下Minion的使用(我使用的是一个我部署在自己虚拟机上的一个Minio)

3.1 引入Minio Maven依赖
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
</dependency>
3.2 为了方便管理,将Minio的一些属性配置在application中,并用用一个类将其映射到其中
minio:
  endpoint: http://192.168.88.134:9000 #http://<hostname>:<port> 主机号和端口号
  access-key: minioadmin               #<access-key>用户名
  secret-key: minioadmin               #<secret-key>密码
  bucket-name: lease                   #<bucket-name>存储桶名称
3.3 创建Minio属性一一对应配置类
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;

    private String bucketName;
}
3.4 使用配置类来创建和管理外部服务(如 MinIO)客户端
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {

    @Autowired
    private MinioProperties properties;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(properties.getEndpoint())
                .credentials(properties.getAccessKey(), properties.getSecretKey()).build();
    }
}
3.5 service方法中的使用

在ServiceImpl中增加如下内容

@Service
public class FileServiceImpl implements FileService {

    @Autowired
    private MinioProperties properties;

    @Autowired
    private MinioClient client;

    @Override
    public String upload(MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException,
            NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
            //判断该存储桶是否存在,如果没有则创建一个新的存储桶
            boolean bucketExists = client.bucketExists(BucketExistsArgs.builder().bucket(properties.getBucketName()).build());
            if (!bucketExists) {
                client.makeBucket(MakeBucketArgs.builder().bucket(properties.getBucketName()).build());
                client.setBucketPolicy(SetBucketPolicyArgs
                        .builder()
                        .bucket(properties.getBucketName())
                        .config(createBucketPolicyConfig(properties.getBucketName())).build());
            }
            //给上传文件命名filename
            String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
            client.putObject(PutObjectArgs.builder().
                    bucket(properties.getBucketName()).
                    object(filename).
                    stream(file.getInputStream(), file.getSize(), -1).
                    contentType(file.getContentType()).build());
            //返回文件url = String.join("/", properties.getEndpoint(), properties.getBucketName(), filename)
            return String.join("/", properties.getEndpoint(), properties.getBucketName(), filename);
    }

    private String createBucketPolicyConfig(String bucketName) {

        return """
            {
              "Statement" : [ {
                "Action" : "s3:GetObject",
                "Effect" : "Allow",
                "Principal" : "*",
                "Resource" : "arn:aws:s3:::%s/*"
              } ],
              "Version" : "2012-10-17"
            }
            """.formatted(bucketName);
    }
}

注意

上述createBucketPolicyConfig方法的作用是生成用于描述指定bucket访问权限的JSON字符串。最终生成的字符串格式如下,其表示,允许(Allow)所有人(*)获取(s3:GetObject)指定桶()的内容。

{
  "Statement" : [ {
    "Action" : "s3:GetObject",
    "Effect" : "Allow",
    "Principal" : "*",
    "Resource" : "arn:aws:s3:::<bucket-name>/*"
  } ],
  "Version" : "2012-10-17"
}

这里设置的是允许所有人都可以查看

### MinIO 对象存储简单使用入门教程 #### 1. 安装 MinIO Server 和 Client 为了开始使用 MinIO,首先需要安装 MinIO server 和 MinIO client (mc)。可以通过多种方式来部署 MinIO server,比如直接下载二进制文件、通过 Docker 运行或是利用 Kubernetes 部署。 对于本地测试环境来说,最简便的方式可能是采用 Docker 来启动 MinIO 实例: ```bash docker run -p 9000:9000 --name minio \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=password" \ -v /data:/data \ -v /config:/root/.minio \ minio/minio server /data ``` 上述命令会创建一个新的名为 `minio` 的容器并映射端口 9000 到主机上[^3]。 #### 2. 初始化 MinIO 并设置访问凭证 当第一次运行 MinIO 后,在浏览器中打开 http://localhost:9000 即可进入 Web 控制台界面完成初始化配置过程。此时需指定管理员账号以及密码用于后续 API 请求的身份验证。 #### 3. 使用 MinIO Client (MC) MinIO 提供了一个强大的命令行工具 mc 可以方便地管理多个 S3 兼容的对象存储服务。安装完成后可通过如下指令连接至刚搭建好的 MinIO instance: ```bash mc alias set myminio http://localhost:9000 admin password ``` 这里定义了一个别名 `myminio` 方便之后的操作调用。 #### 4. 创建 Bucket Bucket 是用来存放对象(Object)的逻辑单元,类似于目录的概念。可以使用下面这条命令创建 bucket: ```bash mc mb myminio/mybucket ``` 这将在刚才设定的目标地址下建立名称为 `mybucket` 的新 bucket。 #### 5. 上载与下载文件 有了 bucket 之后就可以向其中上传文件了。假设有一个叫做 example.jpg 的图像文件想要存放到之前新建的那个 bucket 中去,则只需执行以下命令即可实现这一目的: ```bash mc cp ./example.jpg myminio/mybucket/ ``` 同样地,如果要从远程位置获取某个特定资源的话也可以借助类似的语法结构来进行操作: ```bash mc cp myminio/mybucket/example.jpg . ``` 以上就是基本的数据传输方法介绍。 #### 6. 浏览和管理数据 除了 CLI 工具之外还可以继续回到前面提到过的图形化界面上查看已有的 buckets 及其内部所含的内容;另外也支持在线编辑部分类型的文档等功能特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值