云原生存储:使用MinIO与Spring整合

在现代云原生应用开发中,高效、可靠的存储解决方案是至关重要的。MinIO是一个高性能、分布式的对象存储系统,它与Amazon S3兼容,非常适合在Kubernetes等云原生环境中使用。本文将详细介绍如何在Spring Boot应用中整合MinIO,并提供一些实用的代码示例。

1. MinIO简介

MinIO是一个开源的对象存储服务器,它提供了与Amazon S3兼容的API。MinIO的设计目标是提供高性能和可扩展性,使其成为云原生应用的理想选择。MinIO可以部署在物理服务器、虚拟机、容器以及Kubernetes集群中。

2. 安装与配置MinIO

首先,我们需要安装并运行MinIO服务器。MinIO可以通过多种方式安装,这里我们使用Docker进行安装:

docker run -p 9000:9000 -p 9001:9001 \-e "MINIO_ROOT_USER=admin" \-e "MINIO_ROOT_PASSWORD=password" \minio/minio server /data --console-address ":9001"

上述命令将在本地运行MinIO服务器,并将其API端口映射到9000,控制台端口映射到9001。你可以通过http://localhost:9001访问MinIO的Web控制台。

3. 创建Spring Boot项目

接下来,我们创建一个Spring Boot项目。你可以使用Spring Initializr来生成项目结构:

  1. 访问Spring Initializr。
  2. 选择项目元数据,如Group、Artifact、Name等。
  3. 添加依赖:Spring Web、Spring Boot DevTools。
  4. 生成并下载项目。

4. 添加MinIO依赖

pom.xml文件中添加MinIO的Java客户端依赖:

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.0</version>
</dependency>

5. 配置MinIO客户端

在Spring Boot应用中配置MinIO客户端。创建一个配置类MinioConfig.java

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}

application.properties文件中添加MinIO的配置:

minio.endpoint=http://localhost:9000
minio.accessKey=admin
minio.secretKey=password

6. 创建MinIO服务

创建一个服务类MinioService.java,用于处理文件上传和下载:

import io.minio.*;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;@Service
public class MinioService {@Autowiredprivate MinioClient minioClient;public void uploadFile(String bucketName, String objectName, MultipartFile file) throws IOException, NoSuchAlgorithmException, InvalidKeyException, MinioException {InputStream inputStream = file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(inputStream, file.getSize(), -1).contentType(file.getContentType()).build());}public InputStream getFile(String bucketName, String objectName) throws IOException, NoSuchAlgorithmException, InvalidKeyException, MinioException {return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());}
}

7. 创建控制器

创建一个控制器类MinioController.java,用于处理文件上传和下载的HTTP请求:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;@RestController
@RequestMapping("/minio")
public class MinioController {@Autowiredprivate MinioService minioService;@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("bucketName") String bucketName,@RequestParam("objectName") String objectName) {try {minioService.uploadFile(bucketName, objectName, file);return ResponseEntity.ok("File uploaded successfully");} catch (Exception e) {return ResponseEntity.status(500).body("Failed to upload file: " + e.getMessage());}}@GetMapping("/download")public ResponseEntity<InputStreamResource> downloadFile(@RequestParam("bucketName") String bucketName,@RequestParam("objectName") String objectName) {try {InputStream inputStream = minioService.getFile(bucketName, objectName);HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + objectName);return ResponseEntity.ok().headers(headers).contentType(MediaType.APPLICATION_OCTET_STREAM).body(new InputStreamResource(inputStream));} catch (Exception e) {return ResponseEntity.status(500).body(null);}}
}

8. 测试

启动Spring Boot应用,并使用Postman或其他工具测试文件上传和下载接口。

上传文件

  • URL: http://localhost:8080/minio/upload
  • Method: POST
  • Params:
    • file: 选择要上传的文件
    • bucketName: 目标存储桶名称
    • objectName: 目标对象名称

下载文件

  • URL: http://localhost:8080/minio/download
  • Method: GET
  • Params:
    • bucketName: 存储桶名称
    • objectName: 对象名称

9. 总结

通过本文的介绍和代码示例,你应该能够在Spring Boot应用中成功整合MinIO,并实现文件的上传和下载功能。MinIO的高性能和与S3兼容的API使其成为云原生应用存储解决方案的优秀选择。希望这些内容对你有所帮助,祝你在云原生应用开发中取得成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口调用的三种方式

例子&#xff1a; curl --location http://110.0.0.1:1024 \ --header Content-Type: application/json \ --data {"task_id": 1 }方式一&#xff1a;postman可视化图形调用 方式二&#xff1a;Vscode中powershell发送请求 #powershell (psh) Invoke-WebRequest -U…

熟悉Realsense和机械臂的控制库(如MoveIt!)的使用,以及基本的PID控制和其他控制算法

项目1&#xff1a;基础Realsense数据采集与处理 目标&#xff1a;了解Realsense摄像头的基本使用&#xff0c;数据采集和处理。 步骤&#xff1a; 安装并配置Realsense SDK。使用Realsense摄像头采集深度图像和RGB图像。实现基本的图像处理操作&#xff0c;如边缘检测、物体识…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

超图Environment.initialization报空指针

如果库没倒错&#xff0c;许可证也在&#xff0c;一般是权限问题&#xff0c;要确保以下三个读写权限都在&#xff0c;制定版本要动态申请&#xff0c;官方Demo的代码里动态申请权限少一个。 /*** 需要申请的权限数组*/protected String[] needPermissions {Manifest.permiss…

Linux - VIM 全面教程

Linux - VIM 全面教程 前言 VIM 是一个强大的文本编辑器&#xff0c;被广泛用于 Linux 系统上。对于许多程序员和系统管理员来说&#xff0c;熟练掌握 VIM 是一项非常重要的技能。本教程将全面介绍 VIM 的基础知识和高级功能&#xff0c;帮助你更好地利用这一工具。 目录 安…

elasticsearch集群模式部署

系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) es版本&#xff1a; elasticsearch-7.6.2 本次搭建es集群为三个节点 添加启动用户 添加之前用户要是创建好了的(这里的es用户并不是绝对要求&#xff0c;你可以根据具体的需要命名创建) visudo 修改配置文件 sys…

【吊打面试官系列-MyBatis面试题】使用 MyBatis 的 mapper 接口调用时有哪些要求?

大家好&#xff0c;我是锋哥。今天分享关于 【使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f; 1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的…

数据结构(初阶1)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

Sharding-JDBC分库分表之SpringBoot分片策略

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 前言 前一篇以一个示例分享了Sharding-JDBC的基本使用。在进行分库分表时&#xff0c;可以设置分库分表的分片策略&#xff0c;在示例中&#xff0c;使用的是最简单的…

面对数据不一致性的解决方案:

polarDB是读写分离和计算存储分离的分布式数据库&#xff0c;并且副本的log replicate是基于Parallel-Raft协议来实现的。所以在瞬时进行写和读的操作时&#xff0c;是不可避免会存在数据一致性问题&#xff0c;导致这个数据一致性问题的原因不是事务&#xff0c;而是多副本日志…

springboot篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

数据结构--二叉树收尾

1.二叉树销毁 运用递归方法 分类&#xff1a; 根节点左子树右子树&#xff08;一般都是这个思路&#xff0c;不断进行递归即可&#xff09; 选择方法&#xff08;分析)&#xff1a; 前序&#xff1a;如果直接销毁根就无法找到左子树右子树 中序&#xff1a;也会导致丢失其…

【算法】(C语言):快速排序(递归)、归并排序(递归)、希尔排序

快速排序&#xff08;递归&#xff09; 左指针指向第一个数据&#xff0c;右指针指向最后一个数据。取第一个数据作为中间值。右指针指向的数据 循环与中间值比对&#xff0c;若大于中间值&#xff0c;右指针往左移动一位&#xff0c;若小于中间值&#xff0c;右指针停住。右…

红酒的奇幻之旅:从葡萄园到酒杯的魔法

在世界的某个角落&#xff0c;隐藏着一场关于红酒的奇幻之旅。这是一场从葡萄园到酒杯的魔法变幻&#xff0c;将大自然的馈赠与人类的智慧很好结合&#xff0c;最终呈现在我们眼前的&#xff0c;是一杯散发着迷人香气的雷盛红酒。 一、葡萄园的魔法启幕 当清晨的第一缕阳光洒落…

windows server 2019 更新补丁

1 点击 搜索按键--windows 更新设置 2 点击 安装补丁 3 安装完成&#xff0c;重新启动服务器

四、Python日志系统之日志文件的备份和删除

import os import datetime import logging from watchdog.events import FileSystemEventHandler from watchdog.observers import Observer """实现代码中处理日志文件的备份和删除""" class UserLog:def __init__(self):self.logger logging…

简述 Kamailio 的多租户

如题&#xff0c;大家猜下我会怎么写 过几天公布答案 首先&#xff0c;是认证表 如果单租户, insert into subscriber(username, password) values (1000, 1234)&#xff0c;这样就行 多租户则不然, insert into subscriber(username, domain, password) values (1000, abc.…

WebGIS面试题

文章目录 1. 前端1.1. 选择器的优先级1.2. CSS 中它的布局有哪些&#xff1f;1.3. CSS3 的新特性1.4. CSS 的两种盒子模型1.5. CSS 的伪元素选择器和伪类选择器有哪些&#xff1f;1.6. ES6 的新特性1.7. 谈谈你对 promise 的理解1.8. 简单说一下原型链1.9. 简单说一下深浅拷贝1…

CPLD编程注意事项

1、CPLD体积小&#xff0c;如果仅仅是完成简单的触发等时序&#xff0c;完全可以采用CPLD这类器件。 2、CPLD资源相当少&#xff0c;一般逻辑资源如上图&#xff0c;才160&#xff0c;稍微不注意&#xff0c;就会超标&#xff0c;所以&#xff0c;寄存器输入一定要尽量减少&…

算法小练之 位运算基础

前言 今天正式走入&#xff0c;位运算这个章节&#xff0c;关于这一部分我会先介绍几个重要的知识点&#xff0c;然后再根据几个力扣上的题来讲解。 了解6种位操作 总所周知&#xff0c;变量在计算机中都是二进制存储的&#xff0c;比如一个变量int a 1&#xff1b; 它的存…