Skip to content

16内容加速:如何借助云存储实现无缝上云?

在大多数情况下,我们在为应用提供后端服务的过程中,一定会产生一些非结构化的数据(比如用户上传的图片、视频、音频等)。从用户的角度出发,用户很容易识别、打开和读取这些数据,比如你看到一个 doc 后缀的文件,肯定知道要用 word 打开。

但从后端服务的角度出发,这些数据有特定的格式标准,不能像用处理普通文本的方式解析它们,存储方式也不能用结构化的数据存储,而是块状的文件存储。而后端服务在处理这些数据时也十分简单和粗暴,比如将整个文件全部上传、全部读取下载、删除和更新。

文件存储的操作与数据库处理操作差异极大:文件存储只能是更改整体,而数据库存储可以处理细微部分。但文件存储和数据库一样,都是后端服务中不可或缺的部分,两者在各自特定的存储需求中担当不可替代的角色。

这一讲,我就带你深度使用云开发的云存储的能力和功用,与之前讲述的云函数、数据库一起,形成前后端无缝衔接,助力应用轻松上云。

用好加速 Buffer

云开发云存储本质上就是提供了一块空间供应用放置文件资源,而你只需要请求一个API,或者函数调用 SDK 就可以放置文件资源了。与传统的存储模式相比,开发者不用关心底层存储以及文件传输的过程,开发效率大大提高(如果放置的文件不断增多,这个空间也可以无限地扩张下去)。

我们把文件存储比作粮仓。在传统情况下,你要去建造一个粮仓,中间打地基、建围墙、搭顶棚并配置水电资源,这些都要投入成本。另外,你还要按照运输的需要预先铺设运输粮食的道路(网络传输)。当粮食(文件数据)开始运输时,你会发现运输的效率完全取决于道路宽窄,以及粮仓自身的调度(当粮仓满了,你又要投入成本构建新的粮仓)。

而云开发云存储,就不需要我们去搞建设,甚至不需要铺路。它自带调度系统,你只告诉云存储调度系统想把粮食(文件数据)运到哪个粮仓就可以了。命令一下达,云存储会自动完成粮食的分拆、打包及运输、粮食入库。另外,你也不用担心传送的粮食变多,因为通往粮仓的道路会根据需求增宽,而且云开发云存储自带的 CDN 加速功能也会自动帮你读取和下载文件,以此提高文件传输的效率。

CDN 加速又叫内容分发网络加速,通俗来讲就是将你主存储(源站)中的文件,复制给各地的存储点(CDN节点),当有用户访问时,可以直接从就近的存储点(CDN节点)获取。

除了上传、读取和下载文件,当文件更新时,已经复制到 CDN 节点的旧文件应该如何处理呢?这里就要引入一个知识点------缓存时间。云开发云存储的 CDN 策略会根据缓存时间做相应的变化部署。

这里的缓存时间其实就是文件副本在各地存储点(CDN节点)的有效时间,比如默认是两小时,那么每次文件副本在各地存储点的有效时间就是两小时,超过时间之后再收到请求时,存储点(CDN节点)就会向主存储(源站)请求最新的文件,而这一请求所产生的流量就称为 CDN回源流量。

缓存时间不能太长也不可太短,如果 CDN 缓存间隔时间过短, CDN 节点上的数据会经常失效,导致频繁回源,增加源站的负载,进而影响整体的传输效率;如果缓存间隔时间过长,会出现数据更新不及时等严重的业务问题。

在投入使用时,云存储中文件的变更频率会因为业务原因各不相同,云开发云存储提供了细微颗粒度的缓存时间设置,你可以针对一个文件、一个路径甚至是文件后缀来分别设置缓存时间。

另外,多个缓存规则设置中有优先级策略,当一个文件命中多个规则时,会按照规则的优先级来决定此文件的缓存时间,如此调配会更加灵活。云存储是以设置规则从后到前的配置模式来做策略计算的,比如一个云存储的域名做了如下缓存配置:

现在请求此路径下资源/test/abc.jpg,其从后到前匹配方式如下:

  • 匹配第五条,命中,此时缓存时间为 200 秒;

  • 匹配第四条,命中,此时缓存时间为 400 秒;

  • 匹配第三条,命中,此时缓存时间为 300 秒;

  • 匹配第二条,未命中;

  • 匹配第一条所有文件,命中,此时缓存时间为 2 分钟。

在实际应用过程中,我们需要根据自身应用业务对存储文件的使用频率、更新频率做细致缓存配置优化,才可以有效得到 CDN 加速带来的功效,比如:

  • 不经常更新的系统文件(如应用的资源图片)以天的频率进行缓存配置;

  • 用户数据(如用户头像,昵称)如果不涉及频繁修改,以小时级别来做缓存配置;

  • 频繁变更并有较强的业务依赖性文件(如协作编辑的文本文件),建议以秒或分钟来做缓存配置。

以上是普遍常识,你还要根据自身的业务形态来做具体的策略,比如商城小程序中,商品图片如果不常变更,则可以按天的频率来进行缓存配置;如果有活动,需要频繁变更商品图片来展示效果,则需要将缓存配置调整到分钟级,保证及时更新。

做好高安全的防护

除了传输效率之外,安全也是云开发云存储的一个核心点(很容易被人忽略)我们的应用中有很多角色(比如系统的管理员、普通用户、文件的创建者和非创建者等)。

为了确保云存储的安全性,需要明确允许哪一类角色去读取、更新云存储中的文件,这就需要云存储的权限管控。云开发云存储预先设定了 4 条安全策略(这 4 条安全策略在 14 讲数据库中给你介绍过,只不过作用的对象不一样),以下是具体的策略描述:

  • 所有用户可读,仅创建者及管理员可写: 这是云存储的默认配置,一般适用于用户的评论图片等公开数据类型,只有上传文件的用户可以处理,其他人只能读。

  • 仅创建者及管理员可读写: 一般适用于用户的一些私密文件(比如网盘应用,个人存放的一些数据文件)只有上传用户有权读取和修改。

  • 所有用户可读,仅管理员可写: 一般适用于系统发布的一些文件数据(比如商城的商品媒体资源)只能是管理员可修改,所有用户只可以读取。

  • 所有用户不可读,仅管理员可读写: 一般适用于系统级的文件存储(比如存储日志文件,维持业务运转所必需的文件等),用户无法读取修改。

安全策略就像是云存储的安保人员,每一份文件请求到达时,都要验证请求者的身份以及要操作的文件对象是否符合规定的要求。符合要求给予放行,不符合就拒之门外。

以上 4 条基本策略覆盖了整个云存储的全部文件,但在实际运作时是按照每个文件的属性做具体管控。比如云存储设置仅创建者和管理员可写,并不是说第一个写文件的用户就是独掌整个云存储空间的创建者,而是说此用户只是写的这个文件的创建者,在此安全策略下,其他人就不可以读取和变更这个文件了,只有用户自己或者是管理员才可以读取和变更。也就是说,安全策略会以文件为单位划分执行。

这里需要注意一下,我提到的管理员角色,在更多情况下是服务端角色,也就是使用云开发服务端 SDK 进行服务的云函数、云托管等计算能力,甚至是使用云开发服务端 SDK 的传统服务器。

刚刚我介绍了云存储具备的 4 种基本策略,但这些策略并不能满足所有应用开发的需求,我们需要更灵活的权限管控方式。而云开发云存储与数据库一样,也支持安全规则做灵活管控。

当客户端用户登录后,安全规则中 auth 变量会变成一个包含该用户唯一 ID(auth.uid)和登录方式(auth.loginType)的对象,如果用户未登录,则 auth 的值为 null。所以你可以通过 auth 规则对每个用户做访问控制。

比如在相册应用中,你希望所有登录用户都可以上传、浏览广场图片,不允许未登录用户访问,但可以使用匿名登录访问,匿名身份下只可以浏览,不可上传。那么你可以设置如下规则。

java
{
    "read": "auth != null",
    "write": "auth.loginType != 'ANONYMOUS' && auth.openid == resource.openid"
}

逻辑是:登录的用户可读,登录类型不是匿名登录并且是文件创建者的用户可写。当你把权限管控策略应用到业务中,并且策略可以有效运行时,你的存储空间就不用担心安全问题了。

不过,如果你认为云开发云存储只具有上传、下载、加速传输、安全防护等功能的话,那就大错特错了。它还可以应用于产品业务,并发挥非常大的作用。

应用不止于存储

最后的实战项目"商城小程序",就会遇到一些与存储有关的问题。比如,很多情况下,我们会用一张图片充当商品列表中的商品小图,和商品详情页中的商品大图,但是因为展示的大小不一样,对图片的分辨率质量的要求也就不一样。

如果我们在列表中加载高清的大图,势必会损耗不必要的流量资源,同理,如果在小的视图窗口中展示高清大图,就太浪费资源了。所以,很多开发者会存放不同分辨率的图片,在列表加载和详情加载时分别拉取不同分辨率的图片。这样一来会加大图片管理的难度,也占据了不少存储空间,我们看云开发云存储如何解决这个问题的。

假设一个高清大图的地址为:

java
https://demo.tcb.qcloud.la/logo.jpg?sign=b8d7&t=1549

如果我们只想获得这张图片20%分辨率大小,可以用如下地址获得:

java
https://demo.tcb.qcloud.la/logo.jpg?sign=b8d7&t=1549&imageMogr2/thumbnail/!20p

也就是说,我们可以通过在地址后拼接参数的形式直接获取到相应的处理图片。图缩处理参数为&imageMogr2/thumbnail/!20p,最后的 20P 中的 20 就是 20% 的分辨率。如果你还想获得更多处理类型的图片,你可以学习如下的一些案例:

java
//缩放宽度,高度不变,下面案例为宽度为原图50%,高度不变
download_url&imageMogr2/thumbnail/!50px
//缩放高度,宽度不变,下面案例为高度为原图50%,宽度不变
download_url&imageMogr2/thumbnail/!x50p
//指定目标图片的宽度(单位为px),高度等比压缩,注意下面的是x,不是px,p与x在拼接里代表着不同的意思
download_url&imageMogr2/thumbnail/640x
//指定目标图片的高度(单位为px),宽度等比压缩:
download_url&imageMogr2/thumbnail/x355
//限定缩略图的宽度和高度的最大值分别为 Width 和 Height,进行等比缩放
download_url&imageMogr2/thumbnail/640x355
//限定缩略图的宽度和高度的最小值分别为 Width 和 Height,进行等比缩放
download_url&imageMogr2/thumbnail/640x355r
//忽略原图宽高比例,指定图片宽度为 Width,高度为 Height ,强行缩放图片,可能导致目标图片变形
download_url&imageMogr2/thumbnail/640x355!
//等比缩放图片,缩放后的图像,总像素数量不超过 Area
download_url&imageMogr2/thumbnail/150000@
//取半径为300,进行内切圆裁剪
download_url&imageMogr2/iradius/300
//取半径为100px,进行圆角裁剪
download_url&imageMogr2/rradius/100
//顺时针旋转90度
download_url&imageMogr2/rotate/90
//将jpg格式的原图片转换为 png 格式
download_url&imageMogr2/format/png
//模糊半径取8,sigma 值取5,进行高斯模糊处理
download_url&imageMogr2/blur/8x5
//获取图片的基础信息,返回的是json格式,我们可以使用https请求来查看图片的format格式,width宽度、height高度,size大小,photo_rgb主色调
download_url&imageInfo

从大小处理,到图片形状处理,甚至是模糊处理,只需要在参数上做点手脚,全部可以搞定。

当然了,如果你希望保护上传的图片,以防被盗用时没有证据,那你可以使用云开发的扩展能力---图像盲水印。它可以将水印信息以不可见的形式添加到原图信息中,您可对疑似被盗取的资源进行盲水印提取,验证图片归属。

总结

云开发云存储不止在传输效率以及安全性方面做了大量的工作,更在一些业务应用场景下有一些突破性的能力(比如图像处理,盲水印),开发者借助这些能力,开发应用将变得愈发简单。为了更好地让你熟悉把握,今天这节课我主要带你了解了云存储的能力和高级用法,我想强调这样三个重点:

  • 云存储自带CDN加速,并提供灵活的缓存配置;

  • 云存储有很高的安全防护能力,可使用安全规则高效防护;

  • 云存储自带扩展处理能力,可以轻松实现图像编辑,盲水印等功能。

云开发在云存储的扩展能力上不断探索,致力于覆盖更多场景,从单一存储到智能存储,更快也更强,我这一讲主要想让你更好地理解云存储的各种特性(缓存、CDN、安全规则、拓展能力),这样你才能使用得更加灵活,而能够深入理解和使用云存储、云函数、数据库这三个能力,你其实就已经完成了云开发的学习了。

本节课的作业是:遵照本节描述和文档说明,体验一下云存储的图像处理功能,获得同一图片不同种处理结果。