springboot整合minio實現(xiàn)文件存儲功能
一,minio介紹
MinIO 是一個基于Apache License v2.0開源協(xié)議的對象存儲服務(wù)。它兼容亞馬遜S3云存儲服務(wù)接口,非常適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。
MinIO是一個非常輕量的服務(wù),可以很簡單的和其他應(yīng)用的結(jié)合,類似 NodeJS, Redis 或者 MySQL。
官方文檔:MinIO對象存儲 Kubernetes — MinIO中文文檔 | MinIO Kubernetes中文文檔 舊一點
MinIO Object Storage for Kubernetes — MinIO Object Storage for Kubernetes 新
應(yīng)用場景
單主機單硬盤模式
單主機多硬盤模式
多主機多硬盤分布式
特點
· 高性能:作為高性能對象存儲,在標(biāo)準(zhǔn)硬件條件下它能達到55GB/s的讀、35GB/s的寫速率
· 可擴容:不同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支持
· Lambda計算: Minio服務(wù)器通過其兼容AWS SNS / SQS的事件通知服務(wù)觸發(fā)Lambda功能。支持的目標(biāo)是消息隊列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等數(shù)據(jù)庫。
· 有操作頁面
· 功能簡單: 這一設(shè)計原則讓MinIO不容易出錯、更快啟動
· 支持糾刪碼:MinIO使用糾刪碼、Checksum來防止硬件錯誤和靜默數(shù)據(jù)污染。在最高冗余度配置下,即使丟失1/2的磁盤也能恢復(fù)數(shù)據(jù)**!**
存儲機制
Minio使用糾刪碼erasure code和校驗和checksum。 即便丟失一半數(shù)量(N/2)的硬盤,仍然可以恢復(fù)數(shù)據(jù)。
糾刪碼是一種恢復(fù)丟失和損壞數(shù)據(jù)的數(shù)學(xué)算法**。**
二,搭建安裝
docker pull minio/minio 新版本: docker run \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -d --restart=always \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=admin123456" \ -v /home/data:/data \ -v /home/config:/root/.minio \ minio/minio server /data --console-address ":9001"
瀏覽器訪問:http://IP:9000/minio/login,如圖:
三,使用
3.1引入依賴
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.0</version> </dependency>
3.2創(chuàng)建文件上傳的controller FileController
注意:一些參數(shù)不能寫死,需要寫到配置文件里面進行動態(tài)讀取
minio: endpointUrl: http://192.168.17.166:9000 accessKey: admin secreKey: admin123456 bucketName: gmall
@RestController @RequestMapping("/admin/product") public class FileController { //由于參數(shù)不固定,因此需要從配置文件讀取,有兩種方式①@value注解②創(chuàng)建實體類使用@configurationproperties注解指定前綴注入 @Value("${minio.endpointUrl}") private String endpointUrl; //文件服務(wù)器登錄地址 @Value("${minio.accessKey}") private String accessKey; //用戶名 @Value("${minio.secreKey}") private String secreKey; //密碼 @Value("${minio.bucketName}") private String bucketName; //儲存桶名稱 /** * @Description: 上傳圖片到minio文件服務(wù)器 * @Param: MultipartFile * @return: * @Author: Mr.Zhan * @Date: 2022/3/28 17:59 */ @PostMapping("/fileUpload") public Result fileUpload(MultipartFile file) { String result =null; try { // 創(chuàng)建minio的客戶端 MinioClient minioClient = MinioClient.builder() .endpoint(endpointUrl) //指定文件服務(wù)器地址,用戶名,密碼 .credentials(accessKey, secreKey) .build(); // 判斷存儲桶是否存在 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (!found) { // 不存在則創(chuàng)建一個桶 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } else { throw new GmallException("存儲桶已經(jīng)存在", 20001); } //準(zhǔn)備上傳的圖片名稱 String fileName = System.currentTimeMillis() + UUID.randomUUID().toString().replaceAll("-", "") + file.getOriginalFilename(); //使用流上傳文件 /* * ①bucketName 存儲桶名字 * ②fileName 文件名稱 * ③ file.getInputStream() 文件流 * ④file.getSize()文件大小 * file.getContentType() 文件類型 * */ minioClient.putObject( PutObjectArgs.builder().bucket(bucketName).object(fileName).stream( file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); result=endpointUrl + "/" + bucketName + "/" + fileName; } catch (ErrorResponseException e) { e.printStackTrace(); } catch (InsufficientDataException e) { e.printStackTrace(); } catch (InternalException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (InvalidResponseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (ServerException e) { e.printStackTrace(); } catch (XmlParserException e) { e.printStackTrace(); } return Result.ok(result); } }
3.3登陸控制臺設(shè)置桶的狀態(tài)為公開
四,注意
注意:文件上傳時,需要調(diào)整一下linux 服務(wù)器的時間與windows 時間一致! 第一步:安裝ntp服務(wù) yum -y install ntp 第二步:開啟開機啟動服務(wù) systemctl enable ntpd 第三步:啟動服務(wù) systemctl start ntpd 第四步:更改時區(qū) timedatectl set-timezone Asia/Shanghai 第五步:啟用ntp同步 timedatectl set-ntp yes 第六步:同步時間 ntpq -p
以上就是springboot整合minio實現(xiàn)文件存儲功能的詳細內(nèi)容,更多關(guān)于springboot minio文件存儲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java面向?qū)ο笤O(shè)計原則之單一職責(zé)與依賴倒置原則詳解
這篇文章主要介紹了java面向?qū)ο笤O(shè)計原則之單一職責(zé)與依賴倒置原則的分析詳解,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進步早日升職加薪2021-10-10SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法
這篇文章主要給大家介紹了關(guān)于SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法,文中通過代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-04-04Mybatis plus結(jié)合springboot使用
本文主要介紹了MyBatisPlus使用SpringBoot數(shù)據(jù)庫操作,從添加依賴到測試,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11springboot3.X 無法解析parameter參數(shù)問題分析
本文介紹了Spring Boot 3.2.1版本中調(diào)用接口時出現(xiàn)的參數(shù)解析問題,該錯誤是由Spring新版本加強的錯誤校驗和報錯提示導(dǎo)致的,在Spring 6.1之后,官方要求URL中的傳參必須使用`@PathVariable`聲明用于接收的變量,而不能省略`@RequestParam`注解,感興趣的朋友一起看看吧2025-03-03