简介: 无服务计算自身是一个概念或者实践模型,落地到具体技术上次要有函数即服务(FaaS)以及后端即服务(BaaS)两种模式,阿里云提供函数即服务 FaaS 产品。
作者 | 宋文龙(闻可)阿里云寰球技术服务部高级交付专家
什么是无服务计算
无服务器计算(Serverless Computing)在构建和运行利用时无需治理服务器等基础设施。它形容了一个细粒度的部署模型,在该模型中,利用被拆解为一个或多个细颗粒度的函数,在云端托管环境中被触发运行,而后依据须要执行、扩大容量并且计费。各大云厂商 Amazon、微软、Google、IBM、阿里云、腾讯云、华为云相继推出 Serverless 产品。
无服务计算自身是一个概念或者实践模型,落地到具体技术上次要有函数即服务(FaaS)以及后端即服务(BaaS)两种模式,阿里云提供函数即服务 FaaS 产品。
阿里云对于 FaaS 的定义如下:
函数计算是事件驱动的全托管计算服务。应用函数计算,您无需洽购与治理服务器等基础设施,只需编写并上传代码。函数计算为您筹备好计算资源,弹性地、牢靠地运行工作,并提供日志查问、性能监控和报警等性能。
对于 FaaS 的具体介绍官网文档曾经讲的很分明,本文不再赘述。本文重点探讨无服务计算的利用场景以及利用实际。
无服务计算利用场景
1. 无服务计算的劣势
无服务计算有很多长处,集体认为其中最次要的有三点:
- 应用无服务计算,用户无需思考基础设施,能够更加专一于业务逻辑;
- 无服务计算反对弹性伸缩,按需应用,按量计费,非常适合流量不稳固、有显著波峰波谷的业务;
- 无服务计算是云原生产品,能够无缝对接各种云上产品,作为黏合剂串联各种云原生产品。
下图阐明了阿里云 FaaS 产品的外围劣势:
2. 无服务计算利用场景
后面探讨了无服务计算的劣势,那么无服务计算都有哪些典型的利用场景呢?
在此分享笔者之前在我的项目中构建无服务利用的两个案例:
-
云端视频转码:
- 技术计划 :设施端捕捉短视频,上传到云端存储(例如阿里云 OSS),云端存储监测到文件上传后触发无服务计算函数函数,函数中调用 FFmpeg 给视频加水印、加特效,将视频转码后再转存到云端存储上,同时告诉业务服务更改视频状态。
- 计划劣势 :设施端视频上传频率很不稳固,可能有一段时间所有设施闲暇,也有可能某一段时间几千台设施同时上传,而视频转码是比拟耗费资源的,如果通过一般服务器提供转码能力并要确保所有视频都能在预期工夫内转码实现的话,必须按最高并发量配置服务器资源,这些服务器老本是相当可观的。即便云服务器采纳 Auto Scalling 策略,也需常备局部服务器,无奈做到不应用时零运行老本,而且云服务 Auto Scalling 触发及启动工夫也是分钟级的,很难达到服务能力秒级疾速伸缩。
-
物联网设施监控:
- 技术计划 :设施端通过云原生 IoT 服务上报状态,云原生 IoT 服务收到音讯后触发无服务计算函数,函数中对 IoT 原始音讯做简略荡涤后转发到后端服务做进一步业务解决,例如:发推送音讯给设施治理 App,当然也能够通过函数将 IoT 音讯转存到 NoSQL 数据库。
- 计划劣势 :端侧设施沉闷工夫不固定,如果想通过其余后端服务监控设施状态,该服务必须放弃 7*24 小时在线,架构和利用都须要确保高可用。而且设施并发量也是不稳固的,要思考服务伸缩架构。还有一点须要思考的是,云端资源通过事件或者规定间接唤起无服务计算函数比价不便,只须要简略配置即可,而对接自定义服务则要简单得多。
基于我的项目经验以及集体了解,笔者认为无服务计算次要有以下几种典型的利用场景:
- 可分解成独立运行单元的 CPU 密集计算型工作;
- 构建弹性伸缩 Web 后盾利用;
- 无缝粘合调度云上资源;
- 疾速低成本上线麻利利用。
3. 无服务计算不适宜做什么
后面列举了很多无服务计算的长处以及使用在一些场景中的益处,很多人必定感觉无服务计算太好用了,太想用了,这个场景是否用无服务计算?那个业务是否用无服务计算代替?
这里笔者可能要先泼一瓢冷水:无服务计算很好用,但不肯定处处好用。当然这瓢冷水以及接下来的一些总结只是基于集体了解,欢送拍砖。
集体认为无服务计算其实只适宜利用在一些逻辑绝对简略、内部依赖绝对较少、不须要简单编排治理、没有极致性能要求的业务,次要起因如下:
- 无服务计算在服务编排以及服务治理方面是比拟弱的,尽管支流云厂商都提供无服务计算的函数编排产品(例如阿里云的 Serverless 工作流,AWS 的 Step Functions 等),但想要实现函数的限流降级、调用链追踪、主动注册发现等比较复杂的编排治理以及可探测性还是须要做很多额定的工作,补救这些有余所要做的工作远大于无服务计算自身节俭的工作量。这点也是和无服务计算无需运维、配置简略、开箱即用的思维是南辕北辙的。
- 无服务计算利用运行所依靠的底层服务器以及运行环境对用户是通明的,用户无奈抉择,也无奈优化。例如在笔者之前的视频转码计划中,有些特效解决如果运行在 GPU 服务器上是能够大幅减速的,然而在无服务计算中只能依附 CPU 计算。
- 无服务计算程序运行的环境是高度标准化的,有些依赖于特定运行环境、特定服务器版本、甚至特定硬件资源的依赖是很难确保兼容性的。如果有些利用尤其是原有技术资产受到运行环境制约的话,尽量还是回归到传统的云服务器部署计划。
- 无服务计算的弹性伸缩并非没有下限,和一般利用一样,无服务利用在理论生产零碎中也须要思考并发达到下限的状况。尽管所有厂商的无服务计算产品都能依据并发量弹性伸缩,但这个弹性自身还是靠底层硬件资源撑持的,一般来讲各厂商的无服务计算产品都会有默认的并发下限设置,尽管通过工单申请能够调整,但也不能调整为无限量。如果账号下有多个无服务利用,须要对不同利用做的流量调配或者限度,并且思考某一利用拜访流量达到并发下限的状况。
4. 无服务是否代替微服务
笔者认为这两者应该不是一个维度的概念,微服务更多的是一种服务构建的架构思维,而无服务更偏重于一种服务部署和运行的技术计划,例如:微服务架构中某一个接口是能够通过无服务形式实现的。
当然,波及到具体技术层面,通过 SpringCloud 或者 Dubbo 对外提供 RESTful 接口服务,还是将无服务函数挂载到 API 网关下对外提供 RESTful 服务,这两种技术计划的确是能够放到一起比拟的。至于抉择哪种技术实现,集体认为次要取决于使用场景和业务复杂度,后面总结了无服务计算的劣势和不肯定那么好用的场景。上面是集体的倡议:
- 如果利用中须要简单的服务编排、服务治理、调用链追踪、对立的配置管理、主动注册发现等能力,倡议还是采纳“传统的”微服务技术计划;
- 相同,如果只须要构建一个“短平快”的利用,采纳无服务计算计划会让你好体验到极大的便当。正如笔者接下来将要分享的案例,就是采纳无服务技术构建一个简略的 Web 后盾利用。
阿里云 FaaS 实战
后面谈了比拟多形象的概念和认识,上面联合笔者经验的一个理论案例展现如何应用阿里云 FaaS 产品构建一个无服务利用,尤其是实现 FaaS 利用的主动构建、主动部署。
1. 我的项目背景介绍
某外企客户须要将一个为用户提供产品征询的服务从某友商无服务平台迁徙到阿里云 FaaS。这个利用原部署于友商海内平台,基于 Nodejs 开发,通过 API Gateway 裸露 RESTful 接口,数据存储采纳友商云原生 NoSQL 数据库。
迁徙革新次要波及以下三局部工作:
- 阿里云产品适配选型
- 代码逻辑革新
- 利用部署工具抉择及脚本编写
其中第三局部构建、部署脚本革新是此次迁徙工作的重点,接下来逐个开展阐明。
2. 阿里云产品适配选型
友商的无服务计算及网关在阿里云上均有对应产品,在此不开展比拟。
友商云原生 NoSQL 数据库为该平台独有产品,通过和客户探讨认为,齐全能够用其余 NoSQL 产品代替,加之现有开发人员更相熟 MongoDB 技术栈,最初数据存储选型为阿里云云原生 MongoDB。
以下为整体迁徙计划示意图:
3. 代码逻辑革新
用户编写无服务利用代码时,原则上只须要关注代码逻辑即可,主体代码逻辑局部大体上差别不大,比拟显著的差别次要体现在事件处理入口函数写法上。参考 FaaS 代码示例革新针对 API 网关事件的处理函数:
module.exports.handler = function(event, context, callback) {var response = {};
callback(null, response);
};
4. 利用部署工具抉择及脚本编写
- 利用构建及部署工具抉择
客户原来采纳第三方工具 Serverless (https://www.serverless.com/)) 实现无服务计算利用的构建和部署。Serverless 框架尽管声称反对简直所有支流云厂商的无服务产品,但通过调研后发现其对某友商反对是最全面的,有很多代码示例或者工程脚手架,简直是开箱即用。但该工具对阿里云的反对比拟无限,示例也绝对较少。通过评估,咱们决定采纳阿里云本人的工具 Funcraft。
Funcraft 如何装置配置请参考产品文档,此处不展开讨论。接下来次要展现如何通过 Funcraft 脚本实现服务、函数、网关、日志、鉴权等相干资源的部署及配置。
- 编写脚本
编写脚本前,先看一下指标零碎的部署架构以及 Funcraft 要实现的性能蓝图:
Funcraft 脚本及配置阐明详见以下代码:
yaml
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
demoService: #资源名称, 依据须要命名
Type: 'Aliyun::Serverless::Service'
Properties: #属性设置
Description: 'This is a faas demo' #资源形容
Policies: #安全策略,零碎主动依据策略为函数创立角色
- AliyunOSSFullAccess
- AliyunRAMFullAccess
- AliyunLogFullAccess
- AliyunApiGatewayFullAccess
- AliyunFCFullAccess
- AliyunMongoDBFullAccess
- AliyunVPCFullAccess
- AliyunECSNetworkInterfaceManagementAccess #特地阐明,配置此策略能力创立弹性网卡进而买通函数以及 VPC 内连贯
VpcConfig: #容许函数拜访的 VPC 配置
VpcId: 'vpc-xxxxxx'
VSwitchIds: ['vsw-xxxxxx']
SecurityGroupId: 'sg-xxxxxx'
LogConfig: #日志服务配置
Project: sls-demo
Logstore: logstore-demo
demoFunction: #函数名称
Type: 'Aliyun::Serverless::Function' #资源类型为服务,服务内能够挂载多个函数
Properties:
Handler: index.handler #事件处理入口
Runtime: nodejs10 #程序运行环境
CodeUri: './src' #程序代码绝对于以后脚本的门路
EnvironmentVariables: #环境变量设置,MONGO_URL: mongodb://userx:pwdx@dds-xxx.mongodb.rds.aliyuncs.com:3717/demoDb #Mongo 内网连贯地址
RESULT_TABLE_NAME: demo_table
demoGroup: # Api Group
Type: 'Aliyun::Serverless::Api' #资源类型为 API,每个 API 分组下能够挂载多个 API 接口
Properties:
StageName: RELEASE #公布环境
DefinitionBody:
'/v1/recommendervera/[resultId]': # request path
get: # http method
x-aliyun-apigateway-api-name: demo_api # api name
x-aliyun-apigateway-fc: # 当申请该 api 时,要触发的函数,arn: acs:fc:cn-shanghai:xxx:services/demoService.LATEST/functions/demoFunction
timeout: 3000
x-aliyun-apigateway-request-parameters: #设置参数类型
- apiParameterName: 'resultId'
location: 'Path' #传参形式,此处为在 URI 申请门路中传餐
parameterType: 'String'
required: 'REQUIRED' #设置为必选参数
'/v1/recommendervera/': # request path
post: # http method
x-aliyun-apigateway-api-name: demo_api_post # api name
x-aliyun-apigateway-fc: # 当申请该 api 时,要触发的函数,arn: acs:fc:cn-shanghai:xxxx:services/demoService.LATEST/functions/demoFunction
timeout: 3000
x-aliyun-apigateway-auth-type: APP #设置鉴权类型,此处设置为简略的 APP code 类型鉴权
x-aliyun-apigateway-app-code-auth-type: HEADER #鉴权加密形式,此处设置为通过 Header 传递受权后的 app
- 资源筹备
服务、函数、API 网关都能够通过以上 Funcraft 脚本一站式创立实现,日志、MongoDB、鉴权所需利用等内部资源须要提前创立或者配置好。
这里特地要阐明的是:函数通过内网链接 MongoDB 时,须要通过配置容许函数拜访 MongoDB 所在 VPC 及交换机,并为函数拜访创立一个独立的平安组用于配置弹性网卡,并且将此平安组退出到 MongoDB 的白名单中,进而买通函数计算与 VPC 之间的网络联通。
后面提到的 VPC、交换机以及平安组曾经提前创立好并配置在 Funcraft 脚本中了,上面看看在理论的 MongoDB 资源中如何配置白名单平安组:
5. 构建和部署
以上脚本资源都筹备好后,就能够执行 fun build 命令进行构建了。构建时,工具会读取指定代码目录下的 package.json 文件加载相干插件依赖及配置。
构建执行命令示例:
bash
$ fun build
using template: template.yml
start building function dependencies without docker
building demoService/demoFunction
running task: flow NpmTaskFlow
running task: CopySource
running task: NpmInstall
Build Success
Built artifacts: .fun/build/artifacts
Built template: .fun/build/artifacts/template.yml
Tips for next step
======================
* Invoke Event Function: fun local invoke
* Invoke Http Function: fun local start
* Deploy Resources: fun deploy
构建实现后,执行 fun deploy 命令部署到云端。示例如下:
bash
$ fun deploy
using template: .fun/build/artifacts/template.yml
using region: cn-shanghai
using accountId: ***********3452
using accessKeyId: ***********1fap
using timeout: 60
Collecting your services information, in order to caculate devlopment changes...
Resources Changes(Beta version! Only FC resources changes will be displayed):
┌──────────────┬──────────────────────────────┬────────┬──────────────────────┐
│ Resource │ ResourceType │ Action │ Property │
├──────────────┼──────────────────────────────┼────────┼──────────────────────┤
│ │ │ │ Description │
│ │ │ ├──────────────────────┤
│ │ │ │ Policies │
│ demoService │ Aliyun::Serverless::Service │ Add ├──────────────────────┤
│ │ │ │ VpcConfig │
│ │ │ ├──────────────────────┤
│ │ │ │ LogConfig │
├──────────────┼──────────────────────────────┼────────┼──────────────────────┤
│ │ │ │ Handler │
│ │ │ ├──────────────────────┤
│ │ │ │ Runtime │
│ demoFunction │ Aliyun::Serverless::Function │ Add ├──────────────────────┤
│ │ │ │ CodeUri │
│ │ │ ├──────────────────────┤
│ │ │ │ EnvironmentVariables │
└──────────────┴──────────────────────────────┴────────┴──────────────────────┘
? Please confirm to continue. Yes
Waiting for service demoService to be deployed...
make sure role 'aliyunfcgeneratedrole-cn-shanghai-demoService' is exist
role 'aliyunfcgeneratedrole-cn-shanghai-demoService' is already exist
attaching policies ["AliyunOSSFullAccess","AliyunRAMFullAccess","AliyunLogFullAccess","AliyunApiGatewayFullAccess","AliyunFCFullAccess","AliyunMongoDBFullAccess","AliyunVPCFullAccess","AliyunECSNetworkInterfaceManagementAccess"] to role: aliyunfcgeneratedrole-cn-shanghai-demoService
attached policies ["AliyunOSSFullAccess","AliyunRAMFullAccess","AliyunLogFullAccess","AliyunApiGatewayFullAccess","AliyunFCFullAccess","AliyunMongoDBFullAccess","AliyunVPCFullAccess","AliyunECSNetworkInterfaceManagementAccess"] to role: aliyunfcgeneratedrole-cn-shanghai-demoService
attaching police 'AliyunECSNetworkInterfaceManagementAccess' to role: aliyunfcgeneratedrole-cn-shanghai-demoService
attached police 'AliyunECSNetworkInterfaceManagementAccess' to role: aliyunfcgeneratedrole-cn-shanghai-demoService
Waiting for function demoFunction to be deployed...
Waiting for packaging function demoFunction code...
The function demoFunction has been packaged. A total of 1675 files were compressed and the final size was 2.1 MB
function demoFunction deploy success
service demoService deploy success
Waiting for api gateway demoGroup to be deployed...
URL: GET http://xxx-cn-shanghai.alicloudapi.com/v1/recommender/[resultId]
stage: RELEASE, deployed, version: 20200715144450426
stage: PRE, undeployed
stage: TEST, undeployed
URL: POST http://xxx-cn-shanghai.alicloudapi.com/v1/recommender/
stage: RELEASE, deployed, version: 20200715144453967
stage: PRE, undeployed
stage: TEST, undeployed
api gateway demoGroup deploy success
脚本失常执行后,能够在云端看到相干函数及 API 曾经部署实现并且能够失常运行了。
接下来能够将以上 Funcraft 命令及脚本能够退出到 Jenkins、Gitlab 等工具流水线中,联合代码版本管理工具实现函数利用的继续集成、继续公布。
总结
随着无服务计算产品和技术的进一步成熟,会有越来越多的用户抉择无服务计算技术;随着阿里云的进一步发展壮大,也会有越来越多用户采纳阿里云 FaaS 构建无服务利用。
本文探讨了无服务计算的利用场景,并且结合实际利用案例,解说了如何用 FaaS 构建无服务 Web 后盾利用,并实现主动构建、主动部署,心愿以上探讨和教训可能帮到大家。
作者简介
宋文龙,花名闻可,阿里云寰球技术服务部高级交付专家,有多年云原生利用开发架构教训以及多年高性能服务器研发教训。目前专一于使用阿里云中间件技术、联合阿里巴巴中台架构教训为客户构建合乎行业须要的业务中台解决方案并实现交付。
原文链接
本文为阿里云原创内容,未经容许不得转载。