百度云智峰会Workshop技术干货第4弹 ——基于函数计算的智能小应用
2019.09.11 23:27浏览量:5235简介:8月29日下午,在热烈的气氛中,2019百度云智峰会在北京顺利举办。活动现场,百度开发者中心联手百度云智学院,为开发者及学生们,提供了展示自己的舞台,输出百度沉
8月29日下午,在热烈的气氛中,2019百度云智峰会在北京顺利举办。活动现场,百度开发者中心联手百度教育合作与共建,为开发者及学生们,提供了展示自己的舞台,输出百度沉淀的优质技术。
为了帮助大家更好地理解Workshop中亮相的6大技术,我们特将技术内容进行梳理总结,出品6篇技术干货文章,在近期于百度开发者中心公众号(ID:baidudev)上逐一分享给大家,请大家持续关注。以下是第四期内容《基于函数计算的智能小应用》。
函数计算简介
函数计算是什么?
函数计算的服务器可以看作一个透明的接口,当用户配置好业务逻辑后,所要做的唯一一件事就是——发送事件。函数计算是事件驱动、弹性伸缩的,可以将服务器当做远程过程调用看待。在服务器端除了用户的业务代码,还会提供存储服务、消息服务、日志服务等基础开发服务,也会默认提供日志、监控、弹性伸缩、高可用等通用特性。
函数计算的起源
虽然函数计算是个比较新的概念,但其实多年前的流行技术就有了它的雏形。我们来了解一下函数计算一路是怎么诞生的。
CGI(Common Gateway Interface)是上世纪九十年代开始流行的技术。具体实现是在一个机器上部署Web服务器,当请求到来时根据参数来调用本机部署好的应用程序,然后将程序输出的结果返回给用户。这种服务其实就很类似与函数计算,以事件驱动。但它有个致命的缺陷,每处理一个请求都得启动新进程,极其消耗资源。
为了避免启动新进程,开发者后续创造了大量技术来改进CGI,其中最主流的两种技术就是FastCGI和Java EE。
FastCGI将应用程序作为常驻进程运行,Web服务器和应用程序使用网络连接来通信。
Java EE则在另外一种奇特的路上越走越远,它将Web服务器和应用程序打包在一起,作为同一个进程启动,这样两者之间使用线程间通信即可。
随着互联网时代的到来,自建机房对小公司来说成为了性价比不高的选择,原因之一就是机器资源需求在各个时间段不一致,可能造成巨大浪费。这时就出现了IaaS服务,它解决硬件资源的运维和供给问题。以虚拟机维度计费,提供机器的扩容和缩容功能。这样技术就从自建机房进入了云时代。
尽管IaaS解决了机器问题,但仍不是真正的按需收费,因为还有个致命的问题需要解决——即使未接收到任何请求,Web服务器和应用程序也仍然在运行且占用着资源的。为了解决这个问题,函数计算FaaS就诞生了。它吸收了过去技术的优点,费用与请求数相关,而用户只关心业务逻辑,基本无需关心技术逻辑(比如监控,性能,弹性,高可用,日志追踪等)。
函数计算与传统架构对比
我们来对比一下传统架构与函数计算的各方面特性,看看函数计算到底解决了哪些痛点。这里的传统架构包括自建机房和IaaS服务。
函数计算的四大优势
1、简单易用。无需管理服务器和环境,只需编写代码。FaaS根据请求量自动横向扩缩。
2、开发运行高效。上传代码后即可自动部署,每个函数单独部署、运行、伸缩。执行的额外延迟是毫秒级。
3、 稳定可靠。云函数使用事件触发,单机故障不影响函数执行。
4、降低成本。业务无需常驻,未执行时不产生任何费用,按请求数和运行时间收费。
百度函数计算CFC实验
在了解函数计算后,我们来试着用百度的函数计算服务CFC做三个小实验,进一步学习函数计算的使用方法。
文件服务器
需求
第一个实验比较简单,使用CFC实现一个HTTP服务器提供文件访问功能,主要需求如下:
- 通过浏览器能访问自定义的图片或书籍
- 能用手机朗读书籍
架构
因为CFC是事件驱动的,只接收事件格式的请求,所以任何外部请求都会被特定的“触发器”转换成事件。这里从浏览器发送的HTTP请求会通过HTTP触发器到达CFC服务器。在服务器的本地环境中存储着需要访问的文件,在一个名为“assets”的目录下存储着一张风景照landscape.jpg和一本书poetry.txt。
实验步骤
创建函数
1、登陆百度智能云平台控制台
2、选择“产品服务>云函数计算 CFC”,进入“函数列表”页面,点击从模板创建函数,进入从模板创建函数界面。
3、点击后,界面上会显示目前所有的模板,选择“simple-file-server”模板,点击下面的“创建”按钮。
4、在弹框中输入函数名称,点击确定。
5、增加HTTP触发器,选择左侧“触发器”选项卡,点击“新增触发器”,在弹出的窗口中,“触发器”选择“HTTP触发器”,“URL路径”选择“/file/{path+}”,“HTTP方法”可以只选“GET”,“身份验证”选择“不验证”。
6、查看程序包的结构,在“函数代码”界面点击“点击下载完整 ZIP 程序包”,然后解压,可以看到包中的asset目录下有一个图片和一个txt文件。如果想在此服务中访问其他文件,可以将其放入asset目录下,再次打包成zip文件,点击“上传函数.ZIP包”。
测试函数
1、在函数列表页点击函数名最右侧的“测试“按钮,或者在函数基本信息页和函数代码页面,都可找到“测试“按钮,进入测试弹窗。
2、输入测试的事件,选择任意模板,输入以下json字符串:
{
"resource": "/test/{path+}",
"path": "/test/poetry.txt",
"httpMethod": "GET",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Connection": "close",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36",
"X-Bce-Request-Id": "f6cb833e-f818-4b80-b30c-fff437e69886"
},
"queryStringParameters": {
"a": "111"
},
"pathParameters": {
"path": "poetry.txt"
},
"requestContext": {
"stage": "cfc",
"requestId": "f6cb833e-f818-4b80-b30c-fff437e69886",
"resourcePath": "/test/{path+}",
"httpMethod": "GET",
"apiId": "7grmt1xfky5jf"
},
"body": "",
"isBase64Encoded": false
}
3、点击“执行”按钮,即可得到返回。
解释一下测试数据中的要点字段。pathParameters中有一个path变量,值为poetry.txt,这里指定了访问的文件名。可以在函数代码页面看到相关实现,var filename = event.pathParameters.path;这一行提取到事件中的文件名,var filepath = __dirname + "/assets/" + filename;将文件定位在“assets”目录下。
运行测试后可以看到成功的字样,而且结果中输出了poetry.txt中的诗。
使用函数的文件服务
1、查找函数对应的HTTP地址,在触发器界面找到“URL路径”,其中的“{path+}”在此函数就表示自定义的文件名。
2、访问文件服务中的图片,在浏览器中输入"{url}/landscape.jpg",url是上一步查找到的地址。
3、访问文件服务中的诗文件,在在浏览器中输入"{url}/poetry.txt"。
使用Siri朗读诗
1、新建捷径,在iPhone上打开捷径app,点击右上的加号新增捷径,进入捷径的配置。
2、指定诗的地址,增加“URL”,内容填入“{url}/poetry.txt”。
3、读取诗的内容,增加“获取URL内容”,“高级”的“方法”中选择“GET”。
4、让手机朗读诗,增加“朗读文本”。
5、测试功能,点击“完成”,然后点击此捷径。
6、绑定个性化短语,点击捷径右上方的设置图标,再点击“添加到Siri”,录制短语与捷径绑定。
7、使用Siri读诗,唤醒Siri,说出上一步的短语。
猜数字游戏
需求
这个实验复杂一些,需求如下:
-随机生成一个正整数
-用户说出数字
*如果猜错,告知数字过大或者过小
*如果猜对,游戏结束,重新开一局
架构
看到需求中需要用户“说出”数字,你应该能想到这里需要一个外部服务来提供语音识别功能了,所以我们引入了小度音箱。小度音箱背后提供的DuerOS平台服务可以接入CFC,即使你没有音箱设备也无需担心,我们可以使用DuerOS平台的模拟测试功能。在这个实验中,小度音箱将用户说出的语音发送到DuerOS平台,后续的数据经过一种新的触发器——DuerOS触发器转换为CFC能识别的事件,最终发送给函数。
流程
来看看CFC的函数需要实现的游戏流程。
游戏开始时需要生成随机数,存储到DuerOS平台的session接口(可以看作Web服务的session功能,提供临时存储功能)中。在接收到数字后,比较该数字与随机数的大小,不相等则让小度音箱报出对应的提示语,否则游戏接收,重新开局。
实验步骤
创建函数
1、登陆百度智能云平台控制台
2、选择“产品服务>云函数计算 CFC”,进入“函数列表”页面,点击从模板创建函数,进入从模板创建函数界面。
3、点击后,界面上会显示目前所有的模板,选择“dueros-bot-guess”模板,点击下面的“创建”按钮。
4、在弹框中输入函数名称,点击确定。
5、增加DuerOS触发器,在函数配置界面的“触发器”下点击“新增触发器”,选择“DuerOS触发器”,点击“确定”。
测试创建的函数
1、在函数列表页点击函数名最右侧的“测试“按钮,或者在函数基本信息页和函数代码页面,都可找到“测试“按钮,进入测试弹窗。
2、输入测试的事件,选择任意模板,输入以下json字符串:
{
"version": "2.0",
"session": {
"new": false,
"sessionId": "{{session_id}}",
"attributes": {}
},
"context": {
"System": {
"application": {
"applicationId": "{{application_id}}"
}
}
},
"request": {
"type": "IntentRequest",
"requestId": "{{request_id}}",
"timestamp": "1499169543",
"query": {
"type": "TEXT",
"original": "34567"
},
"intents": [
{
"name": "guess",
"confirmationStatus": "NONE",
"slots": {
"number": {
"name": "number",
"value": "75301",
"values": [
"20000",
"20000",
"50000",
"75301"
]
}
}
}
]
}
}
3、点击“执行”按钮,即可得到返回。
解释一下测试数据中的几个与DuerOS平台相关的重要字段。intents代表“意图”,可以设置多个,这里只配置了一个名为guess的意图。在这个意图中有一个slots字段代表“槽位”,其中有个number槽位,它的value是75301。“意图”和“槽位”的概念都可以在DuerOS平台看到解释,接下来创建技能过程中会使用到这两个概念。
增加DuerOS技能,并绑定CFC函数
1、新建DuerOS技能,在DuerOS技能平台选择创建小技能,选择“自定义>从头开始”,在页面下方填入“技能名称”、“调用名称”、“应用场景”、“技能付费”,点击确定。
2、创建意图,在DuerOS技能平台中,找到上一步创建的技能,点击编辑,然后选择“创建意图”进入创建意图界面。
3、意图信息填写,按照要求填写。为了与CFC的函数匹配,“意图标识名”设置为“guess”。
4、常用表达,您可以根据创建函数的用处,输入运行函数的常用表达语句。“常用表达”中输入任意整数(比如20000)回车,此时可以看到“对应词典”自动设为sys.number,将此表达的“槽位标识”修改为“number”(与CFC函数对应)。最后点击页面最下方的“保存”。
5、查询函数BRN,在CFC“函数列表”页面点击想要获得BRN的函数名称,进入函数详情可以查看函数的BRN。
6、与CFC函数绑定,在DuerOS技能平台点击“配置服务”,在“服务部署”中选择“百度云CFC”,在“BRN”中填入上一步获取的函数BRN,“是否回调”列,选择不执行回调,点击“保存”。
测试DuerOS技能
1、使用百度账号登录DuerOS技能平台
2、选择需要测试的自定义技能名称,进入技能详情页面,在左侧导航栏中选择“测试验证>模拟测试”,进入测试页面。
3、在输入框中输入“打开+调用名称”打开事件,然后输入想要猜的数字,开始游戏。
图片自动添加水印服务
需求
这是一个常见的Web服务需求,先来实现简单的文字水印,需求如下:
- 用户自定义文字
- 上传图片时将文字水印添加到图片
架构
为了存储图片,在实验中引入了新的外部服务——对象存储BOS,这是百度云提供的存储服务,与CFC对接极其便利。另外在这个实验中也引入了新的BOS触发器。BOS中可以设置规则,在图片上传后如果满足条件则自动触发并将消息发送给CFC,然后经过BOS触发器将事件传入函数中。
实验步骤
创建函数
1、登陆百度智能云平台控制台
2、选择“产品服务>云函数计算 CFC”,进入“函数列表”页面,点击从模板创建函数,进入从模板创建函数界面。
3、点击后,界面上会显示目前所有的模板,选择“bos-add-watermark”模板,点击下面的“创建”按钮。
4、在弹框中输入函数名称,点击确定。
创建BOS Bucket,并绑定CFC函数
1、登陆百度智能云平台控制台,选择“产品服务>对象存储 BOS”。
2、创建Bucket,点击“存储管理”旁边的加号,填入“Bucket”名称,“所属地域”选择“华北-北京”,然后点击“确定”。
3、BOS Bucket绑定CFC函数,在“全局概览”中选择创建好的Bucket,点击“事件通知”,再点击“创建规则”。在“创建新规则”窗口中,填入“名称”,“监测事件”选择“PutObject”(上传文件),“覆盖资源”选择“前后缀”,并在前缀中填入“image”,“触发应用”中点击“添加>点击选择应用”,“触发应用方式”选择“函数计算CFC”,“函数列表”选择刚刚创建的CFC函数,点击“确认”。最后点击“确定”,完成新规则的创建。
你可能注意到在这个实验中到此为止都没有创建过触发器,现在回到CFC函数的触发器再看看,可以发现已经有一个BOS触发器创建好了,并且属性与BOS中的规则一致。因为BOS的配置和CFC是联动,在一方设置好以后另一方会同步配置。
测试添加水印功能
1、上传图片,进入BOS中创建好的Bucket,选择“文件列表”,点击“上传文件”,选择一张本地的png格式文件,点击“开始上传”。
2、查看结果,进入Bucket,选择“文件列表”,可以看到多了一个“wartermarked-images”目录,点击进入,目录里有与上一步同名的图片文件,再点击图片,可以看到图片上有水印。
3、自定义水印文字内容,进入CFC函数代码,有一处水印文字信息text = "Hello World!",修改此值再上传图片即可生成新的水印文字。
4、自定义水印文字字体,下载程序包并解压,可以看到里面有一个名为“HELVETI1-1.ttf”的字体,另外代码中有一句font_path = './HELVETI1-1.ttf',文件和代码可以替换为其它true type字体。
5、自定义水印的位置、颜色、透明度等属性,代码使用Python的pillow库,可以查看pillow官方文档,自行修改代码。
相信大家对CFC实验已经有了初步的了解和认识,后续我们会持续发布2篇技术文章,请持续关注哦。
发表评论
登录后可评论,请前往 登录 或 注册