在之前的图床开发中撸主曾使用了分布式文件服务 FASTDFS
和阿里云的 OSS
对象存储来存储妹子图。奈何OSS太贵, FASTDFS
搭建配置又太繁琐,今天给大家推荐一款极易上手的高性能对象存储服务 MinIO
。
MinIO
是高性能的对象存储,兼容 Amazon S3
接口,充分考虑开发人员的需求和体验;支持分布式存储,具备高扩展性、高可用性;部署简单但功能丰富。官方的文档也很详细。它有多种不同的部署模式(单机部署,分布式部署)。
为什么说 MinIO
简单易用,原因就在于它的启动、运行和配置都很简单。可以通过 docker
方式进行安装运行,也可以下载二进制文件,然后使用脚本运行。
推荐使用 docker
一键安装:
docker run -it -p 9000:9000 --name minio / -d --restart=always / -e "MINIO_ACCESS_KEY=admin" / -e "MINIO_SECRET_KEY=admin123456" / -v /mnt/minio/data:/data / -v /mnt/minio/config:/root/.minio / minio/minio server /data
注意:
整合 Nginx
:
server{ listen 80; server_name minio.cloudbed.vip; location /{ proxy_set_header Host $http_host; proxy_pass http://localhost:9000; } location ~ //.ht { deny all; } }
这样,通过浏览器访问配置的地址,使用指定的 MINIO_ACCESS_KEY
及 MINIO_SECRET_KEY
登录即可。
简单看了一下,功能还算可以,支持创建 Bucket
,文件上传、删除、分享、下载,同时可以对 Bucket
设置读写权限。
Minio
支持接入 JavaScript
、 Java
、 Python
、 Golang
等多种语言,这里我们选择最熟悉的 Java
语言,使用最流行的框架 SpringBoot 2.x
。
pom.xml
引入:
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency>
application.properties
引入:
# MinIo文件服务器 min.io.endpoint = http://minio.cloudbed.vip min.io.accessKey = admin min.io.secretKey = admin123456
MinIoProperties.java
配置实体:
/** * 实体类 * 爪哇笔记:https://blog.52itstyle.vip */ @Data @ConfigurationProperties(prefix = "min.io") public class MinIoProperties { private String endpoint; private String accessKey; private String secretKey; }
撸一个工具类:
/** * 工具类 * 爪哇笔记:https://blog.52itstyle.vip */ @Component @Configuration @EnableConfigurationProperties({MinIoProperties.class}) public class MinIoUtils { private MinIoProperties minIo; public MinIoUtils(MinIoProperties minIo) { this.minIo = minIo; } private MinioClient instance; @PostConstruct public void init() { try { instance = new MinioClient(minIo.getEndpoint(),minIo.getAccessKey(),minIo.getSecretKey()); } catch (InvalidPortException e) { e.printStackTrace(); } catch (InvalidEndpointException e) { e.printStackTrace(); } } /** * 判断 bucket是否存在 * @param bucketName * @return */ public boolean bucketExists(String bucketName){ try { return instance.bucketExists(bucketName); } catch (Exception e) { e.printStackTrace(); } return false; } /** * 创建 bucket * @param bucketName */ public void makeBucket(String bucketName){ try { boolean isExist = instance.bucketExists(bucketName); if(!isExist) { instance.makeBucket(bucketName); } } catch (Exception e) { e.printStackTrace(); } } /** * 文件上传 * @param bucketName * @param objectName * @param filename */ public void putObject(String bucketName, String objectName, String filename){ try { instance.putObject(bucketName,objectName,filename,null); } catch (Exception e) { e.printStackTrace(); } } /** * 文件上传 * @param bucketName * @param objectName * @param stream */ public void putObject(String bucketName, String objectName, InputStream stream){ try { instance.putObject(bucketName,objectName,stream,null); } catch (Exception e) { e.printStackTrace(); } } /** * 删除文件 * @param bucketName * @param objectName */ public void removeObject(String bucketName, String objectName){ try { instance.removeObject(bucketName,objectName); } catch (Exception e) { e.printStackTrace(); } } //省略各种CRUD }
目前 SDK
不支持文件夹的创建,如果想创建文件夹,只能通过文件的方式上传并创建。
minIoUtils.putObject("itstyle","妹子图/爪哇妹.jpg","C://爪哇妹.jpg");
一个实例只能有一个账号,如果想使用多个账号,需要创建多个实例。此外 minio
还支持单主机,多块磁盘以及分布式部署,不过对于大部分单体应用来说,单体已经够用了。
撸主在夜深人静的时候花了半个多小时就搞定了,是不是很简单,一键傻瓜式安装,丰富的 SDK
可供选择,小白用户是不是美滋滋。
重要的是她不仅可以作为文件服务,还可以当做私人网盘使用,一举两得岂不美滋滋。