Serverless概念介绍
Server-服务,less-少,Serverless其实是一种开发者只需关注如何更好提供服务,而无需关心服务器的架构思想。传统应用缺点:服务器利用率低(应用常年cpu利用率<10%)、DevOps成本高(Docker、进程、限流、日志等前端维护乏力)
从发展视角看Serverless
IaaS、PaaS、SaaS是什么?
IaaS | PaaS | SaaS |
---|---|---|
Infrasturcture as a Service | Platform-as-a-Service | Software-as-a-Service |
基础设施即服务 | 平台即服务 | 软件即服务 |
IaaS公司提供场外服务器、存储和网络硬件等 | PaaS公司提供应用程序开发环境或部分应用 | SaaS公司提供完整可食用应用程序 |
FaaS和BaaS是什么?
FaaS是函数即服务,应用层面的对外接口,而BaaS则是后端即服务,更多的是业务系统相关的服务。
写一个函数提供出去,并通过回调结果返回,就可以实现一次Faas调用,调用完后就会显示Hello Serverless
exports.handler = (event, context, callback) => {
callback(null, 'Hello Serverless');
}
整体架构就是会有不同数据源,不同数据源都可连接到FaaS后端,FaaS会根据当前请求量去缩扩容,并且决定启用多少容器,去算最终成本。
Serverless特性
- Hostless:不绑定具体主机,跑在云厂商服务器任何一台都可以
- Elastic:弹性,遇到大流量可快速扩容
- Stateless:无状态,因为函数随时可能被启动,随时可能被销毁
- Event-driven:事件驱动,如上传文件就是上传事件,请求服务器就是请求事件,不同事件对应不同函数,不同函数实现不同功能
- Lego Blocks:乐高式组合
- High Availability:高可用,不会因流量洪峰导致额外故障
- Usage-based Cost:按量付费,而不是传统的按时间付费
Serverless案例
- Web应用:当用户访问cdn内容分发网络,cdn会把事件派发给函数计算,函数计算可连通后台服务,可以去表格存储里拉数据,去文件存储里拉文件,去日志函数里打日志,然后返回计算结果,最后给用户返回一个站点或一些数据。
- 视频转码:上传mp4可能需要转成mkv等各种格式,用户上传视频到对象存储,对象存储此时派发一个事件去触发函数,即文件上传后函数计算就会收到一次调用,从而进行相关操作,包括调用整个函数工作流,即调用更多函数去执行转码任务,转码完成后这些函数又会被回收掉,并把转码后文件上传到对象存储。
Serverless落地
开发 Serverless 应用
-
Serverless应用开发流程
-
选择一个 Serverless FaaS 平台,如 阿里云函数计算
-
开发完的函数代码部署到 FaaS 平台
-
为函数配置 HTTP 触发器
- 下面结合在阿里云函数计算平台相关操作配图进行详细说明
-
进入函数计算控制台,新建一个函数
-
函数创建成功后,就会进入到代码编辑页面,在编辑器中写入代码
-
写完代码后,你就可以在“触发器”标签下看到函数计算为你默认创建的 API Endpoint,用该 API Endpoint 对函数进行测试。接口也按照预期返回了status code: 200。
-
到目前为止,这个应用很简单(只有一个函数),而实际情况绝大部分应用都是由多个函数组成的,应用部署时需要将所有函数一同部署,并且函数运行依赖 FaaS 环境,这就导致函数代码不能直接在本地运行。要解决这些问题,你就需要一套完整的开发、调试和部署 Serverless 的解决方案,于是出现了 Serverless 开发框架
现在主流 Serverless 开发框架 Serverless Framework/Serverless Cloud Framework
目前最完善的 Serverless 开发框架之一。它不仅实现了前面提到的应用开发、调试、部署等基础功能,还实现了多个 Serverless 平台的支持。
框架使用讲解
- 安装
Serverless Framework 是使用 Node.js 开发的,所以你可以使用 npm 直接来安装它
$ npm install -g serverless
$ serverless --version
- 账号设置
$ serverless config credentials --provider aws --key key --secret secret
--provider 具体的 Serverless 平台
--key AWS 账号的 aws_access_key_id
--secret AWS 账号的 aws_secret_access_key
-
应用配置
- 初始化一个应用
$ serverless create --template svl-nodejs
$ ls
index.js serverless.yml
- 通过 YAML 配置文件来定义应用和函数
# serverless.yaml
# 应用名称
service: myservice
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs12.x # 函数运行环境
# 函数列表
functions:
# 函数1
index:
handler: index.handler # 函数入口
events: # 函数触发器,一个函数可能有多个触发器
- http
- 应用开发
// index.js
exports.handler = (event, context, callback) => {
// 从 event 中获取 URL query 参数
const { name } = event.queryStringParameters;
// 定义 HTTP Response
const response = {
statusCode: 200,
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ message: `Hello ${name}!`} ),
};
callback(null, response);
};
- 应用调试
调试函数也很简单,直接通过 invoke 命令
# 远程调试
$ serverless invoke --function hello
# 本地调试
$ serverless invoke local --function hello
- 应用部署
使用 deploy 命令来部署应用,将函数部署之前,serverless 会先在本地将代码打包,最终代码是一个压缩包,路径为 .serverles/[serviceName].zip 。
$ serverless deploy
Serverless: Packaging service...
$ tree
|-- .serverless
|-- myservice.zip
|-- handler.js
|-- serverless.yaml