介绍
- 作为一个热门词汇,Serverless并不孤单,和它一起受到广泛关注的还有诸如微服务(Microservice)、容器(Container)和云等。其实这些技术之间有着很强的关联关系。正确地理解Serverless和其他技术的关系,是正确理解Serverless架构的一个重要基础。要深入理解Serverless,需要结合当下业界发展的整个大环境和趋势进行思考。
云计算
从私有数据中心到云
- 按所管控的计算资源的范围来划分,云计算模式可以分为基础架构即服务(Infrastructure as a Service)、平台即服务(Platform as a Service,PaaS)以及软件即服务(Software as a Service,SaaS)。
- 在云计算传统的私有数据中心架构中,让一个应用服务上线跑起来,用户需要负责管理和维护底层网络、存储和主机,到操作系统、中间件,以及应用的开发、部署及运维。
- 在传统的架构模式中,每上线一个应用服务,都要求用户对架构堆栈中每一个层次的服务进行配置和维护,这极大地拖慢了整体的流程效率,传统的架构限制了生产力的发展,于是云计算的变革悄然而至
IaaS、PaaS与SaaS
在IaaS架构中,应用架构底层的网络、存储和计算资源(主机、物理机或虚拟机),由云平台供应商(Cloud Provider)提供和运维。用户在云平台上付费申请所需的网络、存储和计算资源,云平台供应商在一定时间内提供。对于云平台供应商而言,集中化和规模化地运维及供给使得基础架构资源的成本更低,这是一个不可多得的商机
PaaS平台提供了应用的运行环境(如应用运行时)、应用依赖的服务(如数据库、中间件、负载均衡、构建服务、发布服务)以及底层所需的计算资源,用户可以把精力集中在应用的开发和创新上。PaaS模式可以提高应用开发、发布和运维的整体效率,有效缩短了应用上市的时间(Time to Market)
SaaS模式下,用户完全不用管理任何应用和基础设施,从而变成云服务的消费者
Serverless与云计算
- Serverless是云计算变革过程中的一个必然产物。Serverless架构实现的一个重要基础是函数即服务(Function as a Service,FaaS)。
- FaaS的灵活度和管理成本介于PaaS和SaaS之间。相对于PaaS而言,FaaS有更高的抽象程度和更低的管理成本。相对于SaaS来说,FaaS用户有更高的控制力和灵活度。Serverless架构是对开发和运维的一场解放运动,让用户的焦点回到用户应该关注的地方
- 云计算的不断发展是Serverless发展和流行的最大推动因素。Serverless是云计算未来发展的一个方向
微服务
从SOA到微服务
- 在SOA架构下,应用通过服务暴露功能,实现了彼此信息的交换和集成,使得通过服务的组合和编排形成新的应用系统成为可能。但是多个模块和功能仍然被包含在同一个应用中、同一个交付件中
- 微服务架构(Microservice Architecture,MSA)提倡将应用化整为零,减小颗粒度
- 大型的应用(Monolithic Application)按照一定的规则被拆分成若干个颗粒度更小的应用。这些细小的应用称为微服务(Microservice)
微服务的价值与挑战
-
微服务增加了应用架构的灵活度,为应用的开发和交付带来了价值
更清晰的权责
更快速的开发和交付节奏
更灵活的资源扩展
-
微服务架构在带来价值的同时也带来了一些新的挑战
- 团队组织变化:应用架构的改变也将导致开发应用的开发团队结构发生变化
- 运维复杂度:运维管理的应用实例数将大大增加。微服务架构下工作量呈指数级增长。
- 微服务治理:微服务之间的通信、调用链的跟踪管理、状态监控、错误跟踪排查等都需要相应的解决方案
2.2.3 Serverless与微服务
微服务 | Serverless | |
---|---|---|
功能结构 | 最小成员单位是微服务 | 最小成员单位是函数 |
强调 | 化整为零,提高应用架构灵活度 | 强调的是“减负”,将服务器移出用户的管理职责范围,降低复杂度和成本 |
成本 | 架构上带来灵活性的同时,也增加了开发、部署和运维的复杂度 | 开发和运维的效率更高,管理成本更低 |
容器
容器技术的兴起
- 对于很多用户而言,云和非云环境并不是二选一,而是两者都需要。云和非云环境在相当长的一段时间内将同时存在。应用如何快速地在云和非云环境中迁移成为一个重要的问题。为了有更高的可用性,避免厂商的锁定,一些实力雄厚的客户往往同时是多家云平台供应商的客户。因此实现应用在不同云环境中的快速迁移也成为一个重要的需求
- 容器(Container)技术的出现为前文提及的问题提供了一个很好的解决方案。经过几年的迅速发展,容器已经不容置疑地成为云计算的一项关键基础技术。Docker(现在已经更名为Moby项目)已成为容器引擎的事实标准。Kubernetes也在竞争中脱颖而出,成为容器编排(Orchestration)平台的事实标准。通过Kubernetes这样的容器编排平台,容器镜像可以快速地被部署到成百上千的主机上。Kubernetes成为一种类似操作系统的存在,有的人认为Kubernetes就是一种云操作系统。传统的操作系统只管理一台主机上的CPU、内存、磁盘和网络资源,而Kubernetes则掌控着数据中心中成百上千台主机的资源。
Serverless与容器
- 容器架构中最小的运行单元是容器,而Serverless中则是函数。容器应用一般是预先部署,然后持续在线。而在Serverless架构中,应用是按需加载和执行的。这意味着理论上Serverless的资源使用效率更高。
- 其实,容器技术可以是Serverless架构实现的一个基础。容器平台的最小运行单元为容器,虽然目前容器内一般运行的是一个完整的应用,但是将容器内运行的对象变成函数显然并无技术困难。Kubernetes上默认没有事件触发的支持,无法做到按需部署容器应用。但是通过Kubernetes叠加上一些FaaS框架运行包含函数逻辑的容器,用户很容易使Kubernetes具备FaaS服务的能力,容器必将是未来私有云构建Serverless能力的一个重要实现基础。
PaaS
以应用为中心
- 从技术标准上而言,早期的PaaS可以说是百家争鸣,每一个厂商都有自己的一套技术堆栈,随着容器技术的流行,目前PaaS平台开始支持容器作为应用的交付件,这使得应用在各个PaaS之间有更好的可移植性。
Serverless与PaaS
- 目前一些主流的PaaS平台和Serverless平台,主要差异在于:
PaaS | Serverless | |
---|---|---|
管理颗粒度 | 对应用颗粒度的管理以应用为单位 | 细致到每个应用的函数 |
应用部署模式 | 应用是持续地被部署在主机、虚拟主机、容器 | 按需部署,这是Serverless的按用量付费(Pay-As-You-Use)模型的基础 |
作业类型 | 包含长时间运行的应用(如各类Web应用和业务系统)和定时执行的短期任务(如数据分析抽取任务) | 偏向于执行时间跨度比较短的任务 |
实例 | 存在应用实例数这一概念的,用户需要设置每一个实例的CPU和内存的使用大小以及需要的实例数 | 将实例数的概念移除了 |
- 当前许多PaaS平台也开始支持容器,或是以容器作为技术架构的基础,如Red Hat的OpenShift就是一个以Docker和Kubernetes为基础的开源容器PaaS。基于这种容器PaaS平台,结合FaaS和BaaS框架的支持,用户可以实现私有的Serverless平台
FaaS
Serverless实现的基础
-
函数即服务(Function as a Service,FaaS)是当前Serverless实现的技术基础。每一个函数完成一个相对简单的业务逻辑,一个完整的应用由若干个函数组成。因为FaaS和Serverless的关系密切,因此FaaS的特点同时也是Serverless平台的特点:
- 抽象了底层计算资源
- 按使用量付费
- 自动弹性扩展
- 事件驱动
FaaS是当前Serverless实现的重要基础,所以有一部分人认为Serverless就是FaaS。这是狭义上的Serverless。
FaaS的架构
目前,业界有多种FaaS的实现方案,如公有云的AWS Lambda、Microsoft Azure Fun-ctions、Google Cloud Functions,私有云的OpenWhisk、Fn、Kubeless等。
-
宏观来看,一个FaaS平台的架构中包含如下主要组件:
- 函数定义(Function Definition):一个函数实现一个业务逻辑
- 函数实例(Function Instance):在运行状态的应用函数的实例
- 控制器(Controller):负责应用函数的加载、执行等流程的管理
- 事件(Event):事件驱动架构中的事件
- 事件源(Event Source):事件驱动架构中的事件来源。可以是一个数据库中插入了新的记录,也可以是一个目录里删除了一个文件,或者是消息队列收到了新的消息
- 触发规则(Trigger Rule):定义事件与函数的关系及触发的规则
- 平台服务(Platform Service):支撑应用运行的各类底层服务,如计算资源、数据存储等
函数的生命周期
- 在FaaS上一个函数从创建到执行的生命周期
- 用户根据所选定的FaaS平台的规范进行函数应用的开发。
- 编写好的函数将上传至FaaS平台。平台将负责编译和构建这些函数,并将构建的输出保存。
- 用户设置函数被触发的规则,将事件源与特定版本的函数进行关联。
- 当事件到达且满足触发规则时,平台将会部署、编译构建后的函数并执行。平台将监控函数执行的状态,根据请求量的大小,平台负责对函数实例进行扩容和缩容
函数工作流
- 当涉及多个函数执行时,就需要有逻辑处理执行的顺序、错误重试、异常捕获以及状态传递等细节。
- 一些FaaS实现开始提供针对FaaS函数的流程编排服务或工具,以简化FaaS应用的流程编排,如AWS Step Functions和Fission Workflows
BaaS
BaaS的价值
- 后端即服务(Backend as a Service,BaaS)
- 通过BaaS平台,用户的应用程序可以对接后端的各种服务,省去了用户学习各种技术和中间件的成本,降低了应用开发的复杂度。BaaS的服务往往由服务供应商提供,用户无须关心底层细节,无须维护相关资源
广义的Serverless
- 广义的Serverless包含FaaS和BaaS两个方面。FaaS解决了应用本身的“无服务器”化,BaaS解决了应用依赖的第三方服务的“无服务器”化。当应用和其依赖的服务都实现了“无服务器”化时,这个应用才算是完整的Serverless应用。
NoOps
无人运维吗
- NoOps,中文直译为“无运维”,或许翻译为“无人运维”更为合适。知名的市场调研公司Forrester于2011年发表的报告《Augment DevOps With NoOps》中提出了NoOps这一概念。它们认为随着云计算的不断演进、IT自动化程度的不断完善、IT自服务程度的不断提高以及应用架构的自扩展和自恢复的实现,IT将进入无须人工运维的阶段
“无服务器”与“无人运维”
- NoOps和Serverless都存在“无”的概念。在Serverless架构下,运维人员不再需要关注底层的基础架构,但是还是需要有人对应用的整体运营状态进行维护。运维关注的焦点会从以往的基础架构转移到云服务和应用的运维上。运维人员有更多的时间关注对业务更有价值的地方,如服务的用户体验,而非系统宕机时间
DevOps
DevOps是一种IT的治理理念,这种理念强调和谐的开发(Develop)和运维(Operation)的协作,以便为IT提供更可靠和更高质量的交付,从而提升IT的效率和对业务的响应速度。DevOps不仅仅是简单的工具,它还涉及一个企业或组织的文化和流程。
Serverless架构极大地改变了应用开发、部署和运营的模式,对软件的开发、测试与运维人员的协助模式和关系产生巨大的影响。DevOps所倡导的协作、分享和精益的文化对Serverless的推行而言有着很大益处。
云原生应用
因云而生
云将会是主流的应用运行平台,是应用的标准运行环境。所谓的云原生应用(Cloud Native Application)是指充分利用云平台的各种功能和服务所设计的应用程序。未来的应用要充分利用云上的各种设施和功能,最大限度地加速应用的开发、部署和运营,使云的价值最大化
云平台是云原生应用的运行基础环境。微服务为云原生应用提供了架构层面的指导思想。容器将会是云原生应用的一种重要交付格式,保证了云原生应用的可移植性。DevOps为云原生应用的开发、交付和运营提供了思想层面的指导
Serverless与Cloud Native
Serverless应用满足了云原生应用的定义,充分利用了云平台的各种能力,极大地提高了应用开发、交付和运维的效率。因此,Serverless应用是原生应用的一种实现,Serverless架构是用户通向云原生应用的道路之一
云原生计算基金会(Cloud Native Computing Foundation,CNCF)是一个专注于推广和标准化云原生技术的组织,目前成员超过100个,包括Google、Amazon、微软、阿里巴巴、华为、Red Hat、Cisco、IBM、Oracle等。云计算领域中许多备受关注的前沿项目都归属于CNCF,如容器编排平台Kubernetes、日志收集器Fluentd、高性能远程调用协议gRPC以及性能指标收集方案Prometheus等。Serverless的流行也受到了CNCF的高度关注,CNCF在2018年发布了Serverless白皮书,探讨了Serverless在云原生计算中的价值以及CNCF在Serverless领域的未来动向
小结
- 要完整认识一个事物,除研究这个事物本身之外,还要了解其所在的生态系统。Serverless是云计算变革的一个产物,是构建云原生应用的一种模式和思想。通过这种思想,结合云计算相关技术,用户可以用更低的成本构建更高性能、更易于扩展及更高可用的云应用
文献
- ThoughtWorks的Martin Fowler的文章《Micro-services Guide》地址:https://martinfowler.com/microservices/
- 《开源容器云OpenShift》
- AWSStepFunctions主页:https://aws.amazon.com/stepfunctions/
- 《Augment DevOps With NoOps》阅读地址:https://www.forrester.com/report/Augment+DevOps+With+NoOps/-/E-RES59203
- CNCF Serverless白皮书参考地址:https://github.com/cncf/wg-serverless/tree/master/white-paper
名词解释
TTM:应用上市的时间(Time to Market)
Microservice:微服务
CNCF:云原生计算基金会(Cloud Native Computing Foundation)
CNA:云原生应用(Cloud Native Application)
DevOps:开发(Develop)和运维(Operation)
FaaS:函数即服务(Function as a Service)
IaaS:基础架构即服务(Infrastructure as a Service)
PaaS:平台即服务(Platform as a Service)
SaaS:软件即服务(Software as a Service)
MSA:微服务架构(Microservice Architecture)
Monolithic Application:大型的应用
Pay-As-You-Use:按用量付费
-
BaaS:后端即服务(Backend as a Service)