1 前言
云存储市场近年来经历了显著的增长和发展。随着智能终端的普及和全球大数据储量的持续增长,云存储的需求也在不断扩大。根据前瞻产业研究院的统计,2020年中国云存储市场规模约为398亿元,预计到2026年将突破1836亿元。这一增长趋势主要得益于5G时代的到来,其对更强大存储能力的需求推动了市场的发展。
对象存储 EOS(Elastic Object Storage)是移动云为客户提供的一种海量空间的存储产品,具备高性能、高可靠、安全、低成本等特性,通过标准的S3接口提供非结构化数据(图片、音视频、文本等格式文件)的存储服务,满足用户在任何地方通过互联网对数据进行管理和访问的需求
- 概念介绍:
创建存储桶:在上传任何文件(Object)到EOS之前,您必须先创建一个存储桶(Bucket)。存储空间具有各种配置属性,包括地域、存储类型、访问权限等。您可以根据实际需求,创建不同类型的存储桶来存储不同的数据。
使用自有域名访问EOS资源:EOS支持绑定自定义域名功能,您可以将自定义域名绑定到EOS存储空间,并使用自定义域名访问存储空间中的数据。
- 产品优势
- 分层存储:支持标准、低频、归档三种存储类型,通过生命周期管理可自动转换存储类别,降低存储成本。
- 按需扩展:存储空间可以根据业务承载情况按需使用、灵活伸缩,用户无需担心存储空间问题。
- 通用接口:支持标准S3、Swift接口,并提供多种语言的SDK开发包供客户二次开发。 安全可靠:通过可信云认证,数据多副本存储,数据存储持久性可达99.999999999%,服务可用性高达99.95%
2 新手入门
2.1 命令行快速入门
主要介绍使用 S3cmd 命令行工具操作桶和文件(Object),查询 AK/SK 信息
1. 创建桶
s3cmd mb s3://<bucket-name>
示例:
创建一个名称为‘bucket-for-uat’的桶(这里的桶名称用来举例说明,没有特殊含义,下文不再赘述)。
s3cmd mb s3://bucket-for-uat
2. 获取桶信息
命令格式:
s3cmd info s3://<bucket-name>
示例:
获取桶名称为‘bucket-for-uat’的桶信息。
3. 删除桶
命令格式:
s3cmd rb s3://<bucket-name>
示例:
删除创建的‘bucket-for-uat’桶。
s3cmd rb s3://bucket-for-uat
4 上传文件
命令格式:
s3cmd put <file_path> s3://<bucket-name>/<object-key>
示例:
上传本地文件‘README.md’到对象存储 EOS 的桶‘bucket-for-uat’。
s3cmd put .\README.md s3://bucket-for-uat/README.md
5 获取文件列表
命令格式:
s3cmd ls s3://<bucket-name>
示例:
上传文件到桶后,获取文件列表信息。
s3cmd ls s3://bucket-for-uat
6 下载文件
命令行格式:
s3cmd get s3://<bucket-name>/<object-key> <file_path>
示例:
下载上传的‘README.md’文档到本地,名称为‘downloadFromEOS.md’。
s3cmd get s3://bucket-for-uat/README.md downloadFromEOS.md
7 校验文件一致性
示例:
校验对象存储 EOS 服务端、本地下载文件和本地源文件的一致性 校验结果,本地源文件‘README.md’和‘downloadFromEOS.md’和服务端的‘README.md’,3 个文件的 MD5 值相同。
8 删除文件
命令格式:
s3cmd del s3://<bucket-name>/<object-key>
示例:
删除桶中的‘README.md’文件。
s3cmd del s3://bucket-for-uat/README.md
2.2 JavaSDK快速入门
存储桶是您用于存储对象 (Object) 的容器,在上传任何文件到 EOS 之前,您必须先创建存储桶。
以下代码用于创建桶:
// 填写存储桶(Bucket)所在地域对应的 endpoint 和 Region。
// 以华东 - 苏州为例,endpoint 填写 https://eos-wuxi-1.cmecloud.cn,Region 填写 wuxi1。
String endpoint = "<your-endpoint>";
String region = "<your-region>";
// 填写 EOS 账号的认证信息,或者子账号的认证信息。
String accessKey = "<your-access-key>";
String secretKey = "<your-secret-access-key>";
// 桶名。
String bucketName = "<your-bucket-name>";
// 创建 AmazonS3 实例。
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endpoint, region);
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
AmazonS3 client = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(endpointConfiguration)
.withCredentials(credentialsProvider).build();
// 创建桶。
client.createBucket(bucketName);
// 关闭 client。
client.shutdown();
上传对象
// 填写存储桶(Bucket)所在地域对应的 endpoint 和 Region。
// 以华东 - 苏州为例,endpoint 填写 https://eos-wuxi-1.cmecloud.cn,Region 填写 wuxi1。
String endpoint = "<your-endpoint>";
String region = "<your-region>";
// 填写 EOS 账号的认证信息,或者子账号的认证信息。
String accessKey = "<your-access-key>";
String secretKey = "<your-secret-access-key>";
// 桶名。
String bucketName = "<your-bucket-name>";
// 文件名。
String objectName = "<your-object-name>";
// 创建 AmazonS3 实例。
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endpoint, region);
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
AmazonS3 client = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(endpointConfiguration)
.withCredentials(credentialsProvider).build();
// 上传对象。
byte[] content = "Object Content".getBytes();
client.putObject(bucketName, objectName, new ByteArrayInputStream(content), null);
// 关闭 client。
client.shutdown();
3 项目实践
了解了使用移动云对象存储EOS新手入门之后,接下来介绍一下使用对象存储EOS进行使用Web端上传数据至EOS
- Java服务端生成签名
使用 Java 1.7 及以上版本,可以通过命令 java -version 查看 Java 版本。 - 配置数据源
注意:
请将 config.json 文件放在 signatureServerPolicy-v1.jar 同一层级,目录结构如下:
├─signatureServerPolicy-v1.jar
├─config.json
config.json 文件参数说明:
config.json 文件示例如下:
{
"accessKeyId": "your-access-key",
"secretAccessKey": "your-secret-access-key",
"port": "7080"
}
服务端启动
java -jar signatureServerPolicy-v1.jar
请求体:
请求体示例:
{
"bucketName": "your-bucket-name",
"objectName": "your-object-name",
"durationSeconds": 3600,
"acl": "private",
"contentType": "your-contentType"
}
返回体示例:
{
"body": {
"x-amz-algorithm": "your-x-amz-algorithm",
"key": "your-key",
"acl": "your-acl",
"x-amz-signature": "your-x-amz-signature",
"x-amz-date": "your-x-amz-date",
"policy": "your-policy",
"x-amz-credential": "your-x-amz-credential",
"bucket": "your-bucket-name",
"Content-Type": "your-contentType"
},
"statusCode": "200"
}
附服务端核心处理代码,可以在此代码的基础上进行补充功能
@Path("/")
public class SignatureServerPolicy {
@Path("/createSignature")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String createSignature(CreateSignatureReq createSignatureReq) {
AWS4SignerForAuthorization signer = new AWS4SignerForAuthorization();
// 读取配置文件。
String readJson = DateUtil.ReadJson("./config.json");
JSONObject resp = new JSONObject();
System.out.println("用户输入 url:" + readJson);
if (readJson.equals("")) {
resp.put("statusCode", "500");
resp.put("ErrorCode", "500");
resp.put("ErrorMessage", "错误,您输入的配置文件内容为空!");
return resp.toJSONString();
}
JSONObject jsonObj = JSONObject.parseObject(readJson);
String accessKeyId = jsonObj.getString("accessKeyId");
String accessKeySecret = jsonObj.getString("secretAccessKey");
BigInteger durationSeconds = createSignatureReq.getDurationSeconds();
String acl = createSignatureReq.getAcl();
String bucket = createSignatureReq.getBucketName();
String key = createSignatureReq.getObjectName();
String contentType = createSignatureReq.getContentType();
System.out.println("用户输入 createSignatureReq:" + createSignatureReq);
if (StringUtils.isEmpty(bucket) || StringUtils.isEmpty(key)) {
resp.put("statusCode", "500");
resp.put("ErrorCode", "500");
resp.put("ErrorMessage", "错误,您输入的 bucket 或者 key 内容为空!");
return resp.toJSONString();
}
try {
Map<String, String> authorization = signer.computeSignature(durationSeconds, accessKeyId, accessKeySecret, acl,
bucket, key, contentType);
resp.put("body", authorization);
resp.put("statusCode", "200");
} catch (Exception e) {
resp.put("statusCode", "500");
resp.put("ErrorCode", "500");
resp.put("ErrorMessage", e.getMessage());
}
return resp.toJSONString();
}
/**
* 服务端启动
*/
public static void main(String[] args) throws Exception {
String readJson = DateUtil.ReadJson("./config.json");
JSONObject jsonObj = JSONObject.parseObject(readJson);
int port = jsonObj.getIntValue("port");
Server server = new Server(port); // 监听 7080 端口
ServletHolder servlet = new ServletHolder(ServletContainer.class);
// 设置初始化参数
servlet.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", "com.sun.jersey.api.core.PackagesResourceConfig");
servlet.setInitParameter("com.sun.jersey.config.property.packages", "com.cmss.eos.sample");
servlet.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); // 自动将对象映射成 JSON 返回
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setContextPath("/");
handler.addServlet(servlet, "/*");
server.setHandler(handler);
server.start();
}
}
4 应用场景
4.1 网站托管
对于企业门户、办公OA首页等静态网站,通过对象存储静态网站托管功能,实现动静态网站分离,在对象存储中加载静态资源直接向用户提供网站访问服务,减少网站服务器资源消耗,降低用户网站的运营与维护成本。
4.2 多媒体数据存储和播放
将海量音频、视频文件、医学影像、各行业监控视频存储到移动云对象存储中,结合CDN产品实现资源就近访问,提升用户访问速度,满足音视频网站的数据存储与高速、低时延访问需求。
4.3 数据备份
对象存储为用户提供灵活的接入方式和安全可靠的数据存储,用户可将业务系统的数据根据访问的频率备份到对象存储中,满足用户对数据持久性的要求,保障数据安全不丢失。
5 总结
移动云存储是一种将文件存储在云端的服务,它可以实现随时随地的文件访问和共享。移动云存储具有便捷性、性能和高效性等优势,但也需要考虑网络、空间和隐私等问题1。移动云存储在个人、企业、教育和创作等领域都有广泛的应用。移动云存储系统基于云网融合、算力协同、智能编排等技术,提供高性能、高扩展、高易用的存储能力。
总的来说,移动云云存储是一种新兴的数据存储和管理模式,具有高效、灵活、安全等优势。随着技术的不断进步和服务商的不断创新,相信移动云云存储将会在未来发挥更加重要的作用,成为高效数据管理的新模式。
点击后可直接跳转至官方网站:https://ecloud.10086.cn/portal/product/eos