作者:泽尘

简介

随着具有不同屏幕尺寸和分辨率设备的爆炸式增长,开发人员经常需要提供各种尺寸的图像,从而确保良好的用户体验。目前比较常见的做法是预先为一份图像存放多份具有不同尺寸的副本,在前端根据用户设备的 media 信息来请求特定的图像副本。

预先为一份图像存放多份具有不同尺寸副本的行为,经常是通过 阿里云函数计算 FC 以及阿里云对象存储 OSS 两大产品实现的。用户事先为 FC 中的函数设置对象存储触发器,当在存储桶中创建了新对象(即 putObject 行为,此处指在 OSS bucket 中存放了图像),通过 OSS 触发器来触发函数对刚刚存放的图像进行处理,处理成不同尺寸的副本后,将这些副本存放进 OSS bucket。

上述方法的特点是预先处理,如果要处理的图像尺寸较多,那么当图像数量非常大的时候,会占用很多存储空间。假设要处理的图像尺寸数目为 x、图像数量为 y、平均每份图像的大小为 z,那么要占用的存储空间为 x y z。

动态调整图像大小为了避免无用的图像占用存储空间,可以使用动态调整图像大小的方法。在 OSS bucket 中预先只为每份图像存放一个副本,当前端根据用户设备的 media 信息来请求特定尺寸图像副本时,再生成相关图像。

步骤:

  1. 用户通过浏览器请求 OSS bucket 中特定的图像资源,假设为 800 * 600 的 image.jpg。
  2. OSS bucket 中没有相关的资源,将该请求重定向至生成特定尺寸图像副本的 api 地址。
  3. 浏览器根据重定向规则去请求调整图像大小的 api 地址。
  4. 触发函数计算的函数来执行相关请求。
  5. 函数从 OSS bucket 中下载到原始图像 image.jpg,根据请求内容生成调整后的图像,上传至 OSS bucket 中。
  6. 将请求重定向至图像在 OSS bucket 中的位置。
  7. 浏览器根据重定向规则去 OSS bucket 中请求调整大小后的图像。

上述方法的特点是:

  1. 即时处理。
  2. 降低存储成本。
  3. 无需运维。

实践

1. 创建并配置 OSS

  • 在 OSS 控制台 中,创建一个新的 Bucket,读写权限选择公共读 (用于本教程示例,可之后更改)。
  • 在 Bucket 的基础设置中,设置镜像回源。
    • 回源类型:重定向
    • 回源条件:HTTP 状态码 404
    • 回源地址:选择添加前后缀,并在回源域名中填写一个已接入阿里云备案的自定义域名。
    • 重定向 Code:302

2. 创建 FC 函数

  • 下载 serverless-image-on-the-fly 项目到本地

git clone git@github.com:ChanDaoH/serverless-image-on-the-fly.git

  • 进入项目目录,执行 npm install
  • 填写 template.yml 文件中的相关内容:OSSREGION、OSSBUCKET_NAME、自定义域名
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:serverless-image:Type: 'Aliyun::Serverless::Service'Properties:Description: This is serverless-image servicePolicies:- AliyunOSSFullAccessimage-resize:Type: 'Aliyun::Serverless::Function'Properties:Handler: src/index.handlerRuntime: nodejs10Timeout: 60MemorySize: 512CodeUri: ./EnvironmentVariables:OSS_REGION: oss-cn-shanghai # oss region, such as oss-cn-shanghai、oss-cn-hangzhouOSS_BUCKET_NAME: images-xxx # oss bucket nameEvents:httpTrigger:Type: HTTPProperties:AuthType: ANONYMOUSMethods:- GET- POSTwilliam.functioncompute.com: # domain nameType: 'Aliyun::Serverless::CustomDomain'Properties:Protocol: HTTPRouteConfig:routes:'/*':ServiceName: serverless-imageFunctionName: image-resize
  • 部署函数至云端

    • 可以通过 Serverless VSCode 插件 部署
    • 可以通过 fun 部署

3. 测试动态调整图像

  • 在 OSS bucket 中上传一张图像,假设为 image.jpg

  • 此时请求 https://{OSS_BUCKET_NAME}.{OSS_REGION}.aliyuncs.com/{width}*{height}/image.jpg。会有如下效果:

    1. 下载到指定 width * height 大小的 image.jpg。
    2. OSS bucket 中有 width * height 命名的目录,该目录下有 image.jpg。

总结

我们通过 FC OSS 搭建了一个实时按需图像处理服务,该服务拥有以下特点:

  1. 即时处理
  2. 降低存储成本
  3. 无需运维

资料

  1. 函数计算 Function Compute
  2. Aliyun Serverless VSCode 插件
  3. Fun

“阿里巴巴云原生技术圈关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

利用 FC OSS 快速搭建 Serverless 实时按需图像处理服务相关推荐

  1. 快速搭建 Serverless 在线图片处理应用

    作者:倚贤 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数 ...

  2. 云上快速搭建Serverless AI实验室

    Serverless Kubernetes和ACK虚拟节点都已基于ECI提供GPU容器实例功能,让用户在云上低成本快速搭建serverless AI实验室,用户无需维护服务器和GPU基础运行环境,极大 ...

  3. 利用Github page快速搭建个人Blog

    利用Github page快速搭建个人Blog 文章目录 利用Github page快速搭建个人Blog 概述 搭建Github page 创建本地资源 修改模板内容 git远程部署 利用Netlif ...

  4. 【云存储】使用OSS快速搭建个人网盘教程(阿里云)

    使用OSS快速搭建个人网盘 一.基础概要 1. 主要的存储类型 1.1 块存储 1.2 文件存储 1.3 对象存储 2. 对象存储OSS 2.1 存储空间 2.2 地域 2.3 对象 2.4 读写权限 ...

  5. 流媒体视频服务:快速搭建一个简单的流媒体视频服务(一)

    快速搭建一个简单的流媒体视频服务 前言 系统组成 RTMP协议简介 Red5 概述 Red5 服务器搭建 前言 最近自己在研究有关于流媒体播放的技术,网上资料甚少.出于开源精神以及在查阅资料得到各位大 ...

  6. 快速搭建使用FRP内网穿透服务

    快速搭建使用FRP内网穿透服务 frp是一款流行的跨平台开源免费内网穿透工具,支持 Windows.macOS 与 Linux.你只需一台快速稳定的服务器即可愉快地进行内网穿透,实现家中设备公网直接访 ...

  7. 如何基于OSS和MPS,快速搭建音视频文件上传服务?

    背景 本文主要介绍如何基于OSS服务和MPS的上传SDK,快速搭建一个音视频文件上传服务. 优势 使用MPS的上传SDK上传音视频文件,具有以下优势: 增加文件列表管理功能. 增加STS Token ...

  8. 利用Android Studio快速搭建App

    大家好,我是烤鸭: 给大家分享一个简单的用Android Studio快速搭建app 工具: Android Studio 64位 专业版 插件: Datepicker Timepicker okht ...

  9. 如何基于OSS和MTS,快速搭建音视频文件上传服务?

    摘要: 背景 本文主要介绍如何基于OSS服务和MTS的上传SDK,快速搭建一个音视频文件上传服务. 优势 使用MTS的上传SDK上传音视频文件,具有以下优势: 增加文件列表管理功能. 增加STS To ...

最新文章

  1. 学会用taro封装一个组件
  2. Mysql语句与应用
  3. oracle11g数据库的卸载,完全卸载Oracle数据库11g
  4. html设置控件位置大小,下面那个代码段设置myButton控件显示在HTML页左上角100px的位置 - 问答库...
  5. Java之设计模式一
  6. 3.2 LSTM、GRU RNN概述
  7. 安装MYSql Windows7下MySQL5.5.20免安装版的配置
  8. 拓端tecdat|R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
  9. 海康录像机能用别的摄像头吗_海康威视录像机NVR如何添加其它品牌(大华)摄像头...
  10. 卡片层叠Banner
  11. Iptables详解七层过滤
  12. 简单点的java_简单点,学习的方式简单点,java零基础入门语法教学(简单篇)...
  13. 墨刀右键菜单被浏览器右键菜单遮挡导致墨刀右键菜单无法使用
  14. U深度U盘启动盘制作工具怎么用?U深度U盘启动盘制作工具使用教学
  15. Ubuntu安装软件时报错(报错:dpkg: 处理软件包 xxx (--configure)时出错: 依赖关系问题 - 仍未被配置)
  16. sort()排序函数
  17. 思科交换机如何配置Trunk?
  18. 无线通信中的小尺度衰落
  19. IEEE802.11信道PDP与频谱分布
  20. 【雷达】基于RD、RMA、CS三种算法实现雷达成像附matlab代码

热门文章

  1. 脚本类恶意程序分析技巧汇总
  2. 【PAT乙级题库】全套总结
  3. 1125 Chain the Ropes (25 分)【难度: 一般 / 贪心 哈夫曼树】
  4. Shell中常用的系统函数basename和dirname
  5. 3.1.4 内存的连续分配管理方式
  6. 第一章 Matlab的简单介绍
  7. Spring boot日志关系
  8. Freemarker使用
  9. 卧槽!面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?
  10. 【xmind】 使用 Java 生成思维导图