Serverless入门
Serverless 时代已来临
国外 Serverless 生态迅速发展诞生了如 Serverless Framework、Vercel 等很多优秀的产品
2017年后 国内的阿里云和腾讯云也陆续发布了Serverless产品
国内的 Serverless 产品:函数计算和云函数
Serverless 带来的机遇
- 购买机器
- 分布式缓存
- 安装环境
- 流量控制
- 负载均衡
开箱即用,解决你不会服务器运维的困难
- Serverless对后端工程师也有很大的影响
- 专注于业务开发深入业务细节使业务快速迭代
- 深入底层去构建 Serverless基础设施,让技术为更多开发者服务
Serverless 的开发框架、WebIDE
学习 Serverless 所面临的挑战
Serverless
开发者的 Serverless学习过程变得极其困难很多知识盲点都要自己探索,无法建立自己的知识体系
随着国内云厂商对 Serverless 的支持越来越完善些大厂和实践者也开始推出 Serverless 的开发教程,但
- 越来越多的企业和开发者开始尝试使用 Serverless
- 落地经验输出还非常少
- 导致开发者在使用 Serverless 开发复杂业务时缺少经验、容易踩坑
前言
Severless 架构兴起
- 主流云服务商推出 Serverless 相关的云产品和新功能
- AWS Lambda、阿里云函数计算、腾讯云云函数
- 各种关于 Serverless 的商业和开源产品也层出不穷
- Serverless Framework、OpenFaaS、kubeless
那你是否思考过Serverless 为什么这么火呢?
云计算
云计算的发展史就是 Serverless 的兴起史:
- 物理机时代:物理机时代,网站上线和稳定运行面临的最大问题就是服务器等硬件问题
- 1955——分时操作系统理论:通过时间片轮转的方式把一个操作系统给多个用户使用
- 1959——虚拟化概念:
- 1969——ARPANET发布:
- 1970——虚拟机(VMs)概念:
- 1972——VM 发布:
- 1974——虚拟机理论完善:
- 1990——万维网发明:
- 1997——云计算定义:Ramnath Chellapa教授提出一种新的计算范式,其中计算的边界将由经济原理决定,而不仅仅是技术限制云计算不只是虚拟化技术,还是云服务商提供计算资源,使用者购买计算资源
- 虚拟机时代:
- 2000——无虚拟化的硬件
- 2001——虚拟化--发布ESX和GSX--vmware
- 2001年VMWare带来的针对x86服务器的虚拟化产品使虚拟机逐渐普及通过虚拟化技术,它可以把一台物理机分割成多台虚拟机提供给多用户使用充分利用硬件资源,而且速度和弹性也远超物理机
- 2001年之后,虚拟化技术逐渐成熟,因此也出现了很多基于虚拟化的云厂商和产品 AWS的EC2、阿里云ECS、Azure VirtualMachines,这种云计算形态也被叫作 laaS (软件即服务)
- 测试与入侵 云数据库有专门的服务器,并且还提供了备份容灾比自己在服务器上安装数据库更稳性能更强 对象存储能无限扩容,不用担心磁盘不够了
- 服务器就只负责处理用户的请求
- 把计算和存储分离开来,既降低了系统负载,也提升了数据安全性
- 单机应用升级为了集群应用,通过负载均衡,会把用户流量均匀分配到每台服务器上
- 2006——laaS--发布S3和EC2--amazon web services
- 2009——PaaS--HEROKU
- 2010——开源laaS--openstack
- 2011——开源 PaaS--CLOUDFQUNDRY
- 容器时代:
- 2008——LXC容器发布
- 2013——Docker 发布
- 代表着容器技术替代了虚拟化技术,云计算进入容器时代容器就是把代码和运行环境打包在一起,这样代码就可以在任何地方运行当容器多了的时候,如何管理就成了一个问题,于是出现了容器编排技术比如2014 年 Google 开源的 Kubernetes
- 创建流程
- 搭建 Kubernetes 集群
- 构建容器镜像
- 部署镜像
- 容器时代网站部署架构
- 2014——Google 开源Docker 发布Kubernetes
- 2015——OCI组织成立
- 2015——CNCF 组织成立
- 2017——Docker 宣布支持 Kubernetes
- 问题 容器时代架构:1.需要去规划节点和 Pod的 CPU、内存、磁盘等资源 2.需要编写复杂的YAML去部署 Pod、服务,需要经常排查 Pod 出现的异常 3.需要学习专业的运维知识
- Serverless 时代:指构建和运行不需要服务器管理的一种概念。前面三种电商网站部署的方式,都属于Serverful的架构它就像使用低级的汇编语言编程 而Serverless的架构就像使用 Python 这样的高级语言进行编程
- 2014——Lambda
- 2017——函数计算
- 2017——云函数
- 2018.07——knative
- 2019——Cloud Run
- 2020——
Serverless的实现
BaaS(后端即服务):
将后端能力封装成了服务,并以接口的形式提供服务
FaaS(函数即服务):
提供了运行函数代码的能力,并且具有自动弹性伸缩
Serverless的网站架构
小结
- 物理机时代:2000年之前,我们需要通过物理机部署网站
- 虚拟机时代:2000 年之后,虚拟化技术发展成熟,云计算行业蓬勃发展,我们可以基于laaS和PaaS 部署应用,提高稳定性
- 容器时代:2013年云计算进入容器时代,我们可以通过容器技术打包应用及运行依赖,不用关心运行环境
- Serverless 时代:2017年后,云计算进入 Serverless 时代,我们不再需要关心服务器应用也天然具有弹性
Serverless 技术
- 能够让我们不再关心传统的运维工作,让我们更专注于业务的实现以更快的速度、更低的成本完成应用的开发迭代,进而创造出更大的价值
Serverle 基础概念
广义的 Serverless
广义的 Serverless 是指构建和运行软件时不需要关心服务器的一种架构思想
基于Serverless 思想实现的软件架构就是Serverless 架构
- 备份容灾
- 弹性伸缩
- 日志监控
Serverless 就是为了解决上述这些问题诞生的
Serverless 和 Serverful 的架构区别
- 资源分配:不用关心应用运行的资源,只提供一份代码就行
- 计费方式:按实际使用量计费,计费粒度也精确到了毫秒级
- 弹性伸缩:可以快速根据业务并发扩容更多的实例甚至允许缩容到零实例状态来实现零费用
一个应用如果是Serverless 架构的,必须要实现自动弹性伸缩和按量付费
这也是 Serverless 的核心特点
狭义的 Serverless
FaaS Function as a Service
- Lambda
- Azure Functions
- 函数计算
- 云函数
BaaS Backend as a Service
- 云数据库
- 文件存储
- 消息队列
- OAuth
![狭义的 Serverless](.\img\狭义的 Serverless.jpg)
狭义的 Serverless 是 FaaS 和 BaaS 的组合
什么不是 Serverless
1.PaaS(平台即服务)云计算虚拟机时代的主要形态之一,但不是Serverless
2.Kubernetes:本身也不是 Serverless,只是在概念方面有些类似
- Kubernetes 是一种容器编排技术基于Kubernetes,你能很方便地进行 Pod的管理,并且实现应用的弹性伸缩
- 从运维的角度来看主流的 Kubernetes 服务提供商,提供的都是 Kubernetes 集群托管和运维服务
- 从成本的角度来看Kubernetes 按照资源数量计费
3.云原生指的是原生为云设计的架构模式
- Serverless 是云原生的一种实现
- 云原生的另一种实现是 Kubernetes
相关技术
laaS(基设施即服务)
略
Paas(平台即服务)
PaaS(平台即服务)云计算虚拟机时代的主要形态之一
- 付费标准:按资源付费,而不是按实际使用量付费
- 弹性伸缩:只能针对底层的服务器进行扩缩容
FaaS(Function as a Service)(函数即服务)
![FaaS (Function as a Service)](.\img\FaaS (Function as a Service).jpg)
特征|特点
- 无需运维
- 按量付费
- 自动弹性伸缩
- 事件驱动
基于FaaS实现接口
function handler(event) {
// data 数组就是接口的返回数据
const data = ['a', 'b', 'c']
return data
}
实现一个计算PV的接口
// 使用全局变量存储当前 PV
let pv= 0;
function handler(event) {
// 用户每访问一次就给 PV 的值加 1
pv++;
return pv;
}
当你把函数部署到 FaaS,然后访问接口时,会发现得到的结果永远都是1
这是 FaaS的另一个特点,无状态
BaaS(Backend as a Service)(后端即服务)
BaaS本质上就是把后端功能封装起来,以接口的形式提供服务
常见的BaaS产品有AWS DynamoDB、阿里云表格存储、消息中间件等。这些服务都可以通过API进行访问
实现 pv 统计功能:
const tablestore = require('tablestore');
async function handler(event) {
// 从表格存储中获取当前PV
let pv = await tablestore.get();
// 用户每访问一次就给 pv 的值加1
pv += 1;
// 保存最新PV
await tablestore.save(pv);
return pv;
}
技术总结
基于FaaS和Baas的架构,是一种计算和存储分离的架构
容器技术(Docker、containerd 等)
略
优势
开发简单、节省成本、提高效率、无需运维、自动弹性伸缩、易于扩展、降低风险
劣势
依赖第三方云服务(一个云厂商转移到另一个云厂商成本高)、底层硬件多样性和不确定性、应用性能瓶颈、函数通信效率低、开发调试复杂
总结
- 广义上来讲,Serverless 是一种架构思想
- 狭义上来讲,Serverless是Faas和 BaaS 的组合
Serverless 架构的主要特点是按量付费、弹性伸缩、不用运维
Serverless 的能力
一、计算能力
资源按需分配,无需申请资源
Mwm:租户级别强镜离 ,Docker: 进程级别隔离
Mwm+Docker 轻量级资源毫秒级启动
实时扩容,阶梯缩容,按需收费
二、系统运维能力
1.性能保障
(1) 整个链路耗时毫秒级内,并支持 VPC 内网访问
2.安全保障
- (1)资源对用户不可见,安全由腾讯云提供专业的保障
- (2)提供进程级和用户级安全隔离
- (3)访问控制管理
3自动性护缩容
- (1) 根据 CPU 内容网络 IO 自动扩容底层资源
- (2) 根据请求数自动扩缩容函数实例,业务高峰期扩容,满足业务高并发需求,业务低峰期缩容,释放资源,降低成本
4.自愈能力
(1) 每一次请求都是一个健康的实例
Serverless 中云函数被第一次调用会执行冷启动,Serverless 中云函数被多次连续调用会执行热启动
冷启动是指你在服务器中新开辟一块空间供一个函数实例运行,这个过程有点像你把这个函数放到虚拟机里去运行,每次运行前都要先启动虚拟机加载这个函数,以前冷启动非常耗时,但是目前云厂商已经能做到毫秒级别的冷启动,这个过程我们也不需要关心,但是需要注意的是使用 Seesion 的时候可能会导致 Session 丢失,所以我们的 Seesion 建议保存到数据库。
热启动则是说如果一个云函数被持续触发,那我就先不释放这个云函数实例,下次请求仍然由之前已经创建了的云函数实例来运行,就好比我们打开虚拟机运行完这个函数之后没有关闭虚拟机,而是让它待机,等待下一次被重新触发调用运行,这样做的好处就是省去了