MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品--------引自官网的话。这么一看这个MINIO好nb啊,居然能这么快。 就凭这速度就值得我们学习一下。
编程语言: 你爱我,我爱你的java
框架: springboot
还有今天的主角: MinIO
其实官网的文档写的挺好的,就是有些老旧了,怕是远古版本。为什么这么说呢,因为我照着文档启动,愣是跑不起来,吐了啊。后来还是在社区问了问,然后好心的官方大人告诉了我,还是得吐槽一下,文档更新一下吧,胡思乱想(指找问题时,各种猜疑)很累人的。情况如下
http://slack.minio.org.cn/question/737
我们可以直接下载MinIO到本地运行,也可以使用容器下载并运行
我使用的是docker
#docker 拉取 MinIo 镜像 docker pull minio/minio
如果你看了我上面发送的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"
访问页面查看是否运行成功,输入我们在命令中打的用户名(MINIO_ROOT_USER)和密码(MINIO_ROOT_PASSWORD),其实用户名和密码duck不必写这么长,我当时应该是脑子坏掉了。
登录后,就可以看到如下界面,如果你也看到了这个界面,恭喜你完成了第一步,剩下还有999步。这样还是用一些操作的,你可以尝试一下。
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.0</version> </dependency>
minio: endpoint: http://127.0.0.1:9000 accesskey: SUCWGJ8W4H36HC7KR6XO secretkwy: d9OkZ14ab04zwCd/+6iEXbPqeVapDOaDvhYcw88r
配置文件值注入,这里我们获取了在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了,速度几十迈,心情是自由自在。
如果您发现文章有什么问题,劳烦您为孩子指点一二,谢谢了您内。