对象存储
对象存储(Object Storage)是一种计算机数据存储架构,将数据作为对象进行管理。
每个对象包括数据本身、元数据和一个唯一的标识符,这种方式使得对象存储在大规模数据管理、索引和搜索方面具有明显优势。
发展历史:
- 起源:1995年,Garth Gibson团队首次提出对象存储的概念。1999年,希捷公司介绍了早期的对象存储命令集。
- 商业化:1999年,Gibson创立了Panasas公司,商业化了对象存储的概念。
- 云存储:2006年,亚马逊推出S3云存储服务,推动了对象存储的广泛应用。微软和谷歌随后也推出了自己的对象存储服务。
- 大规模应用:2009年,Facebook开发了自己的对象存储系统Haystack,用于存储和管理海量照片,数据规模是万亿级
目前主要云存储服务
名称 | 发布时间 |
亚马逊S3 | 2006年 |
微软Azure Blob存储 | 2010年 |
谷歌云存储 | 2010年 |
阿里云OSS | 2011年 |
华为云OBS | 2015年 |
Amazon S3
Amazon Simple Storage Service(Amazon S3)是一种高可扩展性、低延迟且经济高效的对象存储解决方案,它不仅提供了存储和检索数据的服务,还定义了一套标准化的API协议,成为行业事实上的标准。类似地,还有OpenAI。
核心概念
概念 | 描述 |
存储桶(Bucket) | S3 中存储数据的基本容器,每个存储桶名称在 AWS 区域内必须唯一。 |
对象(Object) | 存储在 S3 中的基本数据单位,包括数据、元数据和唯一标识符(Key)。 |
键(Key) | 对象在存储桶中的唯一标识符,可以理解为对象的路径。 |
元数据(Metadata) | 关于对象的数据,包括标准元数据(如文件大小、上次修改时间)和用户定义的元数据。 |
主要功能
功能 | 描述 |
数据持久性和可用性 | 提供 99.999999999% 的数据持久性,数据自动跨多个可用区(Availability Zones)复制。 |
安全性和访问控制 | 支持多种访问控制机制,包括 IAM、存储桶策略、ACL 和预签名 URL。 |
版本控制 | 启用版本控制,保留对象的所有版本,便于数据恢复和保护。 |
生命周期管理 | 定义对象生命周期规则,自动将数据转移到更低成本的存储类或在规定时间后删除数据。 |
数据传输 | 支持标准上传、分段上传、大数据传输加速和直接数据复制等多种数据传输机制。 |
查询功能 | 使用 Amazon S3 Select 和 S3 Glacier Select 直接查询存储在 S3 中的数据,无需下载整个对象。 |
常见使用场景
使用场景 | 描述 |
备份和恢复 | 作为企业数据的备份和恢复解决方案。 |
数据归档 | 通过 S3 Glacier 存储类,进行长期存储和归档数据。 |
内容分发 | 与 CloudFront 集成,实现全球内容分发。 |
大数据分析 | 存储大数据,并与 Amazon EMR、AWS Glue 等服务集成进行分析。 |
X File Storage
X File Storage是一个文件存储解决方案,支持多种存储平台,包括本地存储、FTP、SFTP、WebDAV、云存储(如阿里云 OSS、腾讯云 COS、百度云 BOS、Amazon S3、Google Cloud Storage 等)。用户只需一行代码即可将文件存储到任意支持的平台上,并支持在不同平台之间迁移文件。
项目地址:https://github.com/dromara/x-file-storage
支持的平台
X File Storage支持广泛的存储平台,你也可以根据需要自行扩展。
对于兼容Amazon S3的存储平台,直接将配置写在Amazon S3中即可,具体兼容性见下图。
快速入门
以下是一个简单的示例,展示了如何在Spring Boot环境下使用X File Storage将文件上传到阿里云OSS。
配置依赖
在pom.xml文件中添加以下依赖:
org.dromara.x-file-storage
x-file-storage-spring
2.2.1
com.aliyun.oss
aliyun-sdk-oss
3.16.1
com.huaweicloud
esdk-obs-java
3.22.12
配置文件
在application.yml文件中添加以下配置:
dromara:
x-file-storage:
default-platform:aliyun-oss-1
aliyun-oss:
-platform:aliyun-oss-1
enable-storage:true
access-key:your-access-key
secret-key:your-secret-key
end-point:your-end-point
bucket-name:your-bucket-name
domain:https://your-domain/
base-path: test/
启动类配置
在启动类上加上@EnableFileStorage注解:
@EnableFileStorage
@SpringBootApplication
public class SpringFileStorageTestApplication{
public static void main(String[] args){
SpringApplication.run(SpringFileStorageTestApplication.class, args);
}
}
文件上传示例
在控制器中编写文件上传接口:
@RestController
publicclassFileDetailController{
@Autowired
private FileStorageService fileStorageService;
@PostMapping("/upload")
public FileInfoupload(MultipartFile file){
return fileStorageService.of(file).upload();
}
@PostMapping("/upload-image")
public FileInfouploadImage(MultipartFile file){
return fileStorageService.of(file)
.image(img -> img.size(1000,1000))
.thumbnail(th -> th.size(200,200))
.upload();
}
}
其它功能
X File Storage提供了丰富的功能,包括:
1、文件下载:支持从任意存储平台下载文件。
2、文件删除:可轻松删除存储在不同平台上的文件。
3、文件复制和移动:支持跨平台文件复制和移动。
下面代码示意,从阿里云 OSS迁移文件到华为云 OBS:
@Slf4j
@SpringBootTest
classFileStorageServiceTransferTest{
@Autowired
private FileStorageService fileStorageService;
/**
* 从存储平台读取迁移
*/
@Test
public void transferByPlatform(){
// 源存储平台
String fromPlatform ="aliyun-oss-1";
// 目标存储平台
String toPlatform ="huawei-obs-1";
// 要迁移的路径
String path ="";
// 开始迁移
transfer(fromPlatform, toPlatform, path);
}
/**
* 使用数据库迁移文件
*/
public void transfer(String fromPlatform,String toPlatform,String path){
// 列出当前路径下所有目录及文件
ListFilesResult result = fileStorageService
.listFiles()
.setPlatform(fromPlatform)
.setPath(path)
.listFiles();
// 递归迁移所有子目录
for(RemoteDirInfo dir : result.getDirList()){
transfer(fromPlatform, toPlatform, path + dir.getName()+"/");
}
// 迁移当前路径下所有文件
for(RemoteFileInfo remoteFileInfo : result.getFileList()){
FileInfo fileInfo = remoteFileInfo.toFileInfo();
Map fromMetadata =new KebabCaseInsensitiveMap<>(fileInfo.getMetadata());
Map toMetadata =newHashMap<>();
if(fromMetadata.containsKey(Constant.Metadata.CONTENT_TYPE)){
toMetadata.put(Constant.Metadata.CONTENT_TYPE, fromMetadata.get(Constant.Metadata.CONTENT_TYPE));
}
if(fromMetadata.containsKey(Constant.Metadata.CONTENT_LENGTH)){
toMetadata.put(Constant.Metadata.CONTENT_LENGTH, fromMetadata.get(Constant.Metadata.CONTENT_LENGTH));
}
if(fromMetadata.containsKey(Constant.Metadata.CONTENT_DISPOSITION)){
toMetadata.put(
Constant.Metadata.CONTENT_DISPOSITION, fromMetadata.get(Constant.Metadata.CONTENT_DISPOSITION));
}
fileInfo.setMetadata(toMetadata);
// 使用复制文件,会保留旧文件,推荐
fileStorageService
.move(fileInfo)
.setPlatform(toPlatform)
.setNotSupportMetadataThrowException(true)// 不支持元数据时抛出异常
.setNotSupportAclThrowException(true)// 不支持 ACL 时抛出异常
.setProgressListener((progressSize, allSize)-> log.info(
"文件 {}/{} 迁移进度:{} {}%",
fileInfo.getPath(), fileInfo.getFilename(), progressSize, progressSize *100/ allSize))
.move();
}
}
}
4、文件哈希计算:提供文件哈希值计算功能,确保文件完整性。
5、分片上传和下载:支持大文件分片上传和下载,提高传输效率。
int partNumber = 1;//分片号。每一个上传的分片都有一个分片号,一般情况下取值范围是1~10000
byte[] bytes = FileUtil.readBytes("C:\\001.part");//分片数据,和基本的上传方式一样,也支持各种数据源
FilePartInfo filePartInfo = fileStorageService.uploadPart(fileInfo, partNumber, bytes, (long) bytes.length).upload();
6、文件元数据管理:提供丰富的文件元数据管理功能,方便文件查询和管理。
总结
- 多平台支持:集成多种主流存储平台,用户可以根据需要自由选择和切换。
- 简易集成:通过简单的配置和一行代码即可完成文件操作,降低开发复杂度。
- 高效性能:优化的文件传输和存储机制,保证高效、可靠的文件管理。
- 灵活扩展:模块化设计,支持灵活扩展和定制,满足不同业务需求。
更多详细信息和使用方法请参阅 官方文档[1]。
引用链接
[1] 官方文档: https://x-file-storage.xuyanwu.cn