Serverless架构兴起
- • 主流云服务商推出Serverless相关的云产品和新功能 : AWS lambda、阿里云函数计算、腾讯云云函数
- • 各种关于Serverless的商业和开源产品也层出不穷: Serverless Framework、OpenFaas、Kubeless
Serverless为什么这么火?
云计算的发展史就是Serverless的兴起史 包括物理机时代、虚拟机时代、容器时代、Serverless时代
物理机时代
分时操作理论
1995年 分时操作系统理论:通过时间片轮转的方式把一个操作系统给多个用户使用
云计算的定义
1997年云计算定义:一种新的计算范式,其中计算的边界将由经济原理决定,而不仅仅是技术限制。云计算不只是虚拟机技术,还是云服务商提供计算资源,使用者购买计算资源
开发一个网站需要经历的步骤
物理机时代网站部署
物理机时代,网站上线和稳定运行面临的最大问题就是服务器等硬件问题
虚拟机时代
虚拟化
x86服务器的虚拟化产品使虚拟机逐渐普及。通过虚拟机化技术,可以把一台物理机分割成多台虚拟机提供给多用户使用充分利用硬件资源,而且速度和弹性也远超物理机
Iaas(基础设施即服务)
出现了很多虚拟化的云厂商和产品 比如阿里云ECS,这种云计算形态也叫作Iaas(软件即服务)
虚拟机时代网站部署架构
- • 云数据库有专门的服务器,并且还提供了备份容灾比自己在服务器上安装数据库更稳定性能更强
- • 对象存储能无限扩容,不用担心磁盘不够了
- • 服务器就只负责处理用户的请求
- • 把计算和存储分离开来,即降低了系统负载,也提升了数据安全性
- • 单机应用升级为了集群应用,通过负载均衡,会把用户流量均匀分配到每台服务器上
容器时代
Docker
容器技术代替了虚拟化技术,云计算进入容器时代。容器就是把代码和运行环境打包在一起,这样代码就可以在任何地方运行。当容器多的时候就出现了容器编排技术Kubernetes。
容器时代网站部署架构
容器时代面临的问题
- • 需要去规划节点和Pod的CPU、内存、磁盘等资源
- • 需要编写复杂的YAML去部署Pod、服务、需要经常排查Pod出现的异常
Serverless时代
Serverless指搭建和运行不需要服务器管理的一种概念。前面三种电商网站部署方式,都属于Serverful架构
Serverless实现
- • Faas(函数即服务)
提供了运行函数代码的能力,并且具有自动弹性伸缩
- • Baas(后端即服务)
将后端能力封装成了服务,并以接口的形式提供服务
小结
- • 从物理机到虚拟机,从容器到Serverless,都是去服务器的过程
- •有了Iaas则不再关注物理机;有了Pass,不再需要关注操作系统;有了容器,不再需要关注运行环境;而Serverless的出现,不再需要关注传统的运维
Serverless概念
广义的Serverless架构
是指构建和运行软件时不需要关心服务器的一种架构思想,基于Serverless思想实现的架构就是Serverless架构
广义的Serverless解决的问题
- • 容灾备份
- • 弹性伸缩
- • 日志监控
广义的Serverless和Serverful的架构区别
- • 资源分配
不用关心应用运行的资源,只提供一份代码就行
- • 计算方式
按实际使用量计费,计费粒度也精确到了毫秒级
- • 弹性伸缩
可以快速根据业务并发扩容到更多的实例,甚至允许缩容到零实例状态来实现零计费
狭义的Serverless
基于Faas和Baas的架构,是一种计算和存储分离的架构,狭义的Serverless是Faas和Baas的组合
Faas服务
举例说明:定义要给Faas接口
- • 客户端代码定义
启动一个web服务 访问该服务的list接口
- • Faas接口代码
举例说明:Faas特点-无状态
当把函数部署到Faas,然后访问接口时,会发现得到的结果永远都是1,这是Faas的一个特点:无状态
Baas服务
Baas本质上就是把后端功能封装起来,以接口的形式提供服务
常见的Bass产品由阿里云表格存储、消息中间件等,这些服务都可以通过API进行访问
举例说明:使用表格存储实现pv统计功能
什么不是Serverless
先介绍下Paas的特点
Paas(平台即服务)是云计算虚拟机时代的主要形态之一
- • 付费标准
按资源付费,而不是按实际使用量付费
- • 弹性伸缩
只能针对底层的服务器进行扩缩容。而Serverless的弹性伸缩是请求级别的,扩容速度更快,资源利用率更高。
K8S是否为Serverless?
K8S是介于Serverful和Serverless之间的产物
- • Kubernetes本身也不是Serverless,只是在概念方面有些类似,它是一种容器编排技术,基于K8S能很方便的进行Pod的管理,并且实现应用的弹性伸缩。Pod是应用和运行环境的结合,也不用关心服务器。
- • 从运维的角度看,主流的K8S服务提供商,提供的都是K8S集群托管和运维服务
- • 开发者可以非常方便的管理集群中的硬件、存储、pod等资源,但是上层应用的运维和调度还是需要开发者自己来调度的,K8S也无法做到按代码执行的次数和实际消耗的资源来计费,还是和传统的Serverful一样按资源数量计费
云原生
云原生是指原生为云设计的架构模式。Serverless几乎封装了所有底层资源调度和运维工具,让你更加容易的使用云计算基础设施,这样极大的简化了云服务器编程
- • Serverless是云原生的一种实现
- • 云原生的另外一种实现是Kubernetes
Serverless的优点
- • 不用运维
- • 弹性伸缩
- • 节省成本
- • 开发简单
- • 降低风险
- • 易于扩展
Serverless的缺点
- • 依赖第三方服务
使用云厂商所提供的serverless产品比如FaaS和BaaS,这样就会使得业务和第三方云厂商绑定,若要换一个云厂商那么迁移成本太大。这是优点也是缺点
- • 底层硬件的多样性
应用在Faas上运行,由于底层硬件的多样性和不确定性,云厂商可以灵活的选择服务器来运行你的代码,让运行环境对应的物理环境变的不同,甚至有的函数运行在不同代的cpu上;如果代码不依赖底层cpu,那影响不大,否则可能不同的cpu的性能有差异;如果代码必须运行在某种cpu或gpu,那就需要云厂商提供这种能力。云厂商也会最小化的平衡利用资源的效率和成本
- • 应用性能瓶颈
函数运行前,先初始化函数运行的环境,这个过程需要消耗一定的时间,因为函数不是持续在线,而是运行的时候才启动。从资源利用率上,这种模式可以节省资源;从应用性能上来看,这样会降低性能,而且还要靠云厂商实现性能优化,如果你的应用对性能非常敏感,就需要考虑怎么优化性能了
- • 函数通信效率低
传统的mvc架构模式中,view层的方法调用model层方法都是在内存中运行的,而在Serverless中,函数与函数之间就完全独立了,如果两个函数之间数据有依赖,需要函数通信交换数据,这就需要函数与函数之间的调用了,相比之前的内存调用,数据交互效率明显低很多,这个问题的本质是Faas还没有比较好的数据通信协议或方案
- • 开发调试复杂
想在本地开发,调试Serverless应用比较复杂
小结
- • 广义上讲Serverless是一种架构思想
- • 狭义上讲Serverless是FaaS和BaaS的组合
- • Serverless架构主要特点是按量付费、弹性伸缩、不用运维