文档章节

5分钟Serverless实践:构建无服务器的图片分类系统

中间件小哥
 中间件小哥
发布于 2018/09/14 11:19
字数 1700
阅读 17
收藏 2

前  言

在过去“5分钟Serverless实践”系列文章中,我们介绍了如何构建无服务器API和Web应用,从本质上来说,它们都属于基于APIG触发器对外提供一个无服务器API的场景。现在本文将介绍一种新的设计模式:基于事件的实时数据处理。为了更形象地描述,我们以图片分类为例,先介绍通过APIG触发器如何构建一个图片分类的Web应用,再介绍通过OBS触发器如何构造一个实时的图片分类系统。

 

Serverless优势

相比于传统的架构,无服务器架构具有如下优点:

1. 无需关注任何服务器,只需关注核心业务逻辑,提高开发和运维效率;

2.  事件触发,灵活扩展;

3. 函数运行随业务量弹性伸缩,按需付费,执行才计费,对于负载波峰波谷非常明显的场景可以减少大量成本;

4. 通过简单的配置即可连通函数工作流和其它各云服务,甚至云服务和云服务;

 

构建无服务器的图片分类Web应用

像以往的文章介绍的那样,serverless很擅长构建一个Web应用,如下图,该系统会将用户上传的图片进行分类,并打上类别标签。

demo演示1.gif

 

 

我们可以通过函数工作流服务来快速构建这个系统,并且完全无需关注服务器,且弹性伸缩运行、按需计费,如图:

架构图1.PNG

 

 

 

创建函数,在函数中调用华为云图片分析服务的图片标签接口,给图片打标签分类。再为该函数配置一个APIG触发器,这样便可以对外提供一个图片分类的API,最后部署前端页面到OBS,托管为静态网站,从而构建出一个完整的图片分类的无服务器Web应用。页面调用API,他会自动触发函数执行,而开发者编写的函数只需实现接收到图片之后如何处理图片的逻辑即可,最后将结果返回给页面。

 

接下来,我们将介绍如何完整地将此无服务器Web应用构建出来。

 

1. 准备工作

进入华为云图片检测服务,申请开通图片检测服务的图片标签功能,成功申请后便可以调用图片标签接口了。

 

2. 构建后端程序

进入函数工作流服务,选择模板“图片打标签Web后端”,创建函数。函数创建完成之后,为其配置具有IAM访问权限的委托,因为本函数代码中获取用户的ak、sk需要拥有访问IAM的权限。

案例一配置.gif

 

 

创建成功后,API的URL可以在函数详情页面的“触发器”栏看到:

案例一trigger_url.PNG

 

 

 

至此,我们就成功地构建了一个无服务器的图片分类API。

 

3. 搭建前端页面

为了更方便地搭建前端页面,我们提供了对应的函数模板实现快速构建前端页面。选择模板“图片打标签Web前端”,创建函数,其中自定义数据REST_API中设置上一步创建的API URL,创建完成后,函数详情页面的“触发器”栏中的URL就是页面的浏览器访问地址。

 

至此,我们就成功地构建了一个无服务器的图片分类Web应用。接下来,我们将介绍另一种场景。

 

构建事件触发的实时图片分类系统

本文接下来将具体介绍事件触发的实时数据处理场景,考虑下面场景,用户上传图片到OBS桶中,需要自动执行图片分类,并按照类别转储到另一个桶的不同目录下。比如下面这个例子,上传一张企鹅图片到一个桶,图片就会自动转储到另一个桶对应的penguins、seabird、bird目录下。

案例二demo.gif

 

 

 

我们可以通过函数工作流服务来快速构建这个系统,并且完全无需关注服务器,且弹性伸缩运行、按需计费,如图:

架构图2.PNG

 

 

 

创建函数,在函数中调用华为云图片分析服务的图片标签接口,给图片打标签分类。再为该函数配置一个OBS触发器,监控桶的POST事件,当向该桶上传一个文件时,便会自动触发函数执行,从而实现一个基于事件触发的无服务器系统。用户向桶中上传一张图片,它会自动触发函数执行,而开发者编写的函数只需实现从桶中下载图片并分类转储的逻辑即可。

 

接下来,我们将介绍如何完整地将此事件触发的图片分类系统构建出来。

 

 

准备工

1. 申请开通图像识别服务“图像标签”功能

案例二build_1.gif

 

 

2. 进入对象存储服务(OBS)服务,创建两个桶,一个用于接收待分类的图片(source),一个用于存储分类后的图片(result),并将桶的“桶策略”设为公共读写。

 

创建函数

1. 进入函数工作流服务创建函数页面,选择“图片实时分类(按图片类型)”函数模板,该模板已为您提供本案例的代码。 

2. 设置环境变量result_bucket为存储分类后图片的桶的名称(result)

3. 配置OBS触发器,桶选择接受待分类图片的桶(source),事件选择post。当向桶中上传新图片时,会触发函数执行。

4. 点击创建,创建函数和触发器。

案例二build_2.gif

 

 

配置函数

1. 进入函数详情页面,进入“配置”标签,给函数设置一个具有访问IAM和OBS权限的委托,使函数能够获取到用户的AK、SK,并访问OBS桶资源。

2. 保存配置

案例二build_3.gif

 

 

测试函数

1. 向接收待分类图片的桶(source)中上传一张图片

2. 查看存储分类结果的桶(result)中的文件,会发现图片存储到了对应类别的目录下。

 

更多精彩:

logo-paper.png

函数工作流,0负担享受编程的乐趣

© 著作权归作者所有

中间件小哥
粉丝 9
博文 55
码字总数 77366
作品 0
深圳
私信 提问
5分钟Serverless实践 | 构建无服务器图片鉴黄Web应用

Serverless是什么 Serverless中文译为“无服务器”,最早可以追溯到2012年Ken Fromm发表的《Why The Future Of Software And Apps Is Serverless》,他描述了一种场景,从用户自己维护的物理...

中间件小哥
2018/08/13
33
0
5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统

前言 在上一篇“5分钟Serverless实践”系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例,介绍如何构建一个无服...

中间件小哥
2018/08/22
100
0
官宣之后-Express和Functiongraph也公布恋情了

Express APP 作为一个Node.js开发者,相信大家都可能会使用Express框架,无论是构建后端服务,或是搭建一个前端的开发态服务器,Express都是一个很流行的选择。构建Express是极为容易的,添加...

中间件小哥
2018/10/25
21
0
LC3视点:从阿里云函数计算看Serverless的演进与思考

云计算之所以能够成为DT时代颠覆性力量,是因为其本质是打破传统架构模式,降低成本并简化体系结构,用全新的思维更好的满足了用户需求。而无服务器计算(Serverless Computing)作为这个巨大...

scorpion
2018/07/10
0
0
从阿里云函数计算看Serverless的演进与思考

云计算之所以能够成为DT时代颠覆性力量,是因为其本质是打破传统架构模式,降低成本并简化体系结构,用全新的思维更好的满足了用户需求。而无服务器计算(Serverless Computing)作为这个巨大...

阿里云云栖社区
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

75、GridFS

GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用Mongo DB存储数据,使用FGridFS可以快速集成开发。 工作原理: 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个...

lianbang_W
41分钟前
4
0
js bind 绑定this指向

本文转载于:专业的前端网站➱js bind 绑定this指向 1、示例代码 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <title>bind函数绑定this指向......

前端老手
44分钟前
4
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
51分钟前
4
0
深入vue-公司分享ppt

组件注册 全局注册 注册组件,传入一个扩展过的构造器 Vue.component('my-component', Vue.extend({/*...*/})) 注册组件,传入一个选项对象(自动调用Vue.extend) Vue.component('my-comp...

莫西摩西
52分钟前
4
0
gitlab重置管理员密码

登录gitlab服务器 [root@localhost bin]# sudo gitlab-rails console productionLoading production environment (Rails 5.2.3)irb(main):001:0> u = User.where(email: 'admin@example.co......

King华仔o0
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部