如果用传统方式实现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”。

如何使用阿里云FC - 图1

如何使用阿里云FC - 图2

然后在服务列表中,选择刚刚创建的服务“hello_world”,进入管理界面,选择创建函数

如何使用阿里云FC - 图3如何使用阿里云FC - 图4

填写函数名“say_hello”,“请求处理程序类型”,选择处理HTTP请求。点击“创建”。如何使用阿里云FC - 图5如何使用阿里云FC - 图6

然后进入函数管理界面,我们将初始代码简单修改,让它返回“hello, world”如何使用阿里云FC - 图7

  1. var getRawBody = require('raw-body');
  2. exports.handler = (req, resp, context) => {
  3. console.log('hello world');
  4. var params = {
  5. path: req.path,
  6. queries: req.queries,
  7. headers: req.headers,
  8. method : req.method,
  9. requestURI : req.url,
  10. clientIP : req.clientIP,
  11. }
  12. getRawBody(req, function(err, body) {
  13. for (var key in req.queries) {
  14. var value = req.queries[key];
  15. resp.setHeader(key, value);
  16. }
  17. resp.setHeader("Content-Type", "text/plain");
  18. params.body = body.toString();
  19. resp.send("hello, world");
  20. });
  21. }

然后测试一下函数,可以看到下面界面显示正常返回了“hello, world”。

如何使用阿里云FC - 图8

函数已经开发完成,接下来我们要让我们的域名能够访问到这个函数。

前提是你已经拥有了一个域名,这个例子中域名是happyshowing.com

在FC管理后台,进入“域名管理”,添加自定义域名。

如何使用阿里云FC - 图9

配置自定义域名为“happyshowing.com”,然后配置域名对应的服务、函数及其版本(LATEST就行)。如何使用阿里云FC - 图10

注意!!!,上面的界面中已经提示,还要在你的域名上配置cname为给定的FC默认域名。

然后过一会儿域名生效(通常几分钟以内),就可以访问了。

如何使用阿里云FC - 图11

二、基本概念

有几个关键的概念:服务、函数、触发器

服务是函数计算资源管理的单位,是符合微服务理念的概念。创建函数前必须先创建服务,同一个服务下的所有函数共享一些相同的设置,例如服务授权、日志配置。从业务场景出发,一个应用可以拆分为多个服务。

从资源使用维度出发,一个服务可以由多个函数组成。例如一个数据处理服务,分为数据准备和数据处理两部分。数据准备函数资源需求小,可以选择小规格实例。数据处理函数资源需求大,可以选择大规格实例。

比如一个电商应用,可以拆分为订单服务、用户服务、商品服务。

而订单服务又可以分为订单的读和写,读订单需要的资源小,可以选择用小规格实例的函数实现,写订单需要的资源多,可以选择用大规格实例函数实现。

根据处理请求事件的类型,函数分为处理事件和处理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在同一区域

  1. 设置服务的网络配置,允许公网访问访问 & 允许VPC访问

如何使用阿里云FC - 图12

  1. 然后设置服务访问VPC的id是RDS所在的VPC(RDS的VPC是创建实例时候默认创建的,可以在RDS控制台的详情中查看)

如何使用阿里云FC - 图13

如何使用阿里云FC - 图14

如何使用阿里云FC - 图15

  1. 然后在RDS的访问白名单为VPC所在的网段

如何使用阿里云FC - 图16

另外,开发阶段可以在本地搭建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基本是不用付费的,当然出口流量还是要付费的。