serverless常用的以FaaS为主,即函数为粒度的服务。特点是成本低、自动扩缩容、事件驱动、无状态性。每次都要冷启动,本地级缓存不可用。
市面上的服务商最早是amazon、谷歌云这些,国内的有阿里和腾讯。网上的一些教程以amazon为主,本来也想用amazon,但是被要求绑定信用卡(或者visa借记卡,但老实讲,这年头谁还有那么多卡,我只有工资卡,非visa),所以选择了阿里。
阿里函数计算服务可以计量收费,且每月有一定的免费额度,对于学习来说足够了。后面在函数服务中使用数据库时选用的mysql,也是因为mysql可以免费用一个月,so
注册、登录完成后,会引导你新建一个函数


页面下方有执行按钮,可以看到运行结果

红圈的地址可以拿到公网访问,但返回的是流(原因见上方蓝底黑字,这个不重要,且我没钱买域名)。使用fetch在浏览器中访问
fetch('https://xxxxxxx.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/test2/mysqltest/').then(res => res.json()).then(res => console.log(res));
访问成功~
开发调试
vscode有一个叫Aliyun Serverless的阿里官方插件(v1.27.12这个版本有bug,避开这个版本)。此插件需要配合docker使用,配置方法和插件使用方法见插件介绍页
- 在vscode中绑定AccessKey时建议你创建子帐户,创建后要记得分配权限
- 我的docker配置
docker run --rm -it -e FC_ACCESS_KEY_ID=LTAI***cKm -e FC_ACCESS_KEY_SECRET=nVmM***VWJw -v $(pwd):/code nodejs10
访问数据库
看官网文档发现,想让函数计算服务访问数据器,需要:专用网络(PVC)、云服务器(ECS)和数据库(RDS),且它们最好都在一个地区下的一个区里,如都在 华东 1(杭州) 可用区 G
PVC下建立交换机、ECS要设置安全组、RDS要设置白名单(交换机、ECS的ip)。其中ECS需要单独购买,虽然计量收费也不贵,但是
来来回回设置这设置那,好麻烦啊!!!
如果你看到这里还没开始动手,可以去看看腾讯[哭笑]
将代码下载到本地,并修改为
const { Server } = require('@webserverless/fc-express')
const express = require('express');
const app = express();
app.all("/", (req, resp) => {
// resp.setHeader('Content-Type', 'text/html');
// resp.send('hello world');
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'rm-bp13z2113ts31os09.mysql.rds.aliyuncs.com',
user : 'root',
password : 'Ss123456!',
database : 'test_fn'
});
connection.connect();
connection.query('SELECT * from user', function (error, results, fields) {
connection.end();
if (error) throw error;
console.log('The solution is: ', results[0].solution);
resp.send(results);
});
});
const server = new Server(app);
// http trigger entry
module.exports.handler = function(req, res, context) {
server.httpProxy(req, res, context);
};
因为它是基于dorker运行的,且这个服务阿里不允许指定端口,所以需要使用他们的插件 @webserverless/fc-express 中转一下
注意事项
上面提到,serverless的优点是
- 将服务器管理的工作抽象给了供应商
- 按量付费,成本低
- 自动扩缩容、高可用(一个函数、服务崩溃,不对其它造成影响)
-
避免多个依赖:按量付费中的量是函数执行(活动)时长。
所以当 异步函数A 内部依赖 异步函数B、C...时,A的时长就会被拉长,但空闲的函数也是活跃的状态。且每个函数都可能超时或错误,A会变的不稳定且不可控。
如controller模式,最好去掉controller,仅留具体功能。 -
避免多层依赖:serverless函数应该是独立且高度分离的。
所以当 异步函数A 内部依赖 异步函数B, B又依赖C时,导致的超时、错误、停机等风险成倍增加。
如C因为错误让B超时,A就有可能永远处于等待中;又或者一旦C改变了,发生灾难性的链锁错误。 -
避免递归:因自动扩缩容特性,递归可能会导致资源指数级的浪费,尤其是递归函数还调用了其它函数时。
它不适用于业务逻辑紧凑(网状依赖)的业务,适用于依赖异步逻辑、线性依赖
网友评论