1 概述
Serverless让开发者能够以更高的灵活性和更低的成本构建现代应用程序。开发者无需配置和管理服务器等基础设施,可将全部精力投入核心业务。
函数服务作为Serverless架构中的核心计算组件,可应用于各类Serverless架构,主要包括两大类:Web、移动、IoT、AI等无服务器后端和数据处理系统后端。其中,Web、移动serverless后端的典型场景应用最为广泛,本文介绍如何使用函数服务+API网关构建疫情信息收集后端,主要包括问卷提交和问卷数据查看两个函数场景。
操作流程
本指南的操作流程分为如下4个步骤:
1、 创建数据库用于存储问卷结果
2、 创建并测试问卷提交函数
3、 创建API网关触发器,通过API验证函数执行
4、 创建并测试请求问卷数据函数
使用的云服务
本指南涉及到的云产品服务及用途如下:
序号 | 云产品 | 功能及用途 |
1 | 函数服务 | 创建函数,处理业务逻辑 |
2 | API网关 | 作为函数服务触发器,提供前端调用 |
3 | 云缓存Redis | 存储问卷结果 |
4 | 私有网络 | 用户创建函数和Redis的私有网络环境 |
2 操作指南
2.1 step1创建数据库存储问卷结果
2.1.1 前提准备
创建云缓存Redis和函数时,需要用到私有网络 和 子网 信息。
1 创建VPC
l 选择云服务->网络->私有网络,进入私有网络VPC列表页面。
l 在私有网络页面,选中华北-北京地域,单击“创建”按钮。
l 配置网络名称为survey的私有网络,CIRD默认即可。
l 单击“确定”按钮,完成子网创建。
2 创建子网
l 在私有网络页面,选择菜单中的子网,选中华北-北京地域,单击“创建”按钮
l 在私有网络survey下,配置名称为survey-subnet的子网即可。
l 单击“确定”按钮,完成子网创建。
2.1.2 创建Redis数据库
1.登录京东智联云控制台,选择云服务->数据库与缓存->云缓存Redis。
2.在云缓存Redis页面,选中华北-北京地域,单击“创建”按钮。
3.选择“按配置”方式,创建一个Redis实例,规格为:标准版4.0、4G标准版;网络选择刚才创建的私有网络和子网;部署方案选择主从跨可用区A、B;密码选择免密访问(为了您的数据库访问安全,生产环境建议设置访问密码,此处为演示示例选择免密访问)。
4.单击“立即购买”,即可在Redis控制台列表创建出此实例
5.单击实例名称,查看实例详情,在“访问信息”中获取redis实例的访问域名和端口号,在后面函数代码访问数据库时会用到。
2.2 step2:创建并测试提交问卷函数
2.2.1 创建函数用于提交问卷
函数功能:通过API提交用户问卷答案至redis存储
1. 登录京东智联云控制台,选择云服务->弹性计算->函数服务。
2. 在函数服务页面,选择右侧菜单中的“函数列表”,在华北-北京地域,单击“新建函数”按钮。
3.创建survey-submit函数
请求用户PIN,问卷版本version,用户答案submit,上传至数据库,将入口文件index.py与依赖库redis SDK打包上传至函数服务。
创建survey-submit函数第一步:函数代码。创建运行时为Python2.7,函数名称为,survey-submit的函数,函数入口默认index.handler,代码配置处选择代码包上传,并将函数入口文件index.py与京东云redis的SDK至于同一个文件夹中,在本地打包为.zip格式,在选择文件处上传。上传完成后,单击下一步。
此处,提交问卷答案逻辑的函数入口文件的index.py代码如下:
#coding=utf-8
import json
import redis
import sys
'''
上传问卷结果
'''
def handler(event,context):
if not bool(event):
result = {
'statusCode': 200,
'headers': {},
'body': "",
}
return result
sys.setdefaultencoding('utf8')
# get request data
body = event['detail']['body']
body = json.loads(body)
if type(body) == unicode:
body = json.loads(body)
pin = body.get('pin', "")
version = str(body.get('version', ""))
submit = body.get('submit', "")
print(pin)
print(version)
print(json.dumps(submit))
# action
r = redis.Redis(host='此处填入已创建redis实例的访问域名', port=6379, db=0)
old = r.hget('submit_' + version, pin)
if old != None :
data = {'code': 1, 'desc': 'user have submitted'}
data = json.dumps(data)
result = {
'statusCode': 200,
'headers': {},
'body': data,
}
return result
submit = json.dumps(submit)
r.hset('submit_' + version, pin, submit)
data = {'code': 0, 'desc': 'success'}
data = json.dumps(data)
result = {
'statusCode': 200,
'headers': {},
'body': data,
}
return result
4.创建survey-submit函数第二步:函数配置。默认函数执行内存和执行时间,单击高级配置,在私有网络和子网中选择刚才创建的私有网络和子网,确保与数据库redis实例所在的网络环境相同,单击下一步。
5.创建survey-submit函数第三步:触发方式。默认不创建触发器,单击完成,即可在函数列表控制台查看函数。
2.2.2 函数测试
1. 单击函数名称,进入函数详情,在右上角下拉菜单选择“配置测试事件”。
2.创建新的测试事件,模板选择API Gateway-event-template,事件名称test,将事件模板中“body”字符串替换为
"body": "{\"pin\": \"Jdcloud_0423\",\"version\": \"1\",\"submit\": [{\"option\": [\"A\"]}]}",
Body中将包含问卷提交内容:用户PIN、问卷版本version和问卷答案submit,单击完成测试事件创建。
3.函数测试:函数详情页面,右上方““选择测试事件””下拉菜单选择刚配置的“test”,单击测试,页面会弹出执行结果,在执行结果中,可查看函数返回及日志信息,验证函数测试成功。
2.3 step3创建API网关触发器,通过API调用函数执行
2.3.1 创建API
1. 登录京东智联云控制台,选择云服务->互联网中间件->API网关。
2. 在API网关页面,选择右侧菜单中的“开放API”—“API分组管理”,在华北-北京地域,单击“创建分组”按钮。
3.创建名称为submit的API分组,详情如下:
4.完成后直接单击“管理API”或从API分组列表中单击此API分组进入“API分组管理”,在“API列表”中选择“新建API”,创建名称为:submit,子路径为POST /submit的API,其他默认不变,完成API创建。
2.3.2 函数绑定API触发器
1.为survey-submit函数绑定刚创建API触发器,在函数详情页面,选择“触发器”选项,绑定刚创建的API为API网关触发器,详情如下:
2.创建完成后,可以在触发器列表看到已绑定的API触发器,由于API未发布,所以状态为已停止。
3. 单击触发器名称“submit”跳转至API网关—API分组管理-API列表页面,对此API进行发布。
4.将此API发布至测试/预发/线上环境,若未配置环境中API分组的默认后端,可先行配置为mock后端,完成。(API请求会先请求到API对应的后端,若无法请求到会请求API分组的默认后端)
5.API发布完成后,在函数触发器列表可查看触发器状态为“已开启”,根据测试URL可访问此API,触发函数执行。
2.3.3 接口工具测试API与函数
1.通过测试工具测试API接口和函数,请求与刚才控制台测试重复的用户pin,在response中返回重复提交。
2.请求一个新的用户pin,response返回成功,已将提交内容记录至redis中。
2.4 Step4:创建并测试请求问卷数据函数
函数功能:通过请求返回数据库中存储的问卷数据
2.4.1 创建函数
1. 与step2方法相同,在函数服务控制台创建一个新的函数。第一步函数代码:运行时为python2.7,函数名为query_1024_data,函数入口默认index.handler,代码配置处选择代码包上传,并将函数入口文件index.py与京东云redis的SDK至于同一个文件夹中,在本地打包为.zip格式,在选择文件处上传。上传完成后,单击下一步。
其中index.py函数如下:
#coding=utf-8
import json
import redis
'''
查询问卷结果
'''
def handler(event,context):
# action
r = redis.Redis(host='此处填入已创建redis实例的访问域名', port=6379, db=0)
result = r.hgetall('submit_2')
for key, value in result.items():
print(key, ':', json.loads(value))
2. 第二步函数配置,与survey-submit相同。
3. 第三部,默认不创建触发器,完成
2.4.2 函数测试
方法与2.2.2 函数测试相同,通过控制台测试可查看问卷结果
1. 创建一个空的测试事件;
2. 选择该测试事件进行控制台测试
3. 查看函数执行结果(问卷内容及格式都可以根据实际场景定义),如下:
3 结束
以上,完成function问卷后端的开发,下面就可以和前端页面开发联调了,实际使用中还可通过函数版本、别名功能方便管理线上函数迭代发布。