一、何为云函数
MemFire Cloud云函数,是运行在云端(服务器端)的、无关联、可重复使用的函数代码。使用MemFire Cloud云函数,您无需购买、管理服务器等基础设施,只需编写和上传代码。MemFire Cloud云函数为您准备好了计算资源,可以弹性、可靠的运行任务,从而可轻松构建任何类型的应用和服务。
二、MemFire Cloud 的优势
- 免费:MemFire Cloud提供永久免费的套餐,开发者可以无成本使用云函数服务。
- 国产:MemFire Cloud 是国产云函数平台,服务器位于国内,访问速度快,延迟低。
- 稳定:MemFire Cloud 采用分布式架构,保证云函数的高可用性和稳定性。
- 易用:MemFire Cloud 提供简洁明了的控制台和丰富的文档,帮助开发者快速上手。
三、应用场景
1、数据ETL处理
一些数据量比较大、运算成本比较高、不适合在客户端进行运算,比如数据统计、周期性/计划性的处理庞大的数据量工作。例如:统计每天有多少用户查看了商品,平均停留时长;
2、编写服务端逻辑
开发人员利用云函数来处理一些不适合将判断逻辑写在客户端的事件,以保证程序的安全性,如抽奖功能。
3、调用第三方API
在云函数中调用第三方 API ,接入第三方服务,比如调用微信支付接口。
四、代码开发
下面介绍使用云函数编写代码的相关基础概念,包括请求处理函数、函数实例生命周期回调方法等。
1、请求处理程序
MemFire Cloud云函数的请求处理程序,是函数代码中处理请求的方法。当您的云函数被调用时,会运行您提供的Handler方法处理请求。对于Node.js语言的云函数而言,函数入口为 [文件名].[函数名],默认为index.handler;
您可以使用HTTP请求处理程序更方便地处理HTTP请求。当调用函数时,MemFire Cloud云函数使用您提供的执行方法来处理HTTP请求。
HTTP Handler签名
Node.js的HTTP Handler的签名如下。您只需实现一个函数,就能响应HTTP请求。
exports.handler = (req, resp, context) => {
console.log("receive body: ", req.body.toString());
resp.setHeader("Content-Type", "text/plain");
resp.send('<h1>Hello, world!</h1>');
}
示例解析如下:
- handler:HTTP Handler名称。
- req:HTTP请求结构体。
- resp:HTTP返回结构体。
- context:上下文信息。
HTTP请求结构体
字段 | 类型 | 描述 |
headers | Object | 存放来自HTTP客户端的键值对。 |
path | String | 表示HTTP路径。 |
queries | Object | 存放来自HTTP路径中的查询部分的键值对,值的类型可以为字符串或数组。 |
method | String | 表示HTTP方法。 |
clientIP | String | 客户端的IP地址。 |
url | String | 请求的地址。 |
说明 Headers键值对中的key
中包含以下字段或以x-fc-
开头的key
均会被忽略,因此,不支持自定义。
- connection
- keep-alive
HTTP响应结构体
字段 | 类型 | 描述 |
response.setStatusCode(statusCode) | interger | 设置状态码 |
response.setHeader(headerKey, headerValue) | String,String | 设置响应头 |
response.deleteHeader(headerKey) | String | 删除响应头 |
response.send(body) | Buffer,String,Stream.Readable | 发送响应体 |
headerKey
中包含以下字段或以x-fc-
开头的headerKey
均会被忽略,因此,不支持自定义。
- connection
- content-length
- date
- keep-alive
- server
- upgrade
限制说明
-
请求限制
-
如果超过以下限制,会返回400状态码和InvalidArgument错误码。
字段 限制说明 HTTP状态码 错误码 headers 请求头中的所有键和值的总大小不能超过4 KB。 400 InvalidArgument path 请求路径以及所有查询参数的总大小不能超过4 KB。 body 同步调用请求的Body的总大小不能超过16 MB,异步调用请求的Body的总大小不能超过128 KB。 -
响应限制
-
如果超过以下限制,会返回502状态码和BadResponse错误码。
示例:获取HTTP请求详细信息并返回Body
module.exports.handler = function (request, response, context) {
// get requset headervar reqHeader = request.headers
var headerStr = ' 'for (var key in reqHeader) {
headerStr += key + ':' + reqHeader[key] + ' '
};
// get request infovar url = request.url
var path = request.path
var queries = request.queries
var queryStr = ''for (var param in queries) {
queryStr += param + "=" + queries[param] + ' '
};
var method = request.method
var clientIP = request.clientIP
var body = request.body
var respBody = new Buffer('requestHeader:' + headerStr + '\n' + 'url: ' + url + '\n' + 'path: ' + path + '\n' + 'queries: ' + queryStr + '\n' + 'method: ' + method + '\n' + 'clientIP: ' + clientIP + '\n' + 'body: ' + body + '\n')
response.setStatusCode(200)
response.setHeader('content-type', 'application/json')
response.send(respBody)
};
2、函数实例生命周期回调方法
MemFire Cloud云函数支持Initializer生命周期回调方法。
Initializer回调
您可以将数据库场景下连接池构建、函数依赖库加载等耗时较长的业务逻辑放到Initializer回调中,避免每次运行函数都会做重复的操作,降低函数延时。
初始化回调程序(Initializer回调)在函数实例启动成功之后,运行请求处理程序(Handler)之前执行。函数计算保证在一个实例生命周期内,成功且最多成功执行一次Initializer回调。例如,您的Initializer回调第一次执行失败后系统会重试,直到成功为止,然后再执行您的请求处理程序。
Initializer回调只有一个context输入参数,使用方法和事件请求处理程序一样。
一个最简单的Initializer回调如下所示。
exports.initialize = function(context, callback) {
console.log('initializer');
callback(null, "");
};
MemFire Cloud平台默认的Initializer 回调程序为index.initialize,那么云函数在配置Initializer属性后会去加载index.js中定义的initialize方法。
方法签名
-
输入参数只有context,为您的云函数调用提供在调用时的运行上下文信息。
-
无返回值。
函数调用说明
-
前提:当用户想通过路由传输类似于/a/b这样的path信息时,那么我们建议使用查询参数(query parameter)来实现这一目的。
-
使用:在该场景下,用户应该将路径信息改为/a,并在该路径后添加查询参数?action=b,以便服务器可以正确地解析和处理请求。