当前位置: 首页 > 科技观察

开发好东西推荐对象存储服务Minio

时间:2023-03-22 13:31:06 科技观察

7前言在开发过程中,一般会分离出一个单独的文件服务器来存储对象,存储大容量的非结构化数据,如图片、视频、日志文件、备份数据、容器等/虚拟机映像等。我们大多数人仍在使用FastDFS。想吐槽一下部署麻烦,没有管理界面,推荐另外一款对象存储服务Minio,绝对让你眼前一亮。推荐理由开源免费(这是我们考虑的首要因素),高性能,好看:界面美观。为云环境而生:与k8s、etcd、docker等深度集成。详细文档:提供了Java、JavaScript、Python、Golang、.Net等多种语言的sdk,集成变得更简单Deployment简单的docker部署将MiniIO数据和配置文件夹挂在宿主机上dockerrun-p9090:9000--nameminio\-eMINIO_ACCESS_KEY=admin-eMINIO_SECRET_KEY=123123123\-v/mydata/minio/data:/data\-v/mydata/minio/config:/root/.minio\-dminio/minioserver/data;#如果没有创建用户名和密码,默认用户名密码:minioadmin:minioadmin访问springboot使用minio1引入mavenio.miniominio7??.0.22配置application.propertiesminio.url=http://192.168.3.189:9090minio.accessKey=adminminio.secretKey=123123123minio.secure=falseminio.bucketName=testminio.configDir=/home/data/3注入属性@Component@ConfigurationProperties(prefix="minio")publicclassMinioConfig{//"endPoint是一个URL、域名、IPv4或IPv6地址"privateStringurl;//("accessKey类似于用户ID,用于唯一标识你的账户")privateStringaccessKey;//("secretKey是你账户的密码")privateStringsecretKey;//("如果是true,则使用的是https而不是http,默认值是true")privateBooleansecure;//("默认存储桶")privateStringbucketName;//("配置目录")privateStringconfigDir;@BeanpublicMinioClientgetMinioClient()throwsInvalidEndpointException,InvalidPortExceptionminioClient=MinioClientnewMinioClient(url,accessKey,secretKey,secure);returnminioClient;}publicStringgetBucketName(){returnbucketName;}publicStringgetConfigDir(){returnconfigDir;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}publicStringgetAccessKey(){returnacessKey;}publicvoidsetAccessKey(StringaccessKey){this.accessKey=accessKey;}publicStringgetSecretKey(){returnsecretKey;}publicvoidsetSecretKey(StringsecretKey){this.secretKey=secretKey;}publicBooleangetSecure(){returnsecure;}publicvoidsetSecure(Booleansecure){this.secure=secure;}publicvoidsetBucketName(StringbucketName){this.bucketName=bucketName;}publicvoidsetConfigDir(StringconfigDir){this.configDir=configDir;}}4创造工具类@ComponentpublicclassMinioUtil{@AutowiredprivateMinioClientminioClient;/***上传文件*/publicvoiduploadFile(InputStreaminputStream,StringobjectName){StringbuckName="test";try{if(!minioClient.bucketExists(buckName)){minioClient.makeBucket(buckName);}minioClient.putObject(buckName,objectName,inputStream,inputStream.available(),"image/jpeg");}catch(Exceptione){e.printStackTrace();}}publicvoiddownloadFile(StringbucketName,StringfileName,StringoriginalName,HttpServletResponseresponse){try{InputStreamfile=minioClient.getObject(bucketName,fileName);Stringfilename=newString(fileName.getBytes("ISO8859-1"),StandardCharsets.UTF_8);response.setHeader("Content-Disposition","attachment;filename="+filename);ServletOutputStreamservletOutputStream=response.getOutputStream();intlen;byte[]buffer=newbyte[1024];while((len=file.read(buffer))>0){servletOutputStream.write(buffer,0,len);}servletOutputStream.flush();file.close();servletOutputStream.close();}catch(ErrorResponseExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}}}5测试@RestControllerpublicclassGreetingsController{@AutowiredMinioUtilminioUtil;@RequestMapping(value="/{name}",method=RequestMethod.GET)@ResponseStatus(HttpStatus.OK)publicStringgreetingText(@PathVariableStringname,HttpServletResponseresponse)throwsFileNotFoundException{minioUtil.uploadFile(newFileInputStream(newFile("C:\\Users\\ctyc\\Desktop\\1.jpg")),"test1.jpg");minioUtil.downloadFile("test","test1.jpg","t1.jpg",response);return"Hello"+name+"!";}}