引言
MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品--------引自官网的话。这么一看这个MINIO好nb啊,居然能这么快。 就凭这速度就值得我们学习一下。
环境介绍
编程语言: 你爱我,我爱你的java
框架: springboot
还有今天的主角: MinIO
MinIo的部署
其实官网的文档写的挺好的,就是有些老旧了,怕是远古版本。为什么这么说呢,因为我照着文档启动,愣是跑不起来,吐了啊。后来还是在社区问了问,然后好心的官方大人告诉了我,还是得吐槽一下,文档更新一下吧,胡思乱想(指找问题时,各种猜疑)很累人的。情况如下
http://slack.minio.org.cn/question/737
1、下载
我们可以直接下载MinIO到本地运行,也可以使用容器下载并运行
我使用的是docker
#docker 拉取 MinIo 镜像
docker pull minio/minio
2、运行
如果你看了我上面发送的MinIO社区的链接,你想必应该也知道了启动方式。下面给出我在本机运行的真实案例
docker run -d -p 9000:9000 -p 9001:9001 -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" -v E:\data:/data -v E:\minio\config:/root/.minio minio/minio server /data --console-address ":9001"
3、测试
访问页面查看是否运行成功,输入我们在命令中打的用户名(MINIO_ROOT_USER)和密码(MINIO_ROOT_PASSWORD),其实用户名和密码duck不必写这么长,我当时应该是脑子坏掉了。
登录后,就可以看到如下界面,如果你也看到了这个界面,恭喜你完成了第一步,剩下还有999步。这样还是用一些操作的,你可以尝试一下。
SpringBoot集成MinIo
1、pom添加依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
2、yml增加MinIo配置
minio:
endpoint: http://127.0.0.1:9000
accesskey: SUCWGJ8W4H36HC7KR6XO
secretkwy: d9OkZ14ab04zwCd/+6iEXbPqeVapDOaDvhYcw88r
3、在SpringBoot添加配置类
配置文件值注入,这里我们获取了在yml的配置信息,用于下一步连接MinIO。
package com.zggk.mas.entity.sys;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* minio 属性值
*/
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
//连接url
private String endpoint;
//公钥
private String accesskey;
//私钥
private String secretkwy;
}
配置MinIO连接
package com.zggk.mas.config;
import com.zggk.mas.entity.sys.MinioProp;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* minio核心配置类
* 通过注入 MinIO 服务器的相关配置信息,得到 MinioClient 对象,我们上传文件依赖此对象
*/
@Configuration
public class MinioConfig {
@Autowired
private MinioProp prop;
/**
* 获取 MinioClient
* @return MinioClient
*/
@Bean
public MinioClient minioClient() {
return MinioClient.builder().endpoint(prop.getEndpoint()).
credentials(prop.getAccesskey(),prop.getSecretkwy()).build();
}
}
接下来,我们要写一个MinIo上传的工具类
package com.zggk.mas.entity.util;
import com.zggk.mas.entity.sys.MinioProp;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
/**
* minio操作类
*/
@Component
public class MinioUtils {
@Autowired
private MinioClient client;
@Autowired
private MinioProp minioProp;
/**
* 创建桶
*
* @param bucketName 桶名称
*/
@SneakyThrows
public void createBucket(String bucketName) {
boolean found =
client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
client.makeBucket(
MakeBucketArgs.builder()
.bucket(bucketName)
.region("cn-beijing")
.build());
}
}
/**
* 删除桶
*
* @param bucketName 桶名称
*/
@SneakyThrows
public void removeBucket(String bucketName) {
client.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
/**
* 获取文件信息
*
* @param bucketName 桶名称
* @param objectName 文件名称
* @return
*/
@SneakyThrows
public ObjectStat getObjectInfo(String bucketName, String objectName) {
return client.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
/**
* 上传文件
*
* @param bucketName 桶名称
* @param objectName 文件名
* @param stream 流
* @param fileSize 文件大小
* @param type 文件类型
* @throws Exception
*/
public void putObject(String bucketName, String objectName, InputStream stream, Long fileSize, String type) throws Exception {
client.putObject(
PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
stream, fileSize, -1)
.contentType(type)
.build());
}
/**
* 判断文件夹是否存在
*
* @param bucketName 桶名称
* @param prefix 文件夹名字
* @return
*/
@SneakyThrows
public Boolean folderExists(String bucketName, String prefix) {
Iterable<Result<Item>> results = client.listObjects(ListObjectsArgs.builder().bucket(bucketName)
.prefix(prefix).recursive(false).build());
for (Result<Item> result:results){
Item item = result.get();
if (item.isDir()){
return true;
}
}
return false;
}
/**
* 创建文件夹
* @param bucketName 桶名称
* @param path 路径
*/
@SneakyThrows
public void createFolder(String bucketName,String path) {
client.putObject(PutObjectArgs.builder().bucket(bucketName).object(path)
.stream(new ByteArrayInputStream(new byte[]{}),0,-1).build());
}
/**
* 获取文件在minio在服务器上的外链
* @param bucketName 桶名称
* @param objectName 文件名
* @return
*/
@SneakyThrows
public String getObjectUrl(String bucketName,String objectName){
return client.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.build());
}
}
到此我们就可以愉快的使用MinIo了,速度几十迈,心情是*自在。
结语
如果您发现文章有什么问题,劳烦您为孩子指点一二,谢谢了您内。