如果用传统方式实现API Server,可能需要购买服务器,搭建环境,安装Web Server,编写程序,上传,后续还要考虑流量洪峰、动态伸缩等各种服务治理问题。使用FaaS,则只需要选择合适的运行时然后编写函数并上传即可。
阿里云FC(Function Compute)是阿里云提供的FaaS服务。
阿里云FC的文档非常清楚和详细,https://help.aliyun.com/product/50980.html。
这里介绍基本用法,实现一个最简单的接口作为示例,然后介绍开发的基本流程、开发工具以及计费方式。
一、阿里云FC的hello, world
下面介绍一个简单例子,使用FC开发一个hello, world的get接口。
首先注册阿里云账号,开通阿里云FC:https://help.aliyun.com/document_detail/253972.html
然后进入阿里云FC管理后台,选择服务及函数,创建服务,命名“hello_world”。
然后在服务列表中,选择刚刚创建的服务“hello_world”,进入管理界面,选择创建函数
填写函数名“say_hello”,“请求处理程序类型”,选择处理HTTP请求。点击“创建”。
然后进入函数管理界面,我们将初始代码简单修改,让它返回“hello, world”
var getRawBody = require('raw-body');
exports.handler = (req, resp, context) => {
console.log('hello world');
var params = {
path: req.path,
queries: req.queries,
headers: req.headers,
method : req.method,
requestURI : req.url,
clientIP : req.clientIP,
}
getRawBody(req, function(err, body) {
for (var key in req.queries) {
var value = req.queries[key];
resp.setHeader(key, value);
}
resp.setHeader("Content-Type", "text/plain");
params.body = body.toString();
resp.send("hello, world");
});
}
然后测试一下函数,可以看到下面界面显示正常返回了“hello, world”。
函数已经开发完成,接下来我们要让我们的域名能够访问到这个函数。
前提是你已经拥有了一个域名,这个例子中域名是happyshowing.com。
在FC管理后台,进入“域名管理”,添加自定义域名。
配置自定义域名为“happyshowing.com”,然后配置域名对应的服务、函数及其版本(LATEST就行)。
注意!!!,上面的界面中已经提示,还要在你的域名上配置cname为给定的FC默认域名。
然后过一会儿域名生效(通常几分钟以内),就可以访问了。
二、基本概念
有几个关键的概念:服务、函数、触发器。
服务是函数计算资源管理的单位,是符合微服务理念的概念。创建函数前必须先创建服务,同一个服务下的所有函数共享一些相同的设置,例如服务授权、日志配置。从业务场景出发,一个应用可以拆分为多个服务。
从资源使用维度出发,一个服务可以由多个函数组成。例如一个数据处理服务,分为数据准备和数据处理两部分。数据准备函数资源需求小,可以选择小规格实例。数据处理函数资源需求大,可以选择大规格实例。
比如一个电商应用,可以拆分为订单服务、用户服务、商品服务。
而订单服务又可以分为订单的读和写,读订单需要的资源小,可以选择用小规格实例的函数实现,写订单需要的资源多,可以选择用大规格实例函数实现。
根据处理请求事件的类型,函数分为处理事件和处理http两种类型,处理http的函数只能添加http触发器,且只支持创建一个触发器。其他类型的触发器可以添加多个。
简单总结:
- 1个应用 由 若干个服务 组成
- 1个服务 由 若干个函数 组成
- 1个函数 关联 若干个触发器
三、应用开发流程
下面介绍使用阿里云FC的后台开发一个web应用的流程。
通常实际项目中会用开发工具开发应用。这里只是通过后台管理的流程来梳理应用开发的关键步骤。
1. 准备阶段
在阿里云开通FC:https://help.aliyun.com/document_detail/253972.html
2. 设计阶段
把应用拆分成服务,设计每个服务中的函数。对于简单的应用,也可以设计成一个服务、一个函数,然后函数里面根据请求进行相应处理。
3. 开发阶段
在阿里云FC管理后台创建服务和函数,并配置好触发器。
在后台的编辑器写代码,或者本地写好代码然后在后台上传。
4. 测试
管理后台提供函数的测试功能,可以填写测试的query和请求头来测试你的函数。
4. 发布阶段
函数部署
管理后台支持一键部署函数。
域名管理
注意:需要先申请一个域名。
FC会对每个区域生成一个默认的A记录,你需要先在域名管理后台解析域名,把FC的默认域名配置为你域名的cname。
然后在FC管理后台的“域名管理”配置中,添加你的域名,并配置域名对应的服务、函数和函数的版本
上面两步配置好就可以通过域名访问到函数了。
访问RDS
首先确保FC和RDS在同一区域
- 设置服务的网络配置,允许公网访问访问 & 允许VPC访问
- 然后设置服务访问VPC的id是RDS所在的VPC(RDS的VPC是创建实例时候默认创建的,可以在RDS控制台的详情中查看)
- 然后在RDS的访问白名单为VPC所在的网段
另外,开发阶段可以在本地搭建MySQL环境,发布线上时候可以将本地的数据库导出,然后导入到RDS中,也可以用项目中的数据库同步功能。这两种方法都能够避免手动创建RDS的表,可以避免这个过程中产生的问题。
四、开发工具
Serverless Devs是一个开源开放的Serverless开发者平台
上面介绍了通过管理后台实现函数的开发和部署,实际项目中出于自动化的需求,更适合使用Serverless Devs来管理项目。
Serverless Devs是一个开发者平台,不仅可以管理FC资源,还支持其他平台,如亚马逊、谷歌、百度、腾讯、华为。
Serverless Devs支持命令行和配置文件(.yaml)方式使用,类似webpack工具。使用Serverless Devs我们可以管理服务(创建/删除)、管理函数(创建/删除/安装依赖/构建/部署)、管理触发器、域名管理。
有些Serverless框架(如midway),底层就是用Serverless Devs管理资源。
五、实例类型和计费模式
实例的工作方式
使用FC,我们不需要关心流量洪峰和动态伸缩,FC会根据并发请求数量自动扩缩容,比如某个瞬间有10万并发请求,FC会开启10万个实例来处理,当并发请求数降低,FC会销毁实例。
上面例子是单实例,单并发的情况,如果你想提升实例的资源利用率,可以开启单实例多并发模式,每个实例可能会处理多个请求。
实例类型
有两种不同的实例类型:弹性实例和性能实例。
它们的区别是,弹性实例动态伸缩能力强,性能不如性能实例;性能实例性能上限更高,但动态伸缩能力较差。
弹性实例适用于突发流量场景,例如活动、大型促销和红包等;性能实例适用于计算密集型场景,例如音视频处理、AI建模和企业级Java应用等场景。
弹性实例和性能实例都可选规格,可以根据业务需求选择合适规格的实例。
实例模式
如果某一段时间没有请求,这时候是没有实例在运行的,突然来了一个请求,FC需要初始化一个实例,然后处理请求,初始化的时间可能会造成响应延时。这种初始化实例过程称为“冷启动”,这种有请求就初始化实例,没有请求就没有实例的工作模式,称为按量模式。
如果业务上接受不了冷启动带来的延时体验,可以选择预留模式,预留模式你可以手动控制常驻实例,以避免冷启动。预留实例当然会一直产生费用。
计费方式
使用FC对资源消耗取决于实例计算能力和使用时长,因此计费也基本是根据这两个因素
资源使用费用 = 函数实例计算力(GB)×执行时长(秒)×单价。
目前FC有很大的免费额度,通常小规模网站,日访问量几百次的,FC基本是不用付费的,当然出口流量还是要付费的。