SpringBoot 2.x 开发事例之整合MinIo文件服务

前语

在之前的图床开发中撸主曾运用了分布式文件服务FASTDFS阿里云OSS目标存储来存储妹子图。怎么办OSS太贵,FASTDFS建立装备又太繁琐,今日给咱们引荐一款极易上手的高性能目标存储服务MinIO

简介

MinIO高性能的目标存储,兼容 Amazon S3 接口,充分考虑开发人员的需求和体会;支撑分布式存储,具有高扩展性、高可用性;布置简略但功用丰厚。官方的文档也很具体。它有多种不同的布置形式(单机布置,分布式布置)。

为什么说 MinIO 简略易用,原因就在于它的发动、运转和装备都很简略。能够经过 docker 方法进行装置运转,也能够下载二进制文件,然后运用脚本运转。

装置

引荐运用 docker 一键装置:

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

留意:

  • 密钥有必要大于8位,否则会创立失利
  • 文件目录和装备文件一定要映射到主机,你懂得

整合Nginx

server{
listen 80;
server_name minio.cloudbed.vip;
location /{
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
location ~ /.ht {
deny  all;
}
}

这样,经过浏览器拜访装备的地址,运用指定的 MINIO_ACCESS_KEYMINIO_SECRET_KEY 登录即可。

简略看了一下,功用还算能够,支撑创立Bucket,文件上传、删去、共享、下载,一起能够对Bucket设置读写权限。

SpringBoot 2.x 开发事例之整合MinIo文件服务

SpringBoot 2.x 开发事例之整合MinIo文件服务

SpringBoot 2.x 开发事例之整合MinIo文件服务

整合

Minio支撑接入JavaScriptJavaPythonGolang等多种言语,这儿咱们挑选最了解的Java言语,运用最盛行的结构 SpringBoot 2.x

pom.xml引进:

<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>

application.properties引进:

# MinIo文件服务器
min.io.endpoint = http://minio.cloudbed.vip
min.io.accessKey = admin
min.io.secretKey = admin123456

MinIoProperties.java 装备实体:

/**
* 实体类
* 爪哇笔记:https://blog.52itstyle.vip
*/
@Data
@ConfigurationProperties(prefix = "min.io")
public class MinIoProperties {
private String endpoint;
private String accessKey;
private String secretKey;
}

撸一个东西类:

/**
* 东西类
* 爪哇笔记:https://blog.52itstyle.vip
*/
@Component
@Configuration
@EnableConfigurationProperties({MinIoProperties.class})
public class MinIoUtils {
private MinIoProperties minIo;
public MinIoUtils(MinIoProperties minIo) {
this.minIo = minIo;
}
private MinioClient instance;
@PostConstruct
public void init() {
try {
instance = new MinioClient(minIo.getEndpoint(),minIo.getAccessKey(),minIo.getSecretKey());
} catch (InvalidPortException e) {
e.printStackTrace();
} catch (InvalidEndpointException e) {
e.printStackTrace();
}
}
/**
* 判别 bucket是否存在
* @param bucketName
* @return
*/
public boolean bucketExists(String bucketName){
try {
return instance.bucketExists(bucketName);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 创立 bucket
* @param bucketName
*/
public void makeBucket(String bucketName){
try {
boolean isExist = instance.bucketExists(bucketName);
if(!isExist) {
instance.makeBucket(bucketName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件上传
* @param bucketName
* @param objectName
* @param filename
*/
public void putObject(String bucketName, String objectName, String filename){
try {
instance.putObject(bucketName,objectName,filename,null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件上传
* @param bucketName
* @param objectName
* @param stream
*/
public void putObject(String bucketName, String objectName, InputStream stream){
try {
instance.putObject(bucketName,objectName,stream,null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删去文件
* @param bucketName
* @param objectName
*/
public void removeObject(String bucketName, String objectName){
try {
instance.removeObject(bucketName,objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
//省掉各种CRUD
}

现在SDK不支撑文件夹的创立,假如想创立文件夹,只能经过文件的方法上传并创立。

minIoUtils.putObject("itstyle","妹子图/爪哇妹.jpg","C:\爪哇妹.jpg");

一个实例只能有一个账号,假如想运用多个账号,需求创立多个实例。此外 minio还支撑单主机,多块磁盘以及分布式布置,不过关于大部分单体运用来说,单体现已够用了。

小结

撸主在夜深人静的时分花了半个多小时就搞定了,是不是很简略,一键傻瓜式装置,丰厚的SDK可供挑选,小白用户是不是乐滋滋。

重要的是她不只能够作为文件服务,还能够作为私家网盘运用,一箭双雕岂不乐滋滋。

源码

https://gitee.com/52itstyle/spring-boot-tools