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

Wesley13
• 阅读 624

前  言

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

Serverless****优势

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

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

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

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

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

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

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

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

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

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

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

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

1. 准备工作

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

2. 构建后端程序

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

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

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

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

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

3. 搭建前端页面

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

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

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

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

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

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

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

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

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

准备工****作

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

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

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

创建函数

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

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

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

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

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

配置函数

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

2. 保存配置

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

测试函数

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

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

更多精彩:

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这