1.什么是minio
MinIO是一款高性能、分布式的对象存储系统,它使用Go语言编写,并基于Apache License v2.0开源协议。
MinIO的主要特点包括简单、可靠。它采用简单可靠的集群方案,摒弃复杂的大规模的集群调度管理,减少风险与性能瓶颈,聚焦产品的核心功能,打造高可用的集群、灵活的扩展能力以及超过的性能。MinIO支持云原生,能与Kubernetes、Docker、Swarm编排系统良好对接,实现灵活部署。部署简单,只有一个可执行文件,参数极少,一条命令即可启动一个MinIO系统。
MinIO使用纠删码机制来保证高可靠性。纠删码是一种错误修复编码,可以用来检测和修复数据在存储过程中的错误。MinIO通过将数据分成多个块并使用纠删码进行编码,确保数据的可靠性和可用性。
2.怎么得到它
文档:https://min.io/docs/minio/container/index.html
源码:https://github.com/minio/minio
3.如何部署
(1)使用docker部署
mkdir -p ~/minio/data
docker run \
-p 9000:9000 \
-p 9090:9090 \
--name minio \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=ROOTNAME" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
quay.io/minio/minio server /data --console-address ":9090"
(2)使用linux/mac直接部署
软件包下载地址:https://github.com/minio/minio/releases
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
4.如何访问
(1)9090端口作为web界面管理
(2)9000端口作为api调用
5.简单使用及概念介绍
(1) Bucket: 存储空间(对象桶),存放对象的逻辑空间。在上传对象前需要提前创建存储空间
- 创建bucket:
- 设置权限:
当设置public时,文件可以公开访问
- 其他功能包括读写设置,复制策略(高可用性、备份和容灾),event事件,配额,标签,存储空间查看等等
(2) Object: 对象是对象存储数据的基本单元,可以是文档、图片、音视频等
-
创建对象:
-
分享文件地址
-
包含下载,预览,打标签,查看文件大小等等
(4) Policy: 可以为对象存储的资源设置权限,如读写权限,是否需要鉴权访问。默认的资源权限是private的,需要鉴权才能访问,并且有时间限制。
(5) Identity: 用户管理,用户组管理,OPENID等等
(6) 其他:监控,事件等等
6.Springboot项目中使用minio
(1) pom 依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
(2) api简单调用
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;
@Service
public class MinioService{
@Value("${minio.key}")
private String key;
@Value("${minio.secret}")
private String secret;
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.bucket}")
private String bucket;
//获取对象存储客户端
public MinioClient ossClient() {
return MinioClient.builder()
.endpoint(this.endpoint)
.credentials(this.key, this.secret)
.build();
}
//根据生成访问地址
public String getPresignedObjectUrl(String fileName) throws Exception{
MinioClient minioClient = this.ossClient();
return minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucket)
.object(fileName)
.expiry(1, TimeUnit.HOURS)
.build());
}
//根据上传资源
public void putObject(String fileName, InputStream ins) throws Exception{
MinioClient minioClient = this.ossClient();
minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(fileName).stream(
ins, -1, 10485760)
.build());
}
//根据某个文件夹或前缀的文件
public Iterable<Result<Item>> listObject(String prefix) {
MinioClient minioClient = this.ossClient();
return minioClient.listObjects(
ListObjectsArgs.builder()
.bucket(bucket)
.prefix(prefix)
.maxKeys(100)
.recursive(true)
.includeVersions(true)
.build());
}
}
(3) 开发文档
https://min.io/docs/minio/linux/developers/java/minio-java.html#minio-java-quickstart
https://min.io/docs/minio/linux/developers/java/API.html