MinIO快速入门

https://blog.csdn.net/qq_46921028/article/details/130279107?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170226057116800192288274%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170226057116800192288274&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-130279107-null-null.nonecase&utm_term=MinIo%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8&spm=1018.2226.3001.4450

一、MinIO概述

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

文档地址:http://docs.minio.org.cn/docs/

MinIO是一款基于Apache License v2.0开源协议的分布式文件系统(或者叫对象存储服务),可以做为云存储的解决方案用来保存海量的图片、视频、文档等。由于采用Golang实现,服务端可以工作在Windows、Linux、 OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令就可以运行起来。

MinIO兼容亚马逊S3(Simple Storage Service,简单存储服务)云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而且每个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO特点:

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

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

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

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

MinIO基本概念:

bucket(桶) :类似文件系统的目录(文件夹);

Object : 类似文件系统的文件;

Keys :类似文件名;

MINIO_ACCESS_KEY:访问key,类似账号;

MINIO_SECRET_KEY:秘钥,类似密码。

文件存储方式对比:

存储方式                                                               优点                                                   缺点

服务器磁盘                                                     开发便捷,成本低                               扩展困难

分布式文件系统(开源:FastDFS、MinIO)     容易实现扩展                                  复杂度高

第三方存储(阿里云OSS、七牛云)   开发简单,功能强大,免维护                            收费

分布式文件系统对比:

FastDFS是阿里余庆做的个人项目,也是一款开源高性能的分布式文件系统,适合小规模文件数据存储,默认不提供UI界面,安装部署(运维)复杂,很难达到以G为单位的每秒读写速度,没有完备的官方文档,环境搭建较为复杂;

MinIO是由MinIO.Inc运营的开源项目,号称世界上速度最快的对象存储服务器,并且社区活跃度高,标准硬件条件下它能达到55GB/s的读、35GB/s的写速率,而且MinIO部署自带管理界面,不需要额外安装;MinIO提供了所有主流开发语言的SDK,并且兼容亚马逊S3云存储服务接口,在MinIO中一个对象文件可以是任意大小,从几KB到最大的5T不等;最后它提供了与k8s、etcd、docker等容器技术深度集成方案,可以说就是为云原生而生的。(缺点,不支持动态增加节点)

更详细文章参考:https://www.cnblogs.com/loveer/p/16857625.html

二、MinIO环境搭建

本文基于Docker实现MinIO环境快速部署,Docker安装参考:https://blog.csdn.net/qq_46921028/article/details/129096134

1、拉取镜像(https://hub.docker.com/r/minio/minio/tags)

# 下载新版minio

docker pull minio/minio

# 或者下载指定版本的minio

docker pull minio/minio:RELEASE.2021-04-06T23-11-00Z

2、创建容器

docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /docker/minio/data:/data -v /docker/minio/config:/root/.minio minio/minio server /data

# 或者指定镜像版本并创建容器

docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /docker/minio/data:/data -v /docker/minio/config:/root/.minio minio/minio:RELEASE.2021-04-06T23-11-00Z server /data

-p 9000:9000 ,端口映射

-e,环境变量

-d,后台运行

–name,给容器起名字

–restart=always,开机自启

-e “MINIO_ACCESS_KEY=minio”,设置账号

-e “MINIO_SECRET_KEY=minio123”,设置密码

-v 挂载数据卷

3、测试访问MinIO后台系统,直接浏览器访问 http://ip:9000 即可,账号minio,密码minio123

管理界面:

4、创建 bucket(桶)

首先点击右下角的"+"号,创建一个桶

给创建的桶起个名字:

最后在minio管理界面就能看到刚刚创建的桶结构:

三、快速入门

基于SpringBoot快速整合MinIO

1、创建springboot工程

2、导入相关依赖

<dependencies>

    <!--minio-->

    <dependency>

        <groupId>io.minio</groupId>

        <artifactId>minio</artifactId>

        <version>7.1.0</version>

    </dependency>

    <!--web-->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

<!--test-->

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

    </dependency>

    <!--knife4j(swagger) -->

    <dependency>

        <groupId>com.github.xiaoymin</groupId>

        <artifactId>knife4j-spring-boot-starter</artifactId>

        <version>3.0.2</version>

    </dependency>

    <!--lombok-->

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

    </dependency>

</dependencies>

3、整合swagger

3.1、编写Swagger配置类

package com.baidou.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.service.Contact;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**

* Swagger2配置类(生成接口文档)

*

* @author 白豆五

* @version 2023/04/21

* @since JDK8

*/

@Configuration

@EnableSwagger2 //开启swagger2注解支持

@EnableKnife4j  //开启Knife4j注解支持

public class SwaggerConfig {

@Bean

    public Docket webApiConfig() { //生成接口文档的清单

        // 文档类型

        return new Docket(DocumentationType.SWAGGER_2)

                .groupName("webApi")

                .apiInfo(webApiInfo())

                .select()

                //指定controller包扫描路径

                .apis(RequestHandlerSelectors.basePackage("com.baidou.controller"))

                .paths(PathSelectors.any())

                .build();

    }

//配置在线api文档信息

    private ApiInfo webApiInfo() {

        return new ApiInfoBuilder()

                .title("网站-API文档")

                .description("本文档描述了xxx管理系统微服务接口定义")

                .version("1.0")

                .contact(new Contact("白豆五", "https://blog.csdn.net/qq_46921028", "13212341234@163.com"))

                .build();

    }

}

3.2、设置静态资源映射(对Swagger的静态资源放行)

package com.baidou.config;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 对WebMvc进行一些配置,为swagger静态资源进行放行

@Configuration

public class WebMvcConfig implements WebMvcConfigurer {

    // 静态资源放行

    @Override

    public void addResourceHandlers(ResourceHandlerRegistry registry) {


        // 对swaggger静态资源放行

        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

    }

}

4、编写 MinIO属性配置类

package com.baidou.dto;

import lombok.Data;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

import java.io.Serializable;

@Data

@Component

@ConfigurationProperties(prefix = "minio")  //自动注入属性前缀为minio的配置

public class MinIOConfigProperties implements Serializable {

    private String accessKey; // 访问key

    private String secretKey; // 秘钥

    private String bucket;    // 桶

    private String endpoint;  // 地域节点

    private String readPath;  // 读取路径

}

5、编写MinIO配置类,注册MinioClient客户端的Bean对象

package com.baidou.config;

import io.minio.MinioClient;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

* MinIO配置类

*

* @author 白豆五

* @version 2023/04/21

* @since JDK8

*/

@Configuration

public class MinIOConfig {

@Autowired

    private MinIOConfigProperties minIOConfigProperties;

    // 注册MinIO实例

    @Bean

    public MinioClient buildMinioClient(){

        return MinioClient

                .builder()

                .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())

                .endpoint(minIOConfigProperties.getEndpoint())

                .build();

    }

}

6、在application.yml文件中配置minio自定义属性和文件上传大小

minio:

  accessKey: minio

  secretKey: minio123

  bucket: testminio

  endpoint: http://192.168.200.128:9000

  readPath: http://192.168.200.128:9000

  servlet:

    multipart:

      # 单个上传文件的最大值是200mb

      max-file-size: 200MB

      # 单次请求的最大值

      max-request-size: 200MB

7、编写操作minio相关业务接口

业务接口实现类:

8、编写统一结果处理类

9、编写controller

10、启动项目,然后用postman测试

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容