百度云智峰会Workshop技术干货第4弹 ——基于函数计算的智能小应用

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篇技术文章,请持续关注哦。

收藏 评论(2)
分享到:
共2条回复 最后由二号月台zd 回复于2019-09-06 20:46
#2 筱Myselfkv 回复于2019-09-06

0