基于函数计算的智能小应用

Posted 百度开发者中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于函数计算的智能小应用相关的知识,希望对你有一定的参考价值。

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



点击这里阅读原文

以上是关于基于函数计算的智能小应用的主要内容,如果未能解决你的问题,请参考以下文章

ssm+vue+elementUI基于微信小程序的电动电动汽车车智能充电桩服务平台-计算机毕业设计

人工智能数学基础---定积分7:无界函数的反常积分计算

人工智能数学基础---定积分6:无穷限函数的反常积分计算

函数计算搭建小程序Web应用后端服务

基于Lambert函数的时滞系统稳定性研究

基于函数计算快速搭建Django Blog博客