MinIO介紹
什么是MinIO
Minio 是個基于 Golang 編寫的開源對象存儲套件,基于Apache License v2.0開源協(xié)議,雖然輕量,卻擁有著不錯的性能。它兼容亞馬遜S3云存儲服務(wù)接口。可以很簡單的和其他應(yīng)用結(jié)合使用,例如 NodeJS、Redis、MySQL等。
應(yīng)用場景
可以作為私有云的對象存儲服務(wù)來使用,也可以作為云對象存儲的網(wǎng)關(guān)層,無縫對接 Amazon S3
或者 MicroSoft Azure
。
特點
高性能:作為一款高性能存儲,在標準硬件條件下,其讀寫速率分別可以達到 55Gb/s 和 35Gb/s。并而 MinIO 支持一個對象文件可以是任意大小,從幾kb到最大5T不等。
可擴展:不同MinIO集群可以組成聯(lián)邦,并形成一個全局的命名空間,并跨越多個數(shù)據(jù)中心
云原生:容器化、基于K8S的編排、多租戶支持
Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI訪問Minio服務(wù)器。
可對接后端存儲: 除了Minio自己的文件系統(tǒng),還支持DAS、 JBODs、NAS、Google云存儲和Azure Blob存儲。
-
SDK支持: 基于Minio輕量的特點,它得到類似Java、Python或Go等語言的sdk支持
JavaSDK: https://github.com/minio/minio-java
PythonSDK: https://github.com/minio/minio-py
Lambda計算: Minio服務(wù)器通過其兼容AWS SNS / SQS的事件通知服務(wù)觸發(fā)Lambda功能。支持的目標是消息隊列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等數(shù)據(jù)庫。
有操作頁面
功能簡單: 這一設(shè)計原則讓MinIO不容易出錯、更快啟動
支持糾刪碼:MinIO使用糾刪碼、Checksum來防止硬件錯誤和靜默數(shù)據(jù)污染。在最高冗余度配置下,即使丟失1/2的磁盤也能恢復數(shù)據(jù)
安裝
docker 安裝
下載鏡像
docker pull minio/minio
啟動容器
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-v /mnt/data:/data \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
minio/minio \
server /data --console-address ":9001"
參數(shù)解釋
# 命令詳解
# -e MINIO_ROOT_USER 指定用戶名
# -e MINIO_ROOT_PASSWORD 指定密碼
# -v 掛載目錄,持久化minio目錄
配置
使用 docker命令中的賬號密碼登錄http://127.0.0.1:9001/login,本例中用戶名:minioadmin, 密碼:minioadmin。
創(chuàng)建bucket
輸入bucket name
配置權(quán)限
創(chuàng)建access key
記錄下access key, secret key 留作后面使用
JAVA 使用
基于spring boot對接minio的文件上傳功能
引入MinIO
pom引入依賴
這里有個坑,記住版本選擇8.2.1 高版本的會有問題,運行時報錯。
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
增加minio配置
application.yml
spring:
servlet:
multipart:
max-file-size: 10MB # 文件上傳大小限制
minio:
url: http://127.0.0.1:9000 # 內(nèi)網(wǎng)上傳的鏈接
bucket: mytest # bucket name
readUrl: http://127.0.0.1:9000 # 外網(wǎng)訪問的鏈接
accessKey: xxxxxxxxxxxx # 上一步的access key
secretKey: xxxxxxxxxxxxxxxxxxx # 上一步的secret key
創(chuàng)建MinioClient Bean
@Configuration
public class MinioConfig {
@Value("${minio.url}")
private String url;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient getMinioClient() {
return MinioClient.builder().endpoint(url)
.credentials(accessKey, secretKey).build();
}
}
上傳接口實現(xiàn)
實現(xiàn)上傳服務(wù)方法
先定義一個文件服務(wù)接口,以后如果有更好的實現(xiàn)方式,增加實現(xiàn)即可
public interface FileService {
String upload(MultipartFile file) throws Exception;
}
minio的實現(xiàn)
@Service
public class MinioFileServiceImpl implements FileService {
@Value("${minio.bucket}")
private String bucket;
@Value("${minio.readUrl}")
private String readUrl;
@Resource
private MinioClient minioClient;
@Override
public String upload(MultipartFile file) throws Exception{
String filename = getFileName(file.getOriginalFilename());
ObjectWriteResponse res = minioClient.putObject(PutObjectArgs.builder()
.bucket(bucket)
.object(filename)
.contentType(file.getContentType())
.stream(file.getInputStream(), file.getSize(), ObjectWriteArgs.MIN_MULTIPART_SIZE).build());
// 返回可訪問的圖片鏈接
return readUrl + "/" + bucket + "/" + filename;
}
private String getFileName(String filename){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// 設(shè)置存儲對象名稱
String dir = sdf.format(new Date());
int idx = filename.lastIndexOf(".");
if (idx >= 0) {
String ext = filename.substring(idx+1);
String name = System.currentTimeMillis() + filename.substring(0, idx);
filename = XString.md5(name) + "." + ext;
}
return dir + "/" +filename;
}
}
controller
@Controller
@RequestMapping("/minio")
public class MinioController {
private static final Logger LOGGER = LoggerFactory.getLogger(MinioController.class);
@Resource(type = MinioFileServiceImpl.class)
private FileService fileService;
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public CommonResult upload(@RequestPart("file") MultipartFile file) {
try {
return CommonResult.success(fileService.upload(file));
} catch (Exception e) {
LOGGER.error("upload file exception {}", e.getMessage(), e);
return CommonResult.failed(ResultCode.FAILED);
}
}
}
測試
啟動服務(wù),使用postman測試
postman配置
請求頭設(shè)置
Content-Type:multipart/form-data
查看minio上傳的文件
至此,完成文件上傳功能。
最后附上源碼:https://github.com/chain-zhang/study
歡迎大家指正。