likes
comments
collection
share

MinIO对象存储服务快速搭建与应用

作者站长头像
站长
· 阅读数 7

MinIO对象存储服务快速搭建与应用

1.环境准备

1.1.Linux版本

cat /etc/centos-release -> CentOS Linux release 7.9.2009 (Core)

uname -r -> 3.10.0-1160.el7.x86_64

1.2.Docker版本

docker -v -> Docker version 25.0.1, build 29cf629

这里下载时未指定Docker版本,则为当时下载为最新版本。

2.Docker拉取镜像创建容器

docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name minio --restart=always --privileged=true \
-v /minio/data:/data \
-e "MINIO_ROOT_USER=用户名" \
-e "MINIO_ROOT_PASSWORD=密码" \
minio/minio server /data --console-address ":9001"
  • 用户名和密码为MinIO浏览器登录的用户名和密码,请自定义配置。

  • /minio/data 目录为Docker所在的宿主机的目录。

运行结果如下

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

访问MinIO所在的机器IP + 9001 端口号。

MinIO对象存储服务快速搭建与应用

进入到MinIO控制台首页,可以关注一下MinIO的版本,以及一会用到的桶和用户。

MinIO对象存储服务快速搭建与应用

以上就快速搭建完成了一个单体应用的MinIO应用服务。

3.MinIO应用服务配置

例如:需要上传头像相关的照片到服务中存储。

3.1.创建桶

创建桶,俗话创建某业务的顶级目录。

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

直接跳到了刚刚创建桶的根目录下

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

3.2.创建操作桶的用户

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

记录一下我刚刚设置的:

AK:ContentManager

SK:ContentManagerContentManager

MinIO对象存储服务快速搭建与应用

以上操作,对于粗粒度来说,已经准备的差不多了。开始进入代码层。

4.创建SpringBoot项目

4.1.引入MinIO坐标

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

是web项目喔,记得导入web相关坐标

4.2.创建MinIO相关属性配置类和配置文件所对应

@ConfigurationProperties(prefix = "app.minio")
@Component
@Data
public class MinioPropertiesConfig {

    private String baseUrl;
    private String endpoint;
    private String bucket;
    private String accessKey;
    private String secretKey;
}
app:
  minio:
    # 访问资源的 URL
    base-url: "http://192.168.3.85:9000"
    # API 端点
    endpoint: "http://192.168.3.85:9000"
    # 上传的 Bucket 桶
    bucket: head-portrait
    # Access Key
    access-key: ContentManager
    # Secret Key
    secret-key: ContentManagerContentManager

4.3.创建MinIO配置类

@SpringBootConfiguration
public class MinioConfig {

    @Autowired
    private MinioPropertiesConfig minioPropertiesConfig;

    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(minioPropertiesConfig.getEndpoint())
                .credentials(minioPropertiesConfig.getAccessKey(), minioPropertiesConfig.getSecretKey())
                .build();
    }

}

4.4.创建文件上传接口

@RestController
public class UploadController {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioPropertiesConfig minioPropertiesConfig;

    /**
     * 上传文件 名称必须为 file
     *
     * @return 主要返回上传后可访问的文件路径
     */
    @PostMapping("/upload")
    public Map<String, Object> upload(MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<>();

        // 1 判断文件的合法
        if (Objects.isNull(file) || file.getSize() == 0) {
            map.put("msg", "文件不能为空");
            return map;
        }

        // 可以自定义业务 例如:检查文件的大小 文件的类型 文件的md5等

        // 获取文件的基本信息
        String filename = file.getOriginalFilename();
        long fileSize = file.getSize();
        String fileContentType = file.getContentType();

        // 文件名称去重处理(这里简单处理)
        filename = System.currentTimeMillis() + "_" + filename;

        // 生成需要的上传到云服务的目录(根据业务要求来)
        LocalDate now = LocalDate.now();
        int year = now.getYear();
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();
        String filePath = String.format("%d/%d/%d/%s", year, month, day, filename);

        // 2 检查云存储服务的正常
        boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioPropertiesConfig.getBucket()).build());
        if (!exists) {
            // 桶不存在 可以创建桶
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioPropertiesConfig.getBucket()).build());
        }

        // 3 上传文件
        try (InputStream inputStream = file.getInputStream()) {
            minioClient.putObject(PutObjectArgs.builder()
                    // 指定 Bucket
                    .bucket(minioPropertiesConfig.getBucket())
                    // 指定 ContentType
                    .contentType(fileContentType)
                    // 指定文件的路径
                    .object(filePath)
                    // 文件的 inputStream 流
                    .stream(inputStream, fileSize, -1)
                    .build());
        }

        // 4 返回文件访问路径
        String fileURL = minioPropertiesConfig.getBaseUrl() + "/" + minioPropertiesConfig.getBucket() + "/" + filePath;

        // 封装返回结果
        map.put("fileURL", fileURL);
        return map;
    }


}

4.5.PostMan工具测试接口

MinIO对象存储服务快速搭建与应用

访问返回的云服务存储访问文件地址时:权限不足。

MinIO对象存储服务快速搭建与应用

此时就需要开启桶的匿名只读功能

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

然后就可以访问图片资源啦

MinIO对象存储服务快速搭建与应用

观察MinIO桶内的数据

MinIO对象存储服务快速搭建与应用

5.测试其他资源功能

5.1.上传zip格式文件

MinIO对象存储服务快速搭建与应用

也是上传成功,访问返回的地址,浏览器可自动识别进行下载此资源。

MinIO对象存储服务快速搭建与应用

5.2.测试上传视频资源

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

MinIO对象存储服务快速搭建与应用

浏览器访问视频资源则直接播放。

关于MinIO服务的其他高级功能,该篇文章就不记录了

  • MinIO集群部署
  • MinIO读写压力测试
  • MinIO文件细粒度权限控制
  • ...高级玩法

备注:该文章用于自我在文件存储功能上的基础实现记录,以及分享给需要搭建基础文件服务的同学们,曾经我也搭建和使用过FastDFS,那时候感觉到安装部署挺麻烦的,也没有继续使用了,直到接触到MinIO应用服务,听到是对标例如AL的OSS服务,再见。