前言
欢迎大家来到无服务器 (Serverless) 编程的阿里云 clouder lab 实验课参与学习
现在市场竞争激烈, 在对业务创新周期要求越来越短, 业务爆发越来越快的情况下, Severless 编程模式很好的满足了业务的快速搭建快速发展以及快速迭代的要求, 对于中小企业以及创业公司, 成本也是一个重要的考量用户开发 server 端服务, 常常面临开发效率, 运维成本高, 机器资源弹性伸缩等痛点, 而使用 Serverless 架构可以很好的解决上述问题下面是传统架构和 Serverless 架构的对比:
Item | Serverless | 传统方式搭建服务 |
---|---|---|
维护成本 | 维护成本低,无需管理服务器等基础设施,只需编写代码并上传,程序员从底层设备维护中解放出来,只考虑实际业务逻辑即可。 | 维护成本高,自行维护服务器,需要处理服务器宕机、服务器扩容等一系列底层琐碎的事情 |
可用性 | 可用性高,函数计算为用户准备弹性、可靠的计算资源,具有根据流量自动 scale 特性,对有明显波峰波谷的运用效果奇佳 | 服务器故障会对应用服务产生严重影响 |
费用 | 按需付费,只为实际使用的计算资源付费,代码未运行则不产生费用 | 需要支付服务器的费用,代码运行与否都要收费 |
为了让大家深刻体验 serverless 的优势, 本教程通过对几款云产品的实际上手操作, 来与大家分享如何通过函数计算粘合其他云产品技术来快速搭建门店智能监控视频分析运用
30 分钟快速搭建门店智能监控视频分析运用架构图
日志中有图片的数据信息, 通过触发器推送到函数计算
函数计算解析出日志中的图片数据, 将图片上传到 oss
函数计算调用 IMM 服务, 获取上一步解析出来的图片的人脸以及分组信息
函数计算将上一步的人脸以及分组信息存储到 OTS
用户通过 api 网关调用函数计算, 函数计算从 OTS 读取信息, 并将处理后的信息返回给用户
具体步骤
1. 获取云账号
1.1 每位观众入场都会得到一个云账户
1.2 获得账号 ID 和 Accesskeys
1.2.1 进入账号管理复制并记录对应的账号 ID
1.2.2 进入 Access Key 管理界面, 记录您的 AccessKey ID 及 Secret
1.3 下载文章最后的 code 附件
注意: 本教程所有的服务均在华东 2(上海)region 进行, 下面每一步创建的阿里云资源的名字 (阿里云 AccessKeyIdAccessKeySecret,OTS 的 instance 名字和表格名字, OSS 的 bucket 名字, IMM 的 project 名字和 FaceSetId) 都需要记录下来, 后面代码会用到
2. 开通表格存储并创建对应的 project 和 table
2.1. 登录阿里云官网 - 表格存储 , 并点击服务开通
2.2. 创建表格存储实例
2.2.1 登陆表格存储控制台
2.2.2 在控制台上创建实例, 在华东 2 创建实例(比如名字叫 szworkshop, 注意: 实例的整个区域 Region 级别)
2.2.3 创建两个 table, 比如名字叫 face_detail 和 face_cache
也可以利用 code 附件的脚本 create_tbl.py, 修改代码中的 ak,
python create_tbl.py
实现创建 table face_detail 和 face_cache
3. 开通对象存储 oss 服务
3.1. 登录阿里云官网 - 对象存储 , 并点击立即开通
3.2. 进入对象存储 - 控制台 , 在华东 2 创建一个公共读的 bucket, 如下图:
4. 开通日志服务
4.1. 进入日志服务, 点击立即购买按钮
4.2. 创建 log project szworkshop 和 logstore (szworkshop 下面有 fc-log, etl-trigger-log, camera1, camera2, camera3, camera4)
5. 开通智能媒体管理
5.1 进入智能媒体管理, 点击立即开通按钮
5.2 进入智能媒体管理控制台, 创建一个 project szworkshop
5.3 在 project szworkshop 下面创建 FaceSet
利用 code 附件的脚本 imm_op.py, 修改对应的 ak 和 imm project 值
python imm_op.py CFS
就会成功创建一个 FaceSet, 记住返回值中的 FaceSetId, 如下面的
- FACE-0b1fe58b-58b5-44a5-9492-ea6d72918b83
- python imm_op.py CFS
- {u'Status': u'Running', u'Photos': 0, u'RequestId': u'7BF48069-07D5-4675-8BF6-3EB8EE23F4C5', u'ModifyTime': u'2018-03-20 20:29:43.021911969 +0800 CST', u'SetId': u'FACE-0b1fe58b-58b5-44a5-9492-ea6d72918b83', u'CreateTime': u'2018-03-20 20:29:43.021911969 +0800 CST'}
6. 开通 API 网关
6.1 进入 API 网关产品页, 点击立即开通
7. 开通函数计算
7.1. 新建函数计算 service 服务
7.1.1 进入函数服务管理控制台
7.1.2 创建 service, 选择华东 2, 步骤如下图中的 1,2,3,4; 比如创建名叫 ls-workshop 的 service(名字自定义)
在上图中点开高级配置, 配置日志项目和日志仓库 (这个之前已经创建好了, 也可以现在创建), 其中第 3 步的同意授权(授权函数具有访问 OTS,OSS,SLS,IMM 的权利) 会跳转到如下页面:
点击同意授权:
点击确定:
7.2. 在上一步创建的 service 服务下创建函数
7.2.1 创建函数 log_etl, 具体操作如下面截图所示:
选择空白模板, runtime 为 python3
点击本地上传, 上传附件中的 log_etl.zip, 上传成功后, 然后点击下一步
创建成功后如图所示:
7.2.2 给函数 log_etl 创建 SLS trigger
一个函数可以对应多个触发器, 这里多个 logstore 触发同一个函数
具体详情
触发器名称: 触发器的名称只能包含字母, 数字下划线和中划线, 不能以数字中划线开头, 且长度范围为 1~256 字节
Project 名称: 日志服务 Project 名称
Logstore 名称: 日志服务 Logstore 名称 (数据源) 本触发器会定时从该 Logstore 订阅数据到函数服务进行自定义加工, 该参数在 ETL Job 创建后不允许修改
触发器日志: 日志服务会定时触发函数服务的的函数执行, 在触发过程中发生的异常函数执行统计信息会记录到该 Logstore, 您可以为这个 Logstore 创建索引以备查看
触发间隔: 日志服务触发函数运行的间隔, 定义日志服务触发函数执行的间隔, 例如每 60 秒将 logstore 的每个 shard 最近 60 秒数据位置读出作为函数 event 调用函数执行, 在函数内有用户逻辑读取 shard 数据做计算如果 logstore 的 shard 流量较大(超过 1MB/s 或者更高), 建议缩短函数的触发间隔, 使得每次函数运行所处理的数据量是合理大小
重试次数: 日志服务根据触发间隔每次触发函数执行时, 如果遇到错误(例如权限不足网络失败函数执行异常返回等), 该参数定义本次触发所允许的最大重试次数对于本次触发, 如果超过最大重试次数仍无法成功的, 需要等到下一次触发间隔到来时, 由日志服务再次触发函数执行重试对业务造成的影响, 因具体的函数代码实现逻辑而异
函数配置: 日志服务将该配置内容作为函数 event 一部分传入函数, 如何使用该函数由函数自定义逻辑决定每一种函数实现所要求的函数配置可能是不同的, 绝大部分默认提供的函数模板也需要参考说明填写您的参数默认不传入任何参数时请填写:{}
7.2.3 设置函数的 event 和调试
函数 log_etl 是日志触发调用的, 日志传递给函数的 event 的格式具体详情, 一个例子如下:
- {
- "source": {
- "endpoint": "http://cn-shanghai-intranet.log.aliyuncs.com",
- "projectName": "fc-1584293594287572",
- "logstoreName": "demo",
- "shardId": 0,
- "beginCursor": "MTUwNTM5MDI3NTY1ODcwNzU2Ng==",
- "endCursor": "MTUwNTM5MDI3NTY1ODcwNzU2OA=="
- },
- "parameter": {
- ...
- },
- "jobName": "fedad35f51a2a97b466da57fd71f315f539d2234",
- "taskId": "9bc06c96-e364-4f41-85eb-b6e579214ae4",
- "cursorTime": 1511429883
- }
修改代码中对应的配置值:
7.2.4 创建函数 get_show_info, 具体操作如 6.2.1 所示
上传代码 get_show_info.zip, 创建函数 get_show_info, 截图如下:
创建成功后, 也需要修改下代码中对应的配置的值
7.3 给函数 get_show_info 配置 api 网关
按照下面的截图操作进行, 如果想了解更多 api 网关结合函数计算具体详情可以参考以函数计算作为 API 网关后端服务
7.3.1 创建 api 分组
7.3.2 在 api 分组内创建 api
填写 api 网关的请求 path, 后面对
二级域名 / 请求路径
的 http 请求就是对函数的访问
填写 api 对应的函数信息
填写 api 网关的返回值示例
- {
- "isBase64Encoded":true|false,
- "statusCode":httpStatusCode,
- "headers":{response headers},
- "body":"..."
- }
7.3.3 对 api 进行调试和发布
7.3.3.1 对 api 进行调试
7.3.3.2 对 api 进行发布
验证发布是否成功可以用如下命令(修改成自己的二级域名 / 请求路径):
curl -v "http://972ea82cf5334ee8adc7e318efa45455-cn-shanghai.alicloudapi.com/get_show_info"
7.3.4 将 6.3.3 获得的 api 网关的 url
本教程中是
http://972ea82cf5334ee8adc7e318efa45455-cn-shanghai.alicloudapi.com/get_show_info
)替换掉前端展示页面中的 url, 之后打开本地页面, 就可以愉快地看监控详情了
总结
利用函数计算可以快速搭建 serverless 运用, 结合 oss,ots,imm 和 api 网关可以丰富 server 的功能, 免服务器, 免运维, 成本低, 不用担心流量, 只需要函数就可以实现, 你值的拥有!
来源: https://yq.aliyun.com/articles/564521