0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用docker搭建minio服务

倩倩 来源:CSDN 作者:CSDN 2022-09-23 11:08 次阅读


什么是minio

引用官网:

MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。

官网地址:

https://min.io/

文档地址:

https://docs.min.io/

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

一. 使用docker 搭建minio 服务。

GNU / Linux和macOS

dockerrun-p9000:9000
--nameminio1
-v/mnt/data:/data
-e"MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e"MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
minio/minioserver/data

windows

dockerrun-p9000:9000
--nameminio1
-vD:data:/data
-e"MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e"MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
minio/minioserver/data
  • MINIO_ROOT_USER:为用户key
  • MINIO_ROOT_PASSWORD:为用户密钥

以上搭建的都是单机版的。想要了解分布式 的方式请查看官网文档。

a62be472-3ae9-11ed-9e49-dac502259ad0.png

这就是在win的docker上运行的。

当启动后在浏览器访问http://localhost:9000就可以访问minio的图形化界面了,如图所示:

a65eb08c-3ae9-11ed-9e49-dac502259ad0.pnga6875ba4-3ae9-11ed-9e49-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

二. 下面开始搭建springboot 环境

初始化一个springboot项目大家都会,这里不多做介绍。

主要是介绍需要引入的依赖:


<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>

<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>8.2.1version>
dependency>

<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>

依赖可以官方文档里找:https://docs.min.io/docs/java-client-quickstart-guide.html

下面介绍配置文件:

spring:
servlet:
multipart:
max-file-size:10MB
max-request-size:10MB
#minio配置
minio:
access-key:AKIAIOSFODNN7EXAMPLE#key就是docker初始化是设置的,密钥相同
secret-key:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
url:http://localhost:9000
bucket-name:wdhcr
thymeleaf:
cache:false

创建minio的配置类:

@Configuration
@ConfigurationProperties(prefix="spring.minio")
@Data
publicclassMinioConfiguration{
privateStringaccessKey;

privateStringsecretKey;

privateStringurl;

privateStringbucketName;

@Bean
publicMinioClientminioClient(){
returnMinioClient.builder()
.endpoint(url)
.credentials(accessKey,secretKey)
.build();
}
}

使用配置属性绑定进行参数绑定,并初始化一个minio client对象放入容器中。

下面就是我封装的minio client 操作minio的简单方法的组件。

@Component
publicclassMinioComp{

@Autowired
privateMinioClientminioClient;

@Autowired
privateMinioConfigurationconfiguration;

/**
*@description:获取上传临时签名
*@dateTime:2021/5/1314:12
*/
publicMapgetPolicy(StringfileName,ZonedDateTimetime){
PostPolicypostPolicy=newPostPolicy(configuration.getBucketName(),time);
postPolicy.addEqualsCondition("key",fileName);
try{
Mapmap=minioClient.getPresignedPostFormData(postPolicy);
HashMapmap1=newHashMap<>();
map.forEach((k,v)->{
map1.put(k.replaceAll("-",""),v);
});
map1.put("host",configuration.getUrl()+"/"+configuration.getBucketName());
returnmap1;
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}
returnnull;
}

/**
*@description:获取上传文件的url
*@dateTime:2021/5/1314:15
*/
publicStringgetPolicyUrl(StringobjectName,Methodmethod,inttime,TimeUnittimeUnit){
try{
returnminioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(method)
.bucket(configuration.getBucketName())
.object(objectName)
.expiry(time,timeUnit).build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}
returnnull;
}


/**
*@description:上传文件
*@dateTime:2021/5/1314:17
*/
publicvoidupload(MultipartFilefile,StringfileName){
//使用putObject上传一个文件到存储桶中。
try{
InputStreaminputStream=file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(configuration.getBucketName())
.object(fileName)
.stream(inputStream,file.getSize(),-1)
.contentType(file.getContentType())
.build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}
}
/**
*@description:根据filename获取文件访问地址
*@dateTime:2021/5/1711:28
*/
publicStringgetUrl(StringobjectName,inttime,TimeUnittimeUnit){
Stringurl=null;
try{
url=minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(configuration.getBucketName())
.object(objectName)
.expiry(time,timeUnit).build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}
returnurl;
}
}

简单说明:

  • 使用MultipartFile接收前端文件流,再上传到minio。
  • 构建一个formData的签名数据,给前端,让前端之前上传到minio。
  • 构建一个可以上传的临时URL给前端,前端通过携带文件请求该URL进行上传。
  • 使用filename请求服务端获取临时访问文件的URL。(最长时间为7 天,想要永久性访问,需要其他设置,这里不做说明。)

下面展示页面html,使用的是VUE+element-ui进行渲染。

html>
<html>
<head>
<metacharset="UTF-8">

<linkrel="stylesheet"href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<title>上传图片title>
head>
<body>
<divid="app">

<el-row:gutter="2">
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>传统上传h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="uploadHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">将文件拖到此处,或<em>点击上传em>div>
<divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kbdiv>
el-upload>
<divv-if="imgUrl">
<img:src="imgUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>前端formData直传h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="httpRequestHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">将文件拖到此处,或<em>点击上传em>div>
<divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kbdiv>
el-upload>
<divv-if="directUrl">
<img:src="directUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>前端Url直传h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="UrlUploadHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">将文件拖到此处,或<em>点击上传em>div>
<divclass="el-upload__tip"slot="tip">只能上传jpg/png文件,且不超过500kbdiv>
el-upload>
<divv-if="uploadUrl">
<img:src="uploadUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
el-row>
div>
body>

<scriptsrc="https://unpkg.com/vue/dist/vue.js">script>

<scriptsrc="https://unpkg.com/element-ui/lib/index.js">script>

<scriptsrc="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
newVue({
el:'#app',
data:function(){
return{
imgUrl:'',
directUrl:'',
uploadUrl:''
}
},
methods:{

uploadHandle(options){
let{file}=options;
this.traditionPost(file);
},
traditionPost(file){
_that=this
constform=newFormData();
form.append("fileName",file.name);
form.append("file",file);
this.axiosPost("post","/upload",form).then(function(res){
if(res.status===200){
_that.imgUrl=res.data.data
}else{
alert("上传失败!")
}
})
},
getpolicy(file){
_that=this
axios.get('policy?fileName='+file.name)
.then(function(response){
let{xamzalgorithm,xamzcredential,policy,xamzsignature,xamzdate,host}=response.data.data;
letformData=newFormData();
formData.append("key",file.name);
formData.append("x-amz-algorithm",xamzalgorithm);//让服务端返回200,不设置则默认返回204。
formData.append("x-amz-credential",xamzcredential);
formData.append("policy",policy);
formData.append("x-amz-signature",xamzsignature);
formData.append("x-amz-date",xamzdate);
formData.append("file",file);
//发送POST请求
_that.axiosPost("post",host,formData).then(function(res){
if(res.status===204){
axios.get('url?fileName='+file.name).then(function(res){
_that.directUrl=res.data.data;
})
}else{
alert("上传失败!")
}
})
})
},
httpRequestHandle(options){
let{file}=options;
this.getpolicy(file);
},

UrlUploadHandle(options){
let{file}=options;
this.getUploadUrl(file);
},
getUploadUrl(file){
_that=this
console.log(file)
axios.get('uploadUrl?fileName='+file.name)
.then(function(response){
leturl=response.data.data;
//发送put请求
letconfig={'Content-Type':file.type}
_that.axiosPost("put",url,file,config).then(function(res){
if(res.status===200){
axios.get('url?fileName='+file.name).then(function(res){
_that.uploadUrl=res.data.data;
})
}else{
alert("上传失败!")
}
})
})
},
//封装
//axios封装post请求
axiosPost(method,url,data,config){
letresult=axios({
method:method,
url:url,
data:data,
headers:config
}).then(resp=>{
returnresp
}).catch(error=>{
return"exception="+error;
});
returnresult;
}

}
})
script>
<style>
.div-center-class{
padding:28%0%;
text-align:center;
background:beige;
}
style>
html>

a6a6bd8c-3ae9-11ed-9e49-dac502259ad0.png页面效果

可以分别体验不同的实现效果。

以上就是使用springboot搭建基于minio的高性能存储服务的全部步骤了。

项目地址是:

https://gitee.com/jack_whh/minio-upload



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 云存储
    +关注

    关注

    7

    文章

    737

    浏览量

    46044
  • 机器学习
    +关注

    关注

    66

    文章

    8408

    浏览量

    132575
  • Docker
    +关注

    关注

    0

    文章

    457

    浏览量

    11849

原文标题:Spring Boot + minio 实现高性能存储服务,So Easy~!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    企业云服务器平台设计与搭建

    企业云服务器平台的设计与搭建是一个复杂但系统的过程,涉及多个环节和因素。主机推荐小编为您整理发布企业云服务器平台设计与搭建这一过程的详细阐述。
    的头像 发表于 12-04 09:51 84次阅读

    docker-compose配置文件内容详解以及常用命令介绍

    需要的所有服务(例如:Web服务器、数据库、缓存等)并轻松管理它们。 Docker Compose 使用的三个步骤: 使用 Dockerfile 定义应用程序的环境
    的头像 发表于 12-02 09:29 264次阅读
    <b class='flag-5'>docker</b>-compose配置文件内容详解以及常用命令介绍

    搭建开源大语言模型服务的方法

    本文我们将总结5种搭建开源大语言模型服务的方法,每种都附带详细的操作步骤,以及各自的优缺点。
    的头像 发表于 10-29 09:17 182次阅读

    服务搭建步骤

    服务器不仅提供了灵活的资源配置和强大的计算能力,还降低了IT基础设施的维护成本。下面,rak小编带您详细了解云服务搭建的步骤。
    的头像 发表于 10-09 10:58 208次阅读

    服务搭建详细过程

    随着云计算技术的发展,越来越多的企业和个人开始选择使用云服务器来部署自己的应用和服务。相比于传统的物理服务器,云服务器提供了更高的灵活性、可扩展性和安全性。下面将详细介绍如何
    的头像 发表于 09-12 10:00 335次阅读

    手动构建Docker镜像的方法

    不推荐使用docker commit命令,而应该使用更灵活、更强大的dockerfile来构建docker镜像。
    的头像 发表于 08-05 15:30 516次阅读
    手动构建<b class='flag-5'>Docker</b>镜像的方法

    ARM平台实现Docker容器技术

    192.168.10.101:5000/led_flash:v1.0 图17 Docker版本从1.3.X之后,与Docker Registry交互默认使用https,然而前面搭建的私有仓库仅提供http
    发表于 07-25 14:36

    ARM平台实现Docker容器技术

    17Docker版本从1.3.X之后,与Docker Registry交互默认使用https,然而前面搭建的私有仓库仅提供http服务,因此当与私有仓库交互时将出现上面的错误提示。可通
    发表于 07-17 11:05

    宝塔面板Docker一键安装:部署GPTAcademic,开发私有GPT学术优化工具

    使用宝塔Docker-compose,5分钟内在海外服务器上搭建gpt_academic。这篇文章讲解如何使用宝塔面板的Docker服务
    的头像 发表于 07-02 11:58 2574次阅读
    宝塔面板<b class='flag-5'>Docker</b>一键安装:部署GPTAcademic,开发私有GPT学术优化工具

    关于Docker 的清理命令集锦

    这篇文章主要介绍了Docker 清理命令集锦,需要的朋友可以参考下 复制代码代码如下: docker kill $(docker ps -a -q)  删除所有已经停止的容器 复制代码代码如下
    的头像 发表于 06-13 15:56 372次阅读

    分享 | PTP、NTP时间同步服务器的部署与搭建过程

    分享 | PTP、NTP时间同步服务器的部署与搭建过程
    的头像 发表于 05-15 10:01 1026次阅读
    分享 | PTP、NTP时间同步<b class='flag-5'>服务</b>器的部署与<b class='flag-5'>搭建</b>过程

    ARM平台实现Docker容器技术

    ,亦可实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。使用Docker,可像管理应用程序一样管理基础结构。通过利用Docker的快速发布、测试和部署代码的方法,可显著减少产品开发时间。   Docker使用客户端——
    的头像 发表于 03-07 13:48 801次阅读
    ARM平台实现<b class='flag-5'>Docker</b>容器技术

     海外云服务搭建pi节点详细步骤

     海外云服务搭建pi节点简单吗?海外云服务搭建pi节点步骤有哪些?小编为您整理发布海外云服务搭建
    的头像 发表于 02-21 10:16 1112次阅读

    怎么搭建sdwan?如何搭建SD-WAN网络服务

    怎么搭建sdwan?如何搭建SD-WAN网络服务? 随着云计算、物联网和移动互联网等技术的快速发展,企业网络面临了更高的带宽需求、更多的数据传输和更强的网络安全要求。而软件定义广域网(SD-WAN
    的头像 发表于 01-17 16:18 4265次阅读

    Nginx在Windows/docker中的使用

    nginx 是一个高性能的开源反向代理服务器和 web 服务器,一般用来搭建静态资源服务器、负载均衡器、反向代理,本文将分享其在 Windows/d
    的头像 发表于 01-03 10:20 1861次阅读
    Nginx在Windows/<b class='flag-5'>docker</b>中的使用