MiniO简介:
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
〇、背景:
MiniO对象存储服务看起来跟阿里的OSS很像,前段时间在阿里的ECS上部署了一下,用起来感觉还不错,但是这在阿里ECS上部署会收费!经过仔细研究会产生一个叫做按量付费的服务,虽然钱不多,但是每天都有邮件提醒甚是不爽!每天凌晨都会发送扣费信息。无奈,还是在自建服务器上进行搭建吧。
准备工作:
1、宝塔面板 7.6.0 (已安装Nginx 1.20.1、Docker 3.6)
2、二级域名
3、SSL证书(oss.pem、oss.key)
一、Docker中拉取minio镜像
docker pull minio/minio
二、启动docker MiniO服务
docker run -d -v \
/www/wwwroot/minio/data/usb/minio:/www/wwwroot/minio/data/usb/minio \
-p 9000:9000 \
-e "MINIO_ROOT_USER=账号" \
-e "MINIO_ROOT_PASSWORD=密码" \
minio/minio server /www/wwwroot/minio/data/usb/minio
此时访问ip:9001就能访问了
进入之后可以添加存储桶,上传文件
三、Nginx配置SSL
在宝塔的软件商店,找到已安装软件,找到Nginx(如下图),点击设置
选择配置修改
把以下配置加进去
注意:SSL证书key和pem需要自定义路径,我放到了/www/server/nginx/conf/cert/目录下
server{
listen 9001 ssl;
server_name 你的域名;
ssl_certificate /www/server/nginx/conf/cert/oss.pem;
ssl_certificate_key /www/server/nginx/conf/cert/oss.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重启Nginx,此时再次访问你的域名,就是以Https安全协议访问了
四、MiniO在Springboot中的使用
1、POM引入minio
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
2、application.properties的配置
#minio配置
minio.endpoint=http://你的域名
minio.port=80
minio.accessKey=账号
minio.secretKey=密码
minio.secure=false
minio.bucketName=存储桶名称
minio.configDir=/www/wwwroot/minio/data/usb/minio/
VARIFY_PATH=/www/wwwroot/minio/data/usb/minio/minio/varifycode/
VARIFY_URL=http://域名/minio/varifycode/
3、MinioConfig配置类
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Title:
* @Description:
* @author:real
* @Date: 2021/6/25 9:03
* @Version: 1.0
*/
@Configuration
public class MinioConfig{
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.port}")
private int port;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.secure}")
private Boolean secure;
@Value("${minio.bucketName}")
private String bucketName;
@Bean
public MinioClient getMinioClient() {
MinioClient minioClient = MinioClient.builder().endpoint(endpoint, port, secure)
.credentials(accessKey, secretKey)
.build();
return minioClient;
}
}
4、MinioService
import org.springframework.web.multipart.MultipartFile;
/**
* @Title:
* @Description:
* @author: real
* @Date: 2021/6/25 13:38
* @Version: 1.0
*/
public interface MinioService {
boolean isExitBucket(String bn);
void putObject(MultipartFile multipartFile,String date);
}
5、MinioServiceImpl
import io.minio.BucketExistsArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import top.count.service.MinioService;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
/**
* @Title:
* @Description:
* @author: real
* @Date: 2021/6/25 13:39
* @Version: 1.0
*/
@Service
public class MinioServiceImpl implements MinioService {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
@Override
public boolean isExitBucket(String bn) {
try {
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bn).build());
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public void putObject(MultipartFile multipartFile,String date) {
try {
String fileName = UUID.randomUUID().toString().replace("-","") + "." + getSuffix(multipartFile.getOriginalFilename());
String finalPath = date + "/" + fileName;
minioClient.putObject(PutObjectArgs.builder()
.stream(multipartFile.getInputStream(), multipartFile.getSize(),PutObjectArgs.MIN_MULTIPART_SIZE)
.object(finalPath)
.contentType(multipartFile.getContentType())
.bucket(bucketName)
.build());
System.out.println("文件已上传!");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取文件后缀
* @param fileName
* @return
*/
protected static String getSuffix(String fileName) {
int index = fileName.lastIndexOf(".");
if (index != -1) {
String suffix = fileName.substring(index + 1);
if (!suffix.isEmpty()) {
return suffix;
}
}
throw new IllegalArgumentException("非法文件名称:" + fileName);
}
}
五、以上就是MiniO的总结,备忘