OSS

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。

OSS可以被理解成一个即开即用、无限大空间的存储集群。

OSS将数据文件以对象/文件(Object)的形式上传到存储空间(Bucket)中。OSS提供的是一个Key-Value键值对形式的对象存储服务。用户可以根据Object的名称(Key)唯一地址获取该Object的内容。

可以进行以下OSS相关的操作:

创建存储空间,并向存储空间中上传文件。获取已上传文件的地址,进行文件的分享和下载。修改存储空间或文件的属性或元信息,为其设置相应的权限。在对象存储OSS控制台进行基础和高级OSS操作。通过开发者工具包SDK或直接在应用程序中调用RESTful API,进行基础和高级OSS操作。

特点

易用性:简单易用,便于管理,深度集成数据处理服务 高可靠:为数据持久存储提供稳定保障

多份副本:多份副本保存,有效应对各类硬件故障冗余架构:OSS全冗余的基础架构,消除单点隐患,保障服务的高可用性异地容灾:提供跨区域复制功能和灾备方案,支持数据自动备份在不同城市,实现异地容灾能力 强安全:多重访问控制细粒度的授权管理。Bucket|Object权限控制、Access ID和请求签名、VPC网络链路层访问控制、RAM&STS主子账号授权 低成本:数据按照冷热分层提供最具性价比的存储方式

OSS对象存储传统存储用相比自建存储降低25%~75%的成本,提供更加稳定安全可靠的数据保障一次性投入高,资源利用率很低三种存储类型,不同数据冷热,追求最极致的TCO存储受硬盘容量限制,需人工扩容多线带宽接入,上行流量免费单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容完全托管的存储模式,0成本运维需专人运维,成本高

对比项OSS文件系统数据模型OSS是一个分布式的对象存储服务,提供的是一个Key-Value对形式的对象存储服务。文件系统是一种典型的树状索引结构。数据获取根据Object的名称(Key)唯一的获取该Object的内容。虽然用户可以使用类似test1/test.jpg的名字,但是这并不表示用户的Object是保存在test1目录下面的。对于OSS来说,test1/test.jpg仅仅只是一个字符串,与example.jpg并没有本质的区别。因此不同名称的Object之间的访问消耗的资源是类似的。一个名为test1/test.jpg的文件,访问过程需要先访问到test1这个目录,然后再在该目录下查找名为test.jpg的文件。优势支持海量的用户并发访问。支持文件的修改,比如修改指定偏移位置的内容、截断文件尾部等。也支持文件夹的操作,比如重命名目录、删除目录、移动目录等非常容易。劣势OSS保存的Object不支持修改(追加写Object需要调用特定的接口,生成的Object也和正常上传的Object类型上有差别)。用户哪怕是仅仅需要修改一个字节也需要重新上传整个Object。OSS可以通过一些操作来模拟类似文件夹的功能,但是代价非常昂贵。比如重命名目录,希望将test1目录重命名成test2,那么OSS的实际操作是将所有以test1/开头的Object都重新复制成以test2/开头的Object,这是一个非常消耗资源的操作。因此在使用OSS的时候要尽量避免类似的操作。受限于单个设备的性能。访问越深的目录消耗的资源也越大,操作拥有很多文件的目录也会非常慢。

基本概念

数据以对象(Object)的形式存储在OSS的存储空间(Bucket )中。如果要使用OSS存储数据,您需要先创建Bucket,并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后,您可以将数据以Object的形式上传到Bucket,并指定Object的文件名(Key)作为其唯一标识。

OSS以HTTP RESTful API的形式对外提供服务,访问不同地域需要不同的访问域名(Endpoint)。当您请求访问OSS时,OSS通过使用访问密钥(AccessKey ID和AccessKey Secret)对称加密的方法来验证某个请求的发送者身份。

Object操作在OSS上具有原子性和强一致性。

(1)对象/文件(Object)

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

对象的生命周期是从上传成功到被删除为止。在整个生命周期内,对象信息不可变更,重复上传同名的对象会覆盖之前的对象。因此,OSS不支持修改文件的部分内容等操作。

(2)存储空间(Bucket)

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

每个Object必须都包含在Bucket中;同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有对象都直接隶属于其对应的存储空间;每个用户可以拥有多个存储空间,存储空间的名称在OSS范围内必须是全局唯一的,一旦创建之后无法修改名称;存储空间内部的对象数目没有限制,大小总和不能超过2PB。

(3)地域

Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。

(4)访问域名

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

如果Bucket的权限为公共读或者公共读写时,Object的访问规则如下:

http://<你的bucket名字>.<数据中心服务域名>/<你的object名字>

示意图:

http://oss-example.oss-cn-hangzhou.aliyuncs.com/aliyun-logo.png

(5)访问密钥

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

(6)强一致性

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

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

存储类型

(1)标准存储

高性能、高可靠、高可用的对象存储服务 吞吐量大,热点文件、需要频繁访问的业务场景,适用于各种社交、分享类的图片、音视频应用、大型网站、大数据分析等业务场景 持久性:99.999999999% 最低存储时间:无

(2)低频访问

较低存储成本和实时访问特性的对象存储服务 数据访问实时,读取频率较低的业务场景 持久性:99.999999999% 最低存储时间:30天,最小计量单位:64KB

(3)归档存储

提供了高持久性、极低存储成本的对象存储服务适用于数据长期保存的业务场景,例如档案数据、医疗影像、科学资料、影视素材等。数据需解冻(约1分钟)后访问,解冻会产生数据取回费用。持久性: 99.999999999%最低存储时间:60天,最小计量单位:64KB

(4)冷归档存储

数据需解冻(约1分钟)后访问,解冻会产生数据取回费用适用于需要超长时间存放的极冷数据,例如因合规要求需要长期留存的数据、大数据及人工智能领域长期积累的原始数据、影视行业长期留存的媒体资源、在线教育行业的归档视频等业务场景。数据需解冻后访问,解冻时间根据数据大小和选择的解冻模式决定,解冻会产生数据取回费用。最低存储时间:180天,最小计量单位:64KB

权限控制

OSS提供ACL (Access Control List)权限控制方法,OSS ACL提供Bucket级别的权限访问控制,Bucket目前有三种访问权限:

Public-read-writePublic-readPrivate

创建Bucket时默认为private权限。可以通过OSS的Put Bucket Acl接口修改该Bucket的权限。

请求路由规则

OSS使用域名系统(DNS, Domain Name System)将请求发往正确的服务器从URL中通过三级域名提取bucket名称,然后将请求路由到 Bucket所在的数据中心,即所谓的三级域名访问方式当一个数据中心的 OSS服务器收到属于其他数据中心bucket的请求时,OSS服务器会返回HTTP 403(禁止访问)错误码,并在 HTTP消息体内提示正确的数据中心服务域名

文件上传代码

依赖:

com.aliyun.oss

aliyun-sdk-oss

3.8.0

配置文件:

spring:

# 资源信息

messages:

# 国际化资源文件路径

basename: i18n/messages

profiles:

active: dev

# 文件上传

servlet:

multipart:

# 单个文件大小

max-file-size: 50MB

# 设置总上传的文件大小

max-request-size: 100MB

aliyun:

oss:

endpoint: xtslife-oss.oss-cn-chengdu.aliyuncs.com # oss对外服务的访问域名

accessKeyId: test # 访问身份验证中用到用户标识

accessKeySecret: test # 用户用于加密签名字符串和oss用来验证签名字符串的密钥

bucketName: xtslife-oss # oss的存储空间

policy:

expire: 300 # 签名有效期(S)

maxSize: 10 # 上传文件大小(M)

callback: http://localhost:8080/aliyun/oss/callback # 文件上传成功后的回调地址

dir:

prefix: xtslife/images/ # 上传文件夹路径前缀

endpoint、accessKeyId、accessKeySecret、bucketName、callback、prefix都要改为你自己帐号OSS相关的,callback需要是公网可以访问的地址。web文件上传大小受spring.servlet.multipart.max-file-size和spring.servlet.multipart.max-request-size配置影响。

是PutObject方法来上传单个文件(Object),属于OSS上传方式中的简单上传。简单上传适用于一次HTTP请求交互即可完成上传的场景,例如小文件(小于5 GB)的上传。

Put Object方式最大不能超过5GB,大文件可以用multipart方式上传,Object大小不能超过48.8TB。

(1)创建OSSClient实例

在此处可通过ClientConfiguration配置OSS连接配置。

private OSSClient getOssClient() {

return new OSSClient(endpoint,

new DefaultCredentialProvider(accessKeyId,secretAccessKey),

new ClientConfiguration());

}

(2)文件上传

/**

* 文件上传

* @param file

* @return

*/

public Map uploadFile (@Nullable MultipartFile file) {

Map map = new HashMap<>();

String fileExt = FileUtil.extName(file.getOriginalFilename());

SimpleDateFormat sm = new SimpleDateFormat("yyyy/MM");

String today = sm.format(new Date());

String fileKey = BASE_FILE_PATH + "/" + today +"/"+getCurrentDate()+"."+fileExt;

OSSClient ossClient = getOssClient();

try {

// 文件存储入OSS,Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。

// 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object

ossClient.putObject(bucketName, fileKey, file.getInputStream());

log.info("上传文件:" + fileKey + "存入OSS成功。");

} catch (Exception e) {

log.warn("上传文件异常,errMsg = {}", e);

} finally {

ossClient.shutdown();

}

map.put("fileUrl",fileKey);

map.put("url",getUrl(fileKey,ossClient));

return map;

}

(3)如果想通过链接访问你保存的文件,可使用以下方法生成外链

private String getUrl(String fileKey, OSSClient ossClient) {

// 设置URL过期时间为10年 3600l* 1000*24*365*10

Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);

// 生成URL

URL url = ossClient.generatePresignedUrl(bucketName, fileKey, expiration);

if (url != null) {

log.info(fileKey + "生成的访问路径为:"+ url);

return url.toString();

}

return null;

}

(4)如果你想删除OSS上保存的文件,可通过deleteObject方法来删除,在此方法上必要条件是保存时的文件内部路径。

public void deleteFile (String fileKey) {

OSSClient ossClient = getOssClient();

try {

// 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。

// 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket

ossClient.deleteObject(bucketName, fileKey);

log.info("删除文件:" + fileKey + "删除OSS成功。");

} catch (Exception e) {

log.warn("删除文件异常,errMsg = {}", e);

} finally {

ossClient.shutdown();

}

}

文件下载

三种下载方式:

简单下载:下载已经上传的文件(Object) , Object下载是使用HTTP的GET请求来完成的。断线续传下载:OSS提供了从Object指定的位置开始下载的功能,在下载大的Object的时候,可以分多次下载。如果下载中断,重启的时候也可以从上次完成的位置开始继续下载。授权给第三方下载:将私有Bucket内部的Object授权给第三方下载的时候,不应该直接将AccessKey提供给下载者,而应该使用URL签名和临时访问凭证两种方法。

应用场景

(1)图片和音视频等应用的海量存储

OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。

(2)CDN加速与动静分离

利用海量互联网带宽,OSS可以实现海量数据的互联网并发下载。OSS提供原生的传输加速功能,支持上传加速、下载加速,提升跨国、跨洋数据上传、下载的体验。同时,OSS也可以结合CDN产品,提供静态内容存储、分发到边缘节点的解决方案,利用CDN边缘节点缓存的数据,提升同一个文件被同一地区客户大量重复并发下载的体验。

(3)云端数据处理

上传文件到OSS后,可以配合媒体处理服务和图片处理服务进行云端的数据处理。

OSS实践要点

(1)数据备份与跨域复制

异地容灾:通过跨区域复制功能可在另━数据中心维护副本,实现异地容灾

数据合规:在远距离的OSS数据中心之间复制数据以满足数据合规性要求

(2)安全防护与管理

OSS适用于存储各种类型的静态资源,为防止OSS的资源被恶意盗用,OSS提供了几种安全防护功能,还可以集成安全类产品进行安全防护。

防盗链 目前OSS提供的防盗链方法主要有以下两种:

设置Referer。该操作通过控制台和SDK均可进行,用户可根据自身需求进行选择。http请求发给服务器后,如果服务器要求必须是某个地址或者某几个地址才能访问,而你发送的referer不符合他的要求,就会拦截或者跳转到他要求的觉地址进行访问。签名URL,适合习惯开发的用户。 权限控制 Bucket私有的情况下,需要通过签名URL访问object。 由于签名URL存在一个过期时间,所以签名URL会定期过期,增加了一直恶意下载的成本,同时用户需要集成OSS签名URL的API,有一定的开发成本。

例子:

我在www.google.com里有一个www.baidu.com链接,那么点击这个ww.baidu.com,它的header信息里就有:

Referer=http://www.google.com

那么可以利用这个来防止盗链了,比如我只允许我自己的网站访问我自己的图片服务器,那我的域名是ww.google.com,那么图片服务器每次取到Referer来判断一下是不是我自己的域名ww.google.com,如果是就继续访问,不是就拦截。

(3)CDN加速与动静分离

利用海量互联网带宽,OSS可以实现海量数据的互联网并发下载。OSS提供原生的传输加速功能,支持上传加速、下载加速,提升跨国、跨洋数据上传、下载的体验。同时,OSS也可以结合CDN产品,提供静态内容 存储、分发到边缘节点的解决方案,利用CDN边缘节点缓存的数据,提升同一个文件被同一地区客户大量重复并发下载的体验。

(4)云端数据处理

上传文件到OSS后,可以配合媒体转码服务(MTS),图片处理服务(IMG),批量计算服务、离线数据处理服务(ODPS)充分挖掘数据的价值,引领从IT到DT的变革。

能够提供:

富媒体数据处理:自带图片处理/自定义函数等增值服务(比如:图片水印),配合MTS实现视频转码/截帧存储+计算:与阿里云数据计算产品打通,可直接调用计算服务挖掘您的数据价值

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。