## MinIO是什么? ![](https://lsky.hhdxw.top/imghub/2024/01/image-202401101704861743.png) 官方解释:MinIO 是一个基于Apache License v2.0开源协议的[对象存储](https://cloud.tencent.com/product/cos?from_column=20065&from=20065)服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。 ## MinIO有哪些优势 ### 1. 开发文档全面 MinIO作为一款基于Golang 编程语言开发的一款高性能的分布式式存储方案的开源项目,有十分完善的官方文档。。 官网文档地址:https://docs.min.io/cn/ ### 2.高性能 MinIO号称是目前速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度最高可以高达183 GB/s和171 GB/s。对象存储可以作为主存储层,用来处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品。 MinIO用作云原生应用程序的主要存储,和传统对象存储相比,云原生应用程序需要更高的吞吐量和更低的延迟。而这些都是MinIO能够达成的性能指标。 ### 3.容器化集成方便 MinIO提供了与k8s、etcd、docker等主流容器化技术深度集成方案。 ## 安装MinIo服务 想要安装Minio有两种方案,第一种是直接在服务器上安装,还有一种是使用Docker快速部署。 官方文档:https://www.minio.org.cn/docs/cn/minio ### 直接安装 安装包下载页面:https://dl.min.io/server/minio/release/,我们需要选择好对应架构和系统的安装包,比如Ubuntu/Debian系统下,我们可以像这样安装: ```sh wget https://dl.min.io/server/minio/release/linux-amd64/minio_20230831153116.0.0_amd64.deb -O minio.deb sudo dpkg -i minio.deb ``` 在CentOS/Redhat(RHEL)系统下,可以像这样安装: ```sh wget https://dl.min.io/server/minio/release/linux-amd64/minio-20230831153116.0.0.x86_64.rpm -O minio.rpm sudo dnf install minio.rpm ``` 安装完成后,我们需要创建一个用于存放minio文件数据的目录: ```sh sudo mkdir /mnt/minio ``` 然后创建一个minio使用的用户,并为此用户分配对应目录的访问权限: ```sh groupadd -r minio-user useradd -M -r -g minio-user minio-user chown minio-user:minio-user /mnt/minio ``` 接着我们需要创建Minio的配置文件: ```sh sudo vim /etc/default/minio ``` 编写以下内容到配置文件中: ```properties #系统管理员账号和密码 MINIO_ROOT_USER=minio MINIO_ROOT_PASSWORD=password #设置用于存储数据的目录 MINIO_VOLUMES="/mnt/minio" #项目接口访问地址 MINIO_SERVER_URL="http://0.0.0.0:9000" #配置其他选项,比如后台管理系统的地址 MINIO_OPTS="--console-address 0.0.0.0:9090" ``` 配置完成之后就可以启动Minio服务了: ```sh sudo systemctl enable minio.service sudo systemctl start minio.service ``` ### 使用Docker安装 对于各位小伙伴本地开发测试,这里更推荐使用Docker镜像安装,非常简单快捷,本地安装好Docker客户端之后,只需要执行以下命令就能快速部署: ```sh docker run -p 9000:9000 -p 9090:9090 --name minio \ -d --restart=always \ -e "MINIO_ACCESS_KEY=minio" \ -e "MINIO_SECRET_KEY=password" \ -v database:/data \ minio/minio server \ /data --console-address ":9090" -address ":9000" ``` 非常方便快捷。 ------ ## 使用Java操作对象存储 前面我们搭建好了对象存储服务,接着就可以开始愉快地使用了。 ### 基本使用 Minio已经为我们提供了封装好的依赖,我们只需要直接使用即可: ```xml io.minio minio 8.3.9 ``` 接着我们需要创建一个Minio客户端用于访问对象存储服务器: ```java MinioClient client = MinioClient.builder() .endpoint("http://localhost:9000") //对象存储服务地址,注意是9000那个端口 .credentials("minio", "password") //账户直接使用管理员 .build(); ``` 对于Java的相关操作,可以说非常全面,包含对桶的操作、对象操作等等,文档地址:https://www.minio.org.cn/docs/cn/minio/linux/developers/java/API.html,这里我们先演示一下文件上传: ```java //首先找到我们需要上传的文件 File file = new File("/Users/nagocoler/Downloads/test.jpg"); //构造一个输入流用于文件传输 FileInputStream stream = new FileInputStream(file); //填写上传的相关参数,使用PutObjectArgs的Builder来完成 PutObjectArgs put = PutObjectArgs.builder() .bucket("test") //设置需要上传的桶名称 .object("666.jpg") //设置上传后保存的文件名称 .stream(stream, file.length(), -1) //配置流以及大小还有分片大小 .build(); client.putObject(put); //使用putObject方法完成上传操作 ``` 这样就可以将文件上传到对象存储服务器中了。 接着是下载文件: ```java //填写下载相关的参数,使用GetObjectArgs来完成 GetObjectArgs get = GetObjectArgs.builder() .bucket("test") //设置需要下载的桶名称 .object("666.jpg") //设置下载后保存的文件名称 .build(); GetObjectResponse response = client.getObject(get); //使用输出流保存下载的文件到本地 FileOutputStream stream = new FileOutputStream("/Users/nagocoler/Downloads/download.png"); stream.write(response.readAllBytes()); stream.close(); ``` 最后是删除桶里的文件: ```java RemoveObjectArgs remove = RemoveObjectArgs.builder() .bucket("test") //设置需要删除文件的桶名称 .object("666.jpg") //设置删除的文件名称 .build(); client.removeObject(remove); //删就完事 ``` ### 服务器文件上传和下载 实例代码: ```java @RestController @RequestMapping("/") public class FileController { @Resource MinioClient client; @PostMapping("upload") public String upload(@RequestParam("file") MultipartFile file) throws Exception { InputStream stream = file.getInputStream(); String name = UUID.randomUUID().toString(); PutObjectArgs args = PutObjectArgs.builder() .bucket("test") .object("upload/"+name) .stream(stream, file.getSize(), -1) .build(); client.putObject(args); return name; } @GetMapping("file/{name}") public void file(@PathVariable("name") String name, HttpServletResponse response) throws Exception{ GetObjectResponse object = client.getObject(GetObjectArgs.builder().bucket("test").object("upload/"+name).build()); ServletOutputStream stream = response.getOutputStream(); stream.write(object.readAllBytes()); } } ```