当前位置: 首页 > news >正文

云原生存储:使用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使其成为云原生应用存储解决方案的优秀选择。希望这些内容对你有所帮助,祝你在云原生应用开发中取得成功!

相关文章:

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

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

等保测评新趋势:应对数字化转型中的安全挑战

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业提升竞争力、优化运营效率的重要手段。然而&#xff0c;这一转型过程中&#xff0c;企业也面临着前所未有的安全挑战。等保测评&#xff08;信息安全等级保护测评&#xff09;作为保障信息系统安全的重要手段&#xff0…...

使用esptool工具备份ESP32的固件(从芯片中备份下来固件)

本文以Windows电脑为例 板子为esp32-c3 1下载python 可在官网中下载,此处不进行讲解 使用如下代码查看是否安装了 Python&#xff08;终端输入&#xff09; python 2下载esptool 在终端输入如下代码即可下载 使用 pip&#xff08;推荐&#xff09;: 在你已经安装的 Pyth…...

JS进阶-解析赋值

学习目标&#xff1a; 掌握解析赋值 学习内容&#xff1a; 解构赋值数组解构对象解构筛选数组filter方法&#xff08;重点&#xff09; 解构赋值&#xff1a; 解构赋值是一种快速为变量赋值的简洁语法&#xff0c;本质上仍然是为变量赋值。 分为&#xff1a; 数组解构对象解…...

Java虚拟机面试题汇总

目录 1. JVM的主要组成部分及其作用&#xff1f; 1.1 运行时数据区划分&#xff1f; 1.2 哪些区域可能会发生OOM&#xff1f; 1.3 堆和栈的区别&#xff1f; 1.4 内存模型中的happen-before是什么&#xff1f; 2. HotSpot虚拟机对象创建流程&#xff1f; 2.1 类加载过程…...

C++休眠的方法

Windows的API函数 Sleep(INFINITE); 休眠时间为永久 Linux的API函数sleep 没有直接表示无限时间的参数&#xff0c;根据POSIX标准&#xff0c;sleep() 函数的参数应该是 unsigned int 类型&#xff0c;因此最大可以接受的参数值是 UINT_MAX&#xff0c;即 4294967295 秒。sleep…...

选择排序(C语言版)

选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列的末尾。 重复第二步&…...

基于CentOS Stream 9平台搭建FRP内网穿透

内网穿透方法很多&#xff0c;本文以github上很火的frp为例 1.frp官方 文档&#xff1a;https://gofrp.org/zh-cn/docs/overview/ 1.1 下载 https://github.com/fatedier/frp/releases 选中合适的版本 2. 服务端&#xff08;服务器&#xff09;搭建frps 需要公网IP服务器 选…...

Redis管理禁用命令

在redis数据量比较大时&#xff0c;执行 keys * &#xff0c;fluashdb 这些命令&#xff0c;会导致redis长时间阻塞&#xff0c;大量请求被阻塞&#xff0c;cpu飙升&#xff0c;严重可能导致redis宕机&#xff0c;数据库雪崩。所以一些命令在生产环境禁止使用。 Redis 禁用命令…...

RFID智能锁控系统在物流安全运输中的应用与效益分析

一、物流锁控系统现状与挑战 1.1 传统锁控系统的局限性 安全性不足&#xff1a;机械锁容易被撬开或钥匙被复制&#xff0c;导致货物在运输过程中面临被盗风险。 无法实时追踪&#xff1a;一旦货物离开发货点&#xff0c;物流公司无法实时监控货物状态&#xff0c;增加了货物…...

WPF设置全局样式

目的 创建一个资源字典&#xff0c;自动引入到各个Window或者UserControl中&#xff0c;可以随意使用。或者引入多个控件包&#xff0c;为了做兼容&#xff0c;保证可以引用多个控件库。 1. 定义资源字典 首先&#xff0c;你需要创建一个XAML文件来定义你的资源字典&#xf…...

【福利】代码公开!咸鱼之王自动答题脚本

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 微信或QQ打开咸鱼之王小程序&#xff0c;进入答题界面&#xff0c;运行main.py。期间不要动鼠标。 可自行更改代码来适配自己的需求~ 可以按照示例图片…...

ChatGPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建技术

在过去几年中&#xff0c;人工智能领域的发展迅猛&#xff0c;尤其是大语言模型的应用&#xff0c;为各行各业带来了前所未有的创新与突破。从ChatGPT-3.5的推出到GPT Store的上线&#xff0c;再到最新的多模态交互ChatGPT-4o&#xff0c;OpenAI不断引领科技潮流&#xff0c;推…...

使用clion刷leetcode

如何优雅的使用clion刷leetcode 安装插件&#xff1a;LeetCode Editor) 插件配置&#xff1a; 这样我们每打开一个项目&#xff0c;就会创建类似的文件 我们的项目结构&#xff1a; 我们在题解文件中导入头文件myHeader.h并将新建的文件添加到cmakelists.txt文件&#xff0c;…...

图解HTTP(5、与 HTTP 协作的 Web 服务器 6、HTTP 首部)

5、与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站&#xff0c;也可作为通信路径上的中转服务器提升传输效率。 用单台虚拟主机实现多个域名 在相同的 IP 地址下&#xff0c;由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站&#xff0c;因此…...

JS之防抖和节流

防抖 (debounce) 所谓防抖&#xff0c;就是指触发事件后在 n 秒内函数只能执行一次&#xff0c;如果在 n 秒内又触发了事件&#xff0c;则会重新计算函数执行时间。 ps: 重置普攻&#xff0c;百度翻译要输完停止一定时间后才翻译。 没有防抖和节流的缺点&#xff1a; 函数触发…...

Open3D 点云PCA算法配准(粗配准)

目录 一、概述 1.1PCA配准的原理 1.2PCA配准的应用 二、代码实现 三、实现效果 3.1原始点云 3.2配准后点云 3.3变换矩阵 一、概述 PCA(Principal Component Analysis,主成分分析)是一种用于降维和特征提取的统计方法。在点云处理中,PCA可以用于点云配准(a…...

Transformer中的编码器和解码器结构有什么不同?

Transformer背后的核心概念&#xff1a;注意力机制&#xff1b;编码器-解码器结构&#xff1b;多头注意力等&#xff1b; 例如&#xff1a;The cat sat on the mat&#xff1b; 1、嵌入&#xff1a; 首先&#xff0c;模型将输入序列中的每个单词嵌入到一个高维向量中表示&…...

【深度学习】第5章——卷积神经网络(CNN)

一、卷积神经网络 1.定义 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理具有网格状拓扑结构数据的深度学习模型&#xff0c;特别适用于图像和视频处理。CNN 通过局部连接和权重共享机制&#xff0c;有效地减少了参数数量&#x…...

fluwx插件实现微信支付

Flutter开发使用fluwx插件实现微信支付&#xff0c;代码量不多&#xff0c;复杂的是安卓和iOS的各种配置。 在 pubspec.yaml 文件中添加fluwx依赖 fluwx: ^4.5.5 使用方法 通过fluwx注册微信Api await Fluwx().registerApi(appId: wxea7a1c53d9e5849d, universalLink: htt…...

k8s核心操作_Deployment的扩缩容能力_Deployment自愈和故障转移能力---分布式云原生部署架构搭建022

然后我们上面说了k8s中的deployment的多副本能力 然后,我们再来看 k8s中的deployment的扩缩容能力 可以看到,对于扩容,要使用 kubectl scale 命令 对于缩容 要使用kubectl scale 命令都是使用这个命令对吧 来试试,可以看到上面命令 首先看看 kubectl get pod 可以看到有…...

P8306 【模板】字典树

题目描述 给定 n 个模式串 s1​,s2​,…,sn​ 和 q 次询问&#xff0c;每次询问给定一个文本串 ti​&#xff0c;请回答 s1​∼sn​ 中有多少个字符串 sj​ 满足 ti​ 是 sj​ 的前缀。 一个字符串 t 是 s 的前缀当且仅当从 s 的末尾删去若干个&#xff08;可以为 0 个&#…...

面试官:讲一下如何终止一个 Promise 继续执行

我们知道 Promise 一旦实例化之后&#xff0c;状态就只能由 Pending 转变为 Rejected 或者 Fulfilled&#xff0c; 本身是不可以取消已经实例化之后的 Promise 了。 但是我们可以通过一些其他的手段来实现终止 Promise 的继续执行来模拟 Promise 取消的效果。 Promise.race …...

linux之常见的coredump原因都有哪些

Core dump通常发生在程序遇到严重错误时&#xff0c;操作系统会生成core文件来记录程序崩溃时的内存、寄存器状态、栈信息等。下面是一些常见的导致core dump的原因&#xff1a; 段错误&#xff08;Segmentation Fault&#xff09;&#xff1a; 当程序尝试访问不允许访问的内存…...

低资源低成本评估大型语言模型(LLMs)

随着新的大型语言模型&#xff08;LLMs&#xff09;的持续发展&#xff0c;从业者发现自己面临着众多选择&#xff0c;需要从数百个可用选项中选择出最适合其特定需求的模型、提示[40]或超参数。例如&#xff0c;Chatbot Arena基准测试平台积极维护着近100个模型&#xff0c;以…...

什么是RPC?有哪些RPC框架?

定义 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节&#xff0c;使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分…...

HTTP有哪些请求方式?

GET&#xff1a;请求指定的资源。例如&#xff0c;用于获取网页内容。POST&#xff1a;向指定资源提交数据&#xff08;例如表单提交&#xff09;。POST请求的数据通常在请求体中。PUT&#xff1a;将请求体中的数据放置到请求URI指定的位置&#xff0c;如果该资源不存在则创建&…...

接口测试课程结构

课程大纲 如图&#xff0c;接下来的阶段课程&#xff0c;依次专项讲解如下专题&#xff0c;能力级别为中级&#xff0c;进阶后基本为中高级&#xff1a; 1.接口基础知识&#xff1b; 2.抓包工具&#xff1b; 3.接口工具&#xff1b; 4.mock服务搭建&#xff08;数据模拟服务&am…...

leetcode--从中序与后序遍历序列构造二叉树

leeocode地址&#xff1a;从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder …...

西瓜杯CTF(1)

#下班之前写了两个题&#xff0c;后面继续发 Codeinject <?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);"); payload 闭合后面的括号来拼接 POST / HTTP/1.1 Host: 1dc86f1a-cccc-4298-955d-e9179f026d54…...