【云界洞见】移动云对象存储EOS项目实践

1 前言

云存储市场近年来经历了显著的增长和发展。随着智能终端的普及和全球大数据储量的持续增长,云存储的需求也在不断扩大。根据前瞻产业研究院的统计,2020年中国云存储市场规模约为398亿元,预计到2026年将突破1836亿元。这一增长趋势主要得益于5G时代的到来,其对更强大存储能力的需求推动了市场的发展。

对象存储 EOS(Elastic Object Storage)是移动云为客户提供的一种海量空间的存储产品,具备高性能、高可靠、安全、低成本等特性,通过标准的S3接口提供非结构化数据(图片、音视频、文本等格式文件)的存储服务,满足用户在任何地方通过互联网对数据进行管理和访问的需求
在这里插入图片描述

  • 概念介绍:
    创建存储桶:在上传任何文件(Object)到EOS之前,您必须先创建一个存储桶(Bucket)。存储空间具有各种配置属性,包括地域、存储类型、访问权限等。您可以根据实际需求,创建不同类型的存储桶来存储不同的数据。
    使用自有域名访问EOS资源:EOS支持绑定自定义域名功能,您可以将自定义域名绑定到EOS存储空间,并使用自定义域名访问存储空间中的数据。
  • 产品优势
  1. 分层存储:支持标准、低频、归档三种存储类型,通过生命周期管理可自动转换存储类别,降低存储成本。
  2. 按需扩展:存储空间可以根据业务承载情况按需使用、灵活伸缩,用户无需担心存储空间问题。
  3. 通用接口:支持标准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
在这里插入图片描述

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值