【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合SpringBoot客户端访问的实战指南

news/2025/1/15 7:20:04/

Minio的文件服务的存储模型及整合SpringBoot客户端访问的实战指南

  • Maven依赖的配置
  • 定义OSS数据模型
    • 定义模型类
    • 定义数据传输模型
  • 核心功能接口定义
      • 内部创建对应的BucketName的Bucket对象
      • 上传且存储文件
      • 删除OSS文件
      • 下载OSS文件
  • 实现对应OSS功能
    • 实现create方法
    • 实现upload方法
    • 实现remove方法
    • 实现download方法
  • 封装为SpringBoot的starter
    • 建立Configuration主要扫描我们的组件
    • 定义我们的注解类
    • 使用启动我们的MINIO客户端

Maven依赖的配置

首先增加对应的配置依赖,添加MINIO的客户端依赖,目前比较稳定的。客户端组件是com.jvm123的客户端starter, 我们会基于他进行二次封装,形成可插拔化且集成化更高的的OSS客户端。

具体配置可见如下依赖:

<dependency><groupId>com.jvm123</groupId><artifactId>minio-spring-boot-starter</artifactId><version>1.2.1</version>
</dependency>

在这里,我们选择的版本是1.2.1的这个版本,具体也有更高的版本,但是我们本次的一个演示主要以此版本为主。

定义OSS数据模型

接下来呢,我们需要定一下我OSS的传输、操作等相关的数据模型。

我们定义其名称为:OssProcessDTO类。

@Data
@SuppressWarnings("serial")
public class OssProcessDTO implements Serializable {private String filePath;private String bucketName;private String fileName;
}

从上面我们可以看到我们主要的属性,只有三个部分:

  • filePath: 数据文件的目录其他都有了访问地址, 主要用于传输本地的文件的目录信息以及存储在OS X部分的目录信息,作为他的主要作用。

  • bucketName: 主要作为协议的Bucket名称,大家可以理解为命名空间进行隔离的边界。

  • fileName: 主要作为存储文件的名称,方便后续进行名称的一个替换,以及原始名称的存储。

定义模型类

定一下模型类,如下所示:

@Data
@SuppressWarnings("serial")
public class OssProcessDTO implements Serializable {private String filePath;private String bucketName;private String fileName;
}

定义数据传输模型

定义一个RPC请求数据模型

@NoArgsConstructor
@Data
@Accessors(chain = true)
public class RpcRequest<T> implements Serializable {private String id;private T enity;public RpcRequest(T enity) {this.enity = enity;}public RpcRequest(String id, T enity) {this.id = id;this.enity = enity;}public RpcRequest(String id) {this.id = id;}
}

核心功能接口定义

接下来呢我们要定义对应的依赖关系和定义我们的逻辑接口,命名为:RpcOssOperateRpcApi。

public interface RpcOssOperateRpcApi {/*** bucket* @param rpcRequest:内部存储对应的BucketName* @return*/RpcResponse create(RpcRequest<String> rpcRequest);/*** 存储文件* @param rpcRequest filePath和bucketName* @return*/RpcResponse upload(RpcRequest<OssProcessDTO> rpcRequest);/*** 删除文件* @param rpcRequest bucketName 和 fileName* @return*/RpcResponse remove(RpcRequest<OssProcessDTO> rpcRequest);/*** 下载文件* @param rpcRequest bucketName 和 fileName* @return*/RpcResponse download(RpcRequest<OssProcessDTO> rpcRequest);}

实际上还有很多,我们暂时定一个基础的接口就可以了。

内部创建对应的BucketName的Bucket对象

rpcRequest:内部存储对应的BucketName

RpcResponse create(RpcRequest<String> rpcRequest);

上传且存储文件

    /*** 存储文件* @param rpcRequest filePath和bucketName* @return*/RpcResponse upload(RpcRequest<OssProcessDTO> rpcRequest);

删除OSS文件

  /*** 删除文件* @param rpcRequest bucketName 和 fileName* @return*/RpcResponse remove(RpcRequest<OssProcessDTO> rpcRequest);

下载OSS文件

/*** 下载文件* @param rpcRequest bucketName 和 fileName* @return*/RpcResponse download(RpcRequest<OssProcessDTO> rpcRequest);

实现对应OSS功能

接下来我们要去实现上面定义的RpcOssOperateRpcApi接口。

我们建立一个新的实现类:MinioRpcOssService,并且进行实现对应的接口RpcOssOperateRpcApi。

对此我们需要依赖注入一个MINIO核心SDK的业务操作类:MinioFileService

@Autowired
MinioFileService fileStoreService;

实现create方法

主要调用了他创建bucket的实现类方法。如下面代码所示。

/*** 创建的操作处理控制* @param rpcRequest:内部存储对应的BucketName* @return*/@Overridepublic RpcResponse create(RpcRequest<String> rpcRequest) {return fileStoreService.createBucket(rpcRequest.getEnity())? RpcResponse.success(): RpcResponse.failure("创建oss bucket失败!");}

实现upload方法

主要调用它保存文件的save方法,在这里我们主要是将上传过来的文件进行转换为数据流。并且指定对应的bucket的名字以及原始的文件名。

    /*** 上传服务文件处理* @param rpcRequest filePath和bucketName* @return*/@Overridepublic RpcResponse upload(RpcRequest<OssProcessDTO> rpcRequest) {try(        InputStream inputStream =IoUtil.toStream(new File(rpcRequest.getEnity().getFilePath()));) {fileStoreService.save(rpcRequest.getEnity().getBucketName(), inputStream, rpcRequest.getEnity().getFileName());}catch (Exception e) {log.error("upload the file is error",e);return RpcResponse.failure("upload the file is error");}return RpcResponse.success();}

实现remove方法

主要是用于删除OSS服务器上的对应的文件。主要用于删除对应的bucket的下面对应的文件。那么我们要指定他的原始文件名称。

 /*** 删除文件地下* @param rpcRequest bucketName 和 fileName* @return*/@Overridepublic RpcResponse remove(RpcRequest<OssProcessDTO> rpcRequest) {return fileStoreService.delete(rpcRequest.getEnity().getBucketName(),rpcRequest.getEnity().getFileName())?RpcResponse.success(): RpcResponse.failure("删除oss bucket文件失败!");}

实现download方法

下载文件处理控制,主要用于传输我们的bucket的名称以及文件的把我们的文件的名称,就可以完成下载对应的文件数据。

 /*** 下载文件处理控制* @param rpcRequest* @return*/@Overridepublic RpcResponse download(RpcRequest<OssProcessDTO> rpcRequest) {try(OutputStream outputStream = new FileOutputStream(rpcRequest.getEnity().getFilePath());) {fileStoreService.writeTo(rpcRequest.getEnity().getBucketName(), rpcRequest.getEnity().getFileName(), outputStream);} catch (IOException e) {log.error("download file is failure!",e);return RpcResponse.failure("下载oss bucket文件失败!");}return RpcResponse.success(rpcRequest.getEnity().getFilePath());}`

封装为SpringBoot的starter

建立Configuration主要扫描我们的组件

我们建立一个configuration类。主要用于扫描我们的所对应的MINIO的客户端组件,主要就可以去扫描我们刚才定义的这个实现类。当然你也可以使用@Bean的方式进行注入:

@ComponentScan("com.hyts.assemble.minio")
@Configuration
public class MinoConfiguration {
}

定义我们的注解类

主要用于定义和引入Spring的配置信息类作为注解的方式进行启动,例如,我们下面的EnableMinioClient。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD})
@SpringBootConfiguration
@Import(MinoConfiguration.class)
public @interface EnableMinioClient {
}

使用启动我们的MINIO客户端

@Slf4j
@SpringBootApplication
@EnableMinioClient
public class OssClientApplication {public static void main(String[] args) {try {ApplicationContext applicationContext = SpringApplication.run(OssClientApplication.class,args);log.info("请访问MINIO控制台:{}",applicationContext.getBean(MinioProperties.class).getEndpoint());ServerProperties serverProperties = applicationContext.getBean(ServerProperties.class);log.info("请访问swagger访问页面:{}", "http://"+NetUtil.localIpv4s().stream().findFirst().get()+":"+serverProperties.getPort()+"/doc.html");} catch (Exception e) {log.error("启动我失败!",e);}}

至此,所有的代码实现全部完成!


http://www.ppmy.cn/news/52138.html

相关文章

说说微信小程序中路由跳转的方式有哪些?区别?

① wx.navigateTo() 保留当前页面&#xff0c;跳转到应用内的某个页面。使用 wx.navigateBack 可以返回到原页面。 ② wx.redirectTo() 关闭当前页面&#xff0c;跳转到应用内的某个页面。 ③ wx.switchTab() 跳转到 tabBar 页面&#xff0c;同时关闭其他非 tabBar 页面。 ④ w…

被修饰成单栋的倾斜摄影处理思路

作者&#xff1a;kele 前言 倾斜摄影数据是三维项目系统中的常客。在某些项目中&#xff0c;为了给倾斜摄影上的建筑赋予属性信息&#xff0c;实现点击建筑高亮并展示属性的功能&#xff0c;客户将倾斜摄影数据进行了模型单体化&#xff08;使用pdmodeler或者其它软件&#xf…

Windows下版本控制器(SVN) - 1、开发中的实际问题+2、版本控制简介

文章目录 基础知识-Windows下版本控制器(SVN)1、开发中的实际问题2、版本控制简介2.1 版本控制[Revision control]2.2 Subversion2.3 Subversion 的优良特性2.4 SVN 的工作原理&#xff1a;2.5 SVN 基本操作 本人其他相关文章链接 基础知识-Windows下版本控制器(SVN) 1、开发中…

给一个实际的需求,要求输出测试用例

测试用例设计的核心&#xff0c;主要从以下几个方面入手&#xff08;测试类型&#xff09;&#xff1a; 功能测试、UI测试、兼容性测试、性能测试、安全测试、易用性测试等 以下提供了2个功能的测试用例&#xff0c;可供参考&#xff1a; 案例一&#xff1a;以一个带广告图案…

设备健康管理软件如何帮助企业优化设备维保计划?

基于AI和工业互联网技术的新型设备管理系统&#xff0c;可以通过实时监测设备运行状态、预测潜在故障、提供预防性维护建议等方式&#xff0c;实现设备管理的数字化和智能化。该类设备管理系统的核心功能一般包括设备状态监测、故障预测、预防性维护、故障知识库管理等&#xf…

I/O复用函数,poll和epoll的用法与select、poll、epoll的区别

1.poll的接口介绍 poll系统调用和select类似&#xff0c;也是在指定时间内轮询一定数量的文件描述符&#xff0c;已测试其中是否有就绪者。poll的原型如下&#xff1a; # include <poll.h> int poll(struct pollfd*fds,nfds_t nfds,int timeout); poll系统调用成功返回就…

【计算机基础】绝对路径和相对路径

目录 一.绝对路径 二.相对路径 例如 三.举例 一.绝对路径 绝对路径是指从根目录开始的完整路径&#xff0c;包括所有父目录的路径&#xff0c;直到目标文件或者目录 所在的位置。 全文件名全路径文件名绝对路经完整的路径 例如&#xff0c;在windows系统中&#xff0c;绝…

CentOS----本地YUM源配置

1.cd /etc/yum.repos.d 2. cp -p CentOS-Media.repo M.repo mkdir yuan mv CentOS-* yuan 3. vi M.repo (修改配置文件内容如下,/mnt/cdrom 为yum源目录) 4.创建挂载目录 和 上面配置文件中file:///mnt/cdrom 一致 mkdir -p /mnt/cdrom 5.将本地yum 挂载到刚创建的文件…