系统学习:若依框架(整合了MinIO)介绍 | RuoYi
MinIO
MinIO是一个高性能的对象存储系统,专为大规模数据存储、管理和访问而设计。以下是关于MinIO的详细解析:
1. 基本概念
- 定义:MinIO是一个基于Amazon S3兼容协议的开源对象存储服务器,使用Go语言编写,支持跨平台的分布式存储架构。
- 用途:用于存储和管理非结构化数据,如图片、视频、日志文件等,尤其适合大规模数据分析和云原生应用程序的存储需求。
2. 主要特性
- 高性能:
- MinIO采用分布式的架构设计,将数据分散存储在多个节点上,实现并行处理和高速传输。
- 通过优化的I/O路径和并发设计,确保数据读写操作的高速执行,即使在高负载情况下也能维持稳定的吞吐量。
- 在普通服务器上也能达到接近硬件极限的存储性能,为PB级数据的存储与处理提供强大支撑。
- 可扩展性:
- 分布式架构允许用户根据需求部署多个节点,形成分布式存储集群,横向扩展存储容量和处理能力。
- 通过添加新的节点,用户可以线性地扩展MinIO集群的存储容量和吞吐量。
- 数据保护:
- 提供多种数据保护机制,包括数据冗余、故障转移和数据校验等。
- 使用分布式的冗余机制将数据复制到多个节点上,防止数据丢失。
- 支持跨节点的数据复制或纠删码技术,确保数据在不同地理位置的多个副本,实现高可用性和数据持久性。
- S3兼容性:
- 使用S3兼容的API,与现有的S3生态系统无缝集成。
- 允许用户直接使用现有的S3工具和应用程序与MinIO进行集成。
- 易用性:
- 提供超简单的安装步骤、直观的管理界面以及平滑的扩展能力,降低企业构建复杂数据架构的门槛。
- 支持多种扩展方式,如分布式存储、数据备份等,满足不同用户的需求。
3. 应用场景
- 云原生应用程序的存储:作为云原生应用程序的对象存储后端,与Kubernetes集成,提供持久性存储和数据共享。
- 大规模数据分析:用于存储和分析大规模的数据集,与大数据处理框架(如Apache Spark和Apache Hadoop)集成。
- 备份和灾难恢复:作为备份和灾难恢复解决方案,支持数据冗余和高可用性,确保数据的安全性和可靠性。
- 多媒体存储和分发:用于存储和分发多媒体内容,如图片、视频和音频文件,与内容分发网络(CDN)集成。
- IoT数据存储和分析:用于存储和分析大规模的物联网(IoT)数据,处理来自传感器和设备的实时数据。
4. 架构设计
- 分布式架构:将数据分散存储在多个节点上,提供更高的可扩展性和可靠性。
- S3兼容的API:使用S3接口提供简单、灵活的数据访问方式,支持HTTP协议直接上传、下载和管理对象。
5. 部署与集成
- 部署:可以部署在云端、边缘计算环境或本地服务器上,展现高适配性和灵活性。
- 集成:支持多种平台(如Windows、Linux、OS X和FreeBSD),可以与现有的系统和应用程序无缝集成。
MinIO安装
- 下载MinIO
- Windows系统:从MinIO的官方网站(https://min.io/download)下载对应版本的MinIO。
- Linux系统:可以使用wget命令从MinIO的服务器下载,例如
wget https://dl.min.io/server/minio/release/linux-amd64/minio
。
- 修改文件执行权限(Linux)
- 使用
chmod +x minio
命令为下载的MinIO文件添加执行权限。
- 使用
- 启动MinIO
- Windows系统:打开cmd面板,进入MinIO所在目录,执行启动命令,例如
minio.exe server D:\miniodata
。 - Linux系统:在终端中执行启动命令,如
./minio server /data/miniodata
。可以指定访问密钥和秘密密钥,如MINIO_ACCESS_KEY=myminioadmin MINIO_SECRET_KEY=myminioadmin ./minio server /data/miniodata
。
- Windows系统:打开cmd面板,进入MinIO所在目录,执行启动命令,例如
- 访问MinIO Web界面
- 根据启动命令中指定的端口(默认为9000),在浏览器中输入地址
http://localhost:9000
来访问MinIO的Web界面。 - 登录密码,若未设置都为minioadmin
- 根据启动命令中指定的端口(默认为9000),在浏览器中输入地址
Window系统下设置用户名和密码:
- setx MINIO_ROOT_USER name #name改为想设置的用户名
- setx MINIO_ROOT_PASSWORD password #password改为想设置登录密码
MinIO与SpringBoot整合
- 添加Maven依赖
- 在SpringBoot项目的pom.xml文件中添加MinIO客户端的Maven依赖,以及可能需要的其他依赖,如fastjson等。
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
<!-- 其他依赖如okhttp和fastjson(如果版本需要) -->
- 配置MinIO连接信息
- 在SpringBoot项目的application.properties或application.yml文件中配置MinIO的连接信息,包括服务器地址、端口、访问密钥和秘密密钥等。
# application.yml 示例
minio:
endpoint: 127.0.0.1:9000
accessKey: minioadmin
secretKey: minioadmin
- 编写代码整合MinIO
- 在SpringBoot项目中编写Java代码来与MinIO进行交互,如创建桶、上传文件、下载文件等。这通常涉及到使用MinIO客户端提供的API。
//上传
public SysOssVo upload(MultipartFile file) {
String originalfileName = file.getOriginalFilename();
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
OssClient storage = OssFactory.instance();
UploadResult uploadResult;
try {
uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());
} catch (IOException e) {
throw new ServiceException(e.getMessage());
}
// 保存文件信息
SysOss oss = new SysOss();
oss.setUrl(uploadResult.getUrl());
oss.setFileSuffix(suffix);
oss.setFileName(uploadResult.getFilename());
oss.setOriginalName(originalfileName);
oss.setService(storage.getConfigKey());
baseMapper.insert(oss);
SysOssVo sysOssVo = new SysOssVo();
BeanCopyUtils.copy(oss, sysOssVo);
return this.matchingUrl(sysOssVo);
}
//下载
public void download(Long ossId, HttpServletResponse response) throws IOException {
SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId);
if (ObjectUtil.isNull(sysOss)) {
throw new ServiceException("文件数据不存在!");
}
FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
OssClient storage = OssFactory.instance();
try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {
int available = inputStream.available();
IoUtil.copy(inputStream, response.getOutputStream(), available);
response.setContentLength(available);
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
}
//删除
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// 做一些业务上的校验,判断是否需要校验
}
List<SysOss> list = baseMapper.selectBatchIds(ids);
for (SysOss sysOss : list) {
OssClient storage = OssFactory.instance(sysOss.getService());
storage.delete(sysOss.getUrl());
}
return baseMapper.deleteBatchIds(ids) > 0;
}
常见API
存储桶(Bucket)操作
- bucketExists:
- 功能:判断指定的存储桶(Bucket)是否存在。
- 参数:BucketExistsArgs构建器模式,需要指定bucket名称。
- 返回值:布尔值,表示存储桶是否存在。
- makeBucket:
- 功能:创建一个新的存储桶(Bucket)。
- 参数:MakeBucketArgs构建器模式,需要指定bucket名称,也可以设置存储桶的存储类、区域等属性。
- 返回值:无返回值,但创建失败会抛出异常。
对象(Object)操作
- putObject:
- 功能:上传一个对象到指定的存储桶中。
- 参数:包括存储桶名称、对象名称、输入流(如文件流)以及可选的元数据等。
- 返回值:无返回值,但上传成功或失败会抛出相应的异常。
- getObject:
- 功能:从指定的存储桶中下载一个对象。
- 参数:包括存储桶名称、对象名称以及可选的下载参数(如版本号、范围等)。
- 返回值:返回对象的内容作为输入流。
- listObjects:
- 功能:列出指定存储桶中的对象列表。
- 参数:包括存储桶名称、可选的前缀、标记和限制等参数。
- 返回值:返回一个包含对象列表的迭代器或结果集。
- copyObject:
- 功能:在存储桶内部或不同存储桶之间复制对象。
- 参数:包括源存储桶名称、源对象名称、目标存储桶名称和目标对象名称等。
- 返回值:无返回值,但复制成功或失败会抛出相应的异常。
- removeObject:
- 功能:删除指定的对象。
- 参数:包括存储桶名称和对象名称。
- 返回值:无返回值,但删除成功或失败会抛出相应的异常。
其他操作
- getPresignedObjectUrl:
- 功能:生成一个带有签名和有效期的URL,允许用户在限定时间内访问指定的对象。
- 参数:包括存储桶名称、对象名称、有效期等参数。
- 返回值:返回一个带有签名的URL字符串。
- getPresignedPostFormData:
- 功能:生成一个表单数据,用于通过POST请求上传对象到指定的存储桶中。
- 参数:包括存储桶名称、对象名称、表单字段等参数。
- 返回值:返回一个包含表单数据的Map或类似结构。
注意事项
- 所有的API操作都需要通过MinIOClient实例进行调用,而MinIOClient的初始化需要指定MinIO服务器的访问地址、访问密钥和密钥签名等信息。
- 在使用API时,需要注意异常处理,以便在发生错误时能够及时处理和恢复。
- MinIO的API支持多种编程语言和SDK,如Java、Python、JavaScript等,可以根据实际需求选择适合的SDK进行开发。
OSS(Object Storage Service)
OSS(Object Storage Service)常见方法主要围绕其存储、管理和访问对象(Object)的操作。以下是根据参考文章和相关资料整理的OSS常见方法,以清晰的结构进行归纳:
- 创建存储空间(Bucket)
- 步骤:登录OSS控制台,选择区域并创建Bucket。
- 特点:存储空间是OSS中用于存储对象的最基本的容器,所有对象都必须隶属于某个存储空间。
- 注意事项:在创建Bucket时,需要指定其名称、存储类型、访问权限等属性。
- 上传对象
- 方法:
- 使用OSS控制台上传:直接拖拽文件到控制台中上传。
- 使用命令行工具(如ossutil):通过命令行界面上传文件。
- 使用API或SDK:通过编程方式调用OSS提供的API或SDK上传文件。
- 特点:OSS支持多种上传方式,满足不同的使用场景和需求。
- 下载对象
- 方法:
- 使用OSS控制台下载:在控制台中选择对象进行下载。
- 使用命令行工具(如ossutil):通过命令行界面下载文件。
- 使用API或SDK:通过编程方式调用OSS提供的API或SDK下载文件。
- 特点:OSS提供灵活的下载方式,并支持断点续传等功能。
- 设置权限和访问控制
- 方法:
- 访问控制列表(ACL):为Bucket或Object设置访问权限,包括私有、公共读、公共读写等。
- 签名URL:生成带有签名和有效期的URL,允许用户在限定时间内访问指定的Object。
- RAM策略:使用阿里云资源访问管理(RAM)为用户或角色设置精细的权限控制。
- 特点:OSS提供多层次的访问控制机制,确保数据的安全性和隐私性。
- 使用OSS的其他功能
- 功能列表:
- 数据加密:支持服务器端加密,确保数据的机密性。
- 数据迁移:提供数据迁移工具,方便用户将数据从其他存储系统迁移到OSS。
- 图片处理:支持图片格式转换、裁剪、缩放等处理操作。
- 数据生命周期管理:根据业务需求设置数据的存储周期和过期规则。
- 静态网站托管:将Bucket配置为静态网站托管点,用于托管和发布静态网页。
- 特点:OSS提供丰富的功能,满足用户多样化的存储和管理需求。
总结来说,OSS的常见方法主要包括创建存储空间、上传和下载对象、设置权限和访问控制以及使用OSS的其他功能。这些方法共同构成了OSS的基本操作体系,为用户提供了灵活、高效、安全的对象存储服务。