Spring Cloud 微服务系列文章,点击上方合集↑
1. 简介
MinIO是高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。
在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品
官网地址:www.minio.org.cn/
2. 下载
官网下载(8.4.3版本):www.minio.org.cn/download.sh…
网盘下载(推荐):「minio-8.4.3」来自UC网盘分享
drive.uc.cn/s/6f2c8055c…
3. 运行
创建四个文件夹data0
、data1
、data2
、data3
,用存放文件。
启动minio
服务
# mac/linux
./minio server ./data0 ./data1 ./data2 ./data3
# windows
minio.exe server ./data0 ./data1 ./data2 ./data3
访问地址:http://127.0.0.1:9000/,默认账号和密码都是:minioadmin
。
4. 创建桶
在Minio和其他一些对象存储服务中,"桶"(Bucket)是一个顶层的容器,用于组织和管理存储的对象(Object)。可以将桶类比为文件系统中的文件夹,用于将一组相关的对象进行组织和分类。
每个桶在Minio中具有唯一的名称,并且可以根据需要创建多个桶。用户可以使用桶名称来访问和操作其中的对象。桶名称是全局唯一的,因此需要确保不同应用程序使用不同的桶名称,以避免冲突。
我们创建一个test
的桶(bucket
)。
5. SpringBoot 集成 MinIO
5.1 pom.xml
添加如下minio
依赖
io.minio
minio
8.4.3
5.2 MinioConfiguration
配置minio的地址、账号和密码,配置上传文件的大小1024M。
@Configuration
public class MinioConfiguration {
private static final String END_POINT = "http://localhost:9000";
private static final String USERNAME = "minioadmin";
private static final String PASSWORD = "minioadmin";
@Bean
public MinioClient minioClient() {
return new MinioClient.Builder()
.endpoint(END_POINT)
.credentials(USERNAME, PASSWORD)
.build();
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize(DataSize.ofMegabytes(1024));
factory.setMaxRequestSize(DataSize.ofMegabytes(1024));
return factory.createMultipartConfig();
}
}
5.3 MinioController
upload
上传文件接口:传入参数bucket
,文件保存到minio后会返回fileName
。
getUrl
获取文件访问链接接口:传入参数path
和bucket
,返回可以访问的链接(7天有效)。这里的path
就是上传文件的返回值fileName
。
@RequestMapping("minio")
@RestController
public class MinioController {
@Resource
private MinioClient minioClient;
@PostMapping(value = "upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String upload(@RequestPart("file") MultipartFile file,
@RequestParam("bucket") String bucket) {
try {
int idx = Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf(".");
String suffix = file.getOriginalFilename().substring(idx + 1);
String fileName = UuidUtils.generateUuid() + "." + suffix;
// 保存文件
minioClient.putObject(PutObjectArgs.builder()
.stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE)
.object(fileName)
.contentType(file.getContentType())
.bucket(bucket)
.build());
return fileName;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
@GetMapping("getUrl")
public String getUrl(@RequestParam(name = "path") String path,
@RequestParam("bucket") String bucket) {
try {
// 获取文件访问地址 7天失效
String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket(bucket)
.object(path).
method(Method.GET)
.expiry(7, TimeUnit.DAYS).build());
return url;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
5.4 okhttp3版本不兼容
如果出现okhttp3版本不兼容的问题,需要在pom.xml
的properties
节点下加上版本号,如下:
4.8.1
6. Postman测试
6.1 上传接口
接口地址:http://localhost:20000/minio/upload?bucket=test
Content-Type
:multipart/form-data
http://localhost:20000/minio/upload?bucket=test
form-data
,key为file
6.2 下载接口
接口地址:http://localhost:20000/minio/getUrl?bucket=test&path=xxx
xxx
是上一步的返回值。
- 该接口会返回一个可以访问的下载链接。
7. 有意思的事
7.1 删除自动恢复
可以测试删除其中一半的存放位置,它过一会儿就自动恢复了,比如删除data0和data1,几分钟它就自动重新创建了文件,并且里面的内容也恢复了。
7.2 文件夹
上传的单个文件变成了文件夹
7.3 分块存储
点击到里面单个文件被拆分成了许多个小块
8. 总结
通过Spring Boot集成Minio,我们可以在应用程序中方便地使用Minio的功能,Spring Boot集成Minio可以帮助我们更轻松地开发和管理云存储解决方案。
Spring Cloud 微服务系列 完整的代码在仓库的sourcecode/spring-cloud-demo
目录下。
gitee(推荐):gitee.com/cunzaizhe/x…
github:github.com/tigerleeli/…
关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!