xiaoming728

xiaoming728

阿里云OSS对象存储对接

2023-12-11
阿里云OSS对象存储对接

oss学习地址

可跳过前半部分,直接查看工具类使用方法。

OSS与自建存储对比的优势

对比项

对象存储OSS

自建服务器存储

可靠性

OSS作为阿里巴巴全集团数据存储的核心基础设施,多年支撑双11业务高峰,历经高可用与高可靠的严苛考验。OSS的多重冗余架构设计,为数据持久存储提供可靠保障。同时,OSS基于高可用架构设计,消除单节故障,确保数据业务的持续性。

  • 服务设计可用性不低于99.995%。

  • 数据设计持久性不低于99.9999999999%(12个9)。

  • 规模自动扩展,不影响对外服务。

  • 数据自动多重冗余备份。

  • 受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。

  • 人工数据恢复困难、耗时、耗力。

安全

  • 提供企业级多层次安全防护,包括服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性等。

  • 多用户资源隔离机制,支持异地容灾机制。

  • 获得多项合规认证,包括SEC、FINRA等,满足企业数据安全与合规要求。

  • 需要另外购买清洗和黑洞设备。

  • 需要单独实现安全机制。

成本

  • 多线BGP骨干网络,无带宽限制,上行流量免费。

  • 无需运维人员与托管费用,0成本运维。

  • 存储受硬盘容量限制,需人工扩容。

  • 单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。

  • 需专人运维,成本高。

智能存储

提供多种数据处理能力,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等,并无缝对接Hadoop生态、以及阿里云函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品,满足企业数据分析与管理的需求。

需要额外采购,单独部署。

强一致性

Object 操作在 OSS 上具有原子性,操作要么成功要么失败,不会存在有中间状态的 Object。OSS 保证用户一旦上传完成之后读到的 Object 是完整的,OSS 不会返回给用户一个部分上传成功的 Object。

Object 操作在 OSS 上同样具有强一致性,用户一旦收到了一个上传(PUT)成功的响应,该上传的 Object 就已经立即可读,并且 Object 的冗余数据已经写成功。不存在一种上传的中间状态,即 read-after-write 却无法读取到数据。对于删除操作也是一样的,用户删除指定的 Object 成功之后,该 Object 立即变为不存在。

OSS基本概念

存储空间(Bucket)

存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。

  • 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。

  • 每个用户可以拥有多个存储空间。

  • 存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。

  • 存储空间内部的对象数目没有限制。

存储空间的命名规范如下:

  • 只能包括小写字母、数字和短横线(-)。

  • 必须以小写字母或者数字开头和结尾。

  • 长度必须在 3–63 字节之间。

对象/文件(Object)

对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的 Key 来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。

对象的生命周期是从上传成功到被删除为止。在整个生命周期内,只有通过追加上传的 Object 可以继续通过追加上传写入数据,其他上传方式上传的 Object 内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。

对象的命名规范如下:

  • 使用 UTF-8 编码。

  • 长度必须在 1–1023 字节之间。

  • 不能以正斜线(/)或者反斜线(\)开头。

Endpoint(访问域名)

Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同的 Region 的时候,需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 oss-cn-hangzhou-internal.aliyuncs.com。具体的内容请参见各个 Region 对应的 Endpoint

AccessKey(访问密钥)

AccessKey(简称 AK)指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户;AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。对于 OSS 来说,AccessKey 的来源有:

  • Bucket 的拥有者申请的 AccessKey。

  • 被 Bucket 的拥有者通过 RAM 授权给第三方请求者的 AccessKey。

  • 被 Bucket 的拥有者通过 STS 授权给第三方请求者的 AccessKey。

OSS工具类使用

oss配置:

#aliyun oss配置信息

aliyun.oss.endpoint=http://oss-cn-hangzhou.aliyuncs.com

#AccessKey

aliyun.oss.keyid=LTAI4G7MfAz3Uq7Cb4E8dYkW

aliyun.oss.keysecret=48EAhGhBMMumK6cEPuCjxJiEYqRpUE

#存储空间--bucket

aliyun.oss.bucketname=archives-gd

#当前环境

aliyun.oss.filehost=test

oss工具类使用:

注入:

@Autowired

OssUtil ossUtil;

代码示例:

@RestController
public class OssController {

    @Autowired
    OssUtil ossUtil;


    @GetMapping("/oss")
    public void test(){
        File file = new File("F:\\testFtp\\localFile.txt");
        //上传文件。 --也可采用流式上传,使用ossUtil中流式上传方法即可
        String path = ossUtil.uploadFile("gd.txt","/gd",file);
        System.out.println(path);
        //删除文件
        ossUtil.deleteFile("http://archives-gd.oss-cn-hangzhou.aliyuncs.com/test/gd/gd.txt");
        //列举当前bucket下所有文件
        List<String> list = ossUtil.listObjects();
        System.out.println(list.size());
        
        //上传文件--断点续传
        String parh = ossUtil.uploadObjectOSS("F:\\testFtp\\4.zip","s/4.zip",null);
        System.out.println(parh);

        //下载文件--断点续传
        ossUtil.downFileFromOSS("F:\\testFtp\\1\\4.zip","http://archives-gd.oss-cn-hangzhou.aliyuncs.com/s/4.zip");
        
         //上传文件夹
        //保存所有文件返回地址
        List<String> path = new ArrayList<>();
        ossUtil.uploadDir("33010","D:\\t",path);
        System.out.println(path);
    }

}