【云界洞见】移动云对象存储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
在这里插入图片描述

Linux命令大全(CHM格式离线版) Linux命令大全(修改版) 进行重新编译的说明 文件传输 bye ftp ftpcount ftpshut ftpwho ncftp tftp uucico uucp uupick uuto 备份压缩 ar bunzip2 bzip2 bzip2recover compress cpio dump gunzip gzexe gzip lha restore tar unarj unzip zip zipinfo 文件管理 diff diffstat file find git gitview ln locate lsattr mattrib mc mcopy mdel mdir mktemp mmove mread mren mshowfat mtools mtoolstest mv od paste patch rcp rhmask rm slocate split tee tmpwatch touch umask whereis which cat chattr chgrp chmod chown cksum cmp cp cut indent 磁盘管理 cd df dirs du edquota eject lndir ls mcd mdeltree mdu mkdir mlabel mmd mmount mrd mzip pwd quota quotacheck quotaoff quotaon repquota rmdir rmt stat tree umount 磁盘维护 badblocks cfdisk dd e2fsck ext2ed fdisk fsck.ext2 fsck fsck.minix fsconf hdparm losetup mbadblocks mformat mkbootdisk mkdosfs mke2fs mkfs.ext2 mkfs mkfs.minix mkfs.msdos mkinitrd mkisofs mkswap mpartition sfdisk swapoff swapon symlinks sync 系统设置 alias apmd aumix bind chkconfig chroot clock crontab declare depmod dircolors dmesg enable eval export fbset grpconv grpunconv hwclock insmod kbdconfig lilo liloconfig lsmod minfo mkkickstart modinfo modprobe mouseconfig ntsysv passwd pwconv pwunconv rdate resize rmmod rpm set setconsole setenv setup sndconfig SVGAText Mode timeconfig ulimit unalias unset 系统管理 adduser chfn chsh date exit finger free fwhois gitps groupdel groupmod halt id kill last lastb login logname logout logrotate newgrp nice procinfo ps pstree reboot renice rlogin rsh rwho screen shutdown sliplogin su sudo suspend swatch tload top uname useradd userconf userdel usermod vlock w who whoami whois 文档编辑 col colrm comm csplit ed egrep ex fgrep fmt fold grep ispell jed joe join look mtype pico rgrep sed sort spell tr uniq wc 网络通讯 dip getty mingetty ppp-off smbd(samba daemon) telnet uulog uustat uux cu dnsconf efax httpd ifconfig mesg minicom nc netconf netconfig netstat ping pppstats samba setserial shapecfg(shaper configuration) smbd(samba daemon) statserial(status ofserial port) talk tcpdump testparm(test parameter) traceroute tty(teletypewriter) uuname wall(write all) write ytalk arpwatch apachectl smbclient(samba client) pppsetup 电子邮件与新闻组 archive ctlinnd elm getlist inncheck mail mailconf mailq messages metamail mutt nntpget pine slrn X WINDOWS SYSTEM reconfig startx(start X Window) Xconfigurator XF86Setup xlsatoms xlsclients xlsfonts 其他 yes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值