导读:近期灵雀云技术专家邵明岐翻译了Mike Roberts & John Chapin所著的《What is serverless》一书的部分内容,可以说是对Serverless科普与观察的上佳素材。本文为第1篇,他首先通过回溯云计算的发展史,来找出是什么原因导致进化出了 Serverless,然后解释 Serverless 到底为何物,最后总结为什么 Serverless 是云计算成长的必然产物,同时也是应用交付方式的巨大飞跃,非常值得一读!
原著:《What is serverless : understand the latest advances in cloud and service-based architecture》
作者:Mike Roberts & John Chapin
译文来源:深入浅出谈架构(ID:deep-easy-arch)
译者:灵雀云邵明岐
让我们回到2006年, 那时候还没有 iPhone 和移动互联网,Ruby on Rails 是一个非常热门的编程框架,Web 2.0 在当时是互联网最火热的名词。那时候大部分应用程序的后端服务,都是运行在托管或者自建的数据中心和物理服务器上。
云的诞生
2006年8月发生的事情将从根本上改变这种模式。 亚马逊新的IT部门 AWS 宣布推出Elastic Compute Cloud(EC2),EC2是众多基础架构即服务(IaaS)产品中的第一个, IaaS允许公司租用计算资源 (主要是面向互联网应用的虚拟主机),而不是购买自己的服务器, 它还允许人们在几分钟之内就可以获取到主机资源。 EC2的五个主要优势是:
1.降低人工成本
在 IaaS 出现之前,公司需要雇佣有专门技能的人来管理数据中心和里面的物理服务器,他们需要管理从电源和网络,到货架和安装,到修复机器的磁盘等物理问题,到设置操作系统(OS)。 通过IaaS,所有这些都消失了,而是都交给 IaaS 服务提供商,比如 AWS 或者阿里云。
2.降低风险
在管理自己的物理服务器时,经常会遭遇一些意外事件,比如硬件故障,从而导致系统不稳定或者长时间宕机,因为硬件问题很难预测,并且可能需要很长时间才能解决。 通过IaaS,客户虽然仍需要做一些工作来对抗硬件故障发生的风险,但不再需要知道如何修复硬件, 相反,可以简单地在几分钟内申请到新机器实例,并重新安装应用程序,从而限制了这些问题的风险。
3.降低基础设施成本
在大部分情况下,当您考虑电源、网络等成本的时候,EC2实例的成本比运行自己的硬件便宜,尤其是当您只想临时需要运行主机几天或几周而不是几个月时。
4.灵活扩展
考虑到IaaS带来的扩展优势,基础设施成本显着下降,通过IaaS,公司在扩展其运行的服务器的数量和类型方面具有更大的灵活性, 不再需要提前几个月预先购买10台高端服务器,相反,您可以从一个或两个低功耗,廉价的实例开始,然后随着时间的推移逐渐扩展您的实例数量和类型。
5.交付时间短
在托管服务器的旧时代,为新应用程序采购和配置服务器可能需要数月时间。 如果你想出新的想法,并且希望尽快尝试一下,在传统的方式下很难办到。 使用IaaS,交付时间从几个月缩短到几分钟。
基础设施外包
使用 IaaS,本质上我们可以认为是基础设施外包的技术。 当我们开发和运营软件时,我们需要做的工作大致可以分为两类:一类是针对需求需要定制的工作。另外一类是和其他公司都差不多,比较通用的工作。
基础设施就是属于第二种,其范围包括物理的设备,例如运行我们机器,电路,网络等,也包括一些通用的软件功能,比如用户认证。
基础设施外包通常可以由服务提供商(SP)提供。 例如,电力由电力供应商提供,并且网络由互联网服务提供商(ISP)提供,他们通过 2 种模式来减低成本和提高效率:规模化和技术创新。
规模化
几乎所有形式的基础设施外包都通过规模化的模式来降低成本,把大量工作打包在一起批量做,成本比单独一件一件做,效率大大提高。例如,AWS 可以以远低于小公司的价格购买相同规格的服务器,因为 AWS 一次性购买成千上万的服务器,而不是购买几十台服务器。 同样,AWS 的每台服务器运营成本远低于自建 IDC 的公司。
技术创新
基础设施外包通常也部分归因于技术创新。比如 EC2,是通过硬件虚拟化的技术来实现的。在IaaS出现之前,一些IT供应商已经开始允许公司来按月租用物理服务器。显然,EC2 的按小时租用主机的方式更具吸引力,而且,虚拟化技术可以将物理服务器细分为许多更小的,快速启动和关闭的虚拟机(VM),这样 IaaS 才变得可行。
基础设施外包与 IaaS 的五大好处完全一致:
• 降低人工成本 :减少人员,减少维护基础设施工作所需的时间;
• 降低风险 :消除了一部分对特殊技能专家的需求,并且能够获得及时的运营支持能力;
• 降低资源成本 :同样功能的成本更低;
• 提高扩展的灵活性:可以访问更多资源和不同类型的类似资源,而不会造成重大损失或浪费;
• 缩短交付周期:缩短从新想法到生产可用性的交付时间;
当然,基础设施外包也有其缺点和局限性,我们将在后面的部分介绍。
云计算的发展
云计算的发展是从IaaS开始的,比如EC2和AWS Simple Storage Service(S3), AWS是云计算早期的推动者,紧随其后的还有微软、谷歌、阿里云等。当我们谈论“云”时,我们通常指的是公共云,但是,我们也看到了私有云的市场发展的也不错,比如OpenStack。
公共云之后的另外一个潮流是PaaS,Heroku是当时最受欢迎的PaaS厂商之一, PaaS层面置于IaaS之上,将操作系统(OS)添加到外包的基础架构中,使用PaaS,您只需部署应用程序,云平台负责操作系统安装、补丁升级、系统级监控、服务发现等。
Heroku是公有云服务,Cloud Foundry是PaaS的一个私有云版本, 由于PaaS位于现有虚拟化解决方案之上,因此您可以在企业内部部署或者在IaaS公共云服务上部署“私有PaaS”,同时使用公共云和私有云通常被称为混合云, 能够在混合云环境中实现一个统一的PaaS平台对企业特别有用。
在虚拟机之上使用PaaS的最新方式是使用容器,Docker在过去几年中变得非常非常受欢迎,因为它可以从操作系统开始,更清楚地描述应用程序的系统需求,而管理/编排容器的云服务,通常称为容器服务(CaaS),比如Google的Container Engine和AWS的ECS。 一些私有云的CaaS是Kubernetes和Mesos,您也可以把它们搭建在公共IaaS或者私有IaaS之上运行。
就像IaaS一样,PaaS和CaaS都是基础设施外包的另外一种更加高级的形式,它们和IaaS的主要不同之处是,有更高级别的抽象性,允许我们将运行应用的更多技术细节交给云平台,因此,PaaS和CaaS带给我们的好处,与我们之前列出的IaaS的五个好处完全一样,所以,我们可以将所有这三个(IaaS,PaaS,CaaS)组合为计算即服务(Compute as a Service)。
Serverless时代到来
前面解释了半天云计算的发展史,主要就是想引入主题——Serverless。它将会是云计算演进的下一个重要技术,也是另外一种形式的基础设施外包,它同样具有我们已经看到的云计算的五大优势,云厂商同样也是通过规模化和技术创新来提供这些优势。
Serverless 并不等于 FaaS
大部分人开始了解Serverless时,会有一个误区,以为Serverless就是FaaS,比如AWS的Lambda,Google的Cloud Function。但深入研究就会发现,Serverless实际上涵盖了一系列技术,我们将这些技术分为两类:Backend as a Service(BaaS)和Functions as a Service(FaaS),所以,简单来说Serverless=BaaS+FaaS。
BaaS
BaaS就是用现成的第三方服务替换原来自己编码实现或者自己搭建的服务器端组件,它在概念上更接近于Software as a Service(SaaS),不同之处在于SaaS通常是关于外包业务流程,比如人力资源或销售工具,或者像Github这样的服务技术工作者的产品。然而对于BaaS来说,实际上是将应用程序分解成更小的组件,并将其中一部分组件用第三方提供的服务来完成,这个第三方服务通常就叫做BaaS。
BaaS服务是通过API远程调用的组件,而不是SDK,或者Library,我们通过远程API的调用,来完成应用程序的一部分功能。这里有一个很好的例子是身份验证,许多应用程序通过自己的代码来实现注册、登录、密码管理等功能,但是这些代码在很多应用程序中非常相似,同样的事情无数的公司和团队做过了无数遍,已经非常成熟了,可以把它们抽象出来变成一个第三方公共服务再好不过,这正是Auth0和亚马逊的Cogono等产品的目标,这两种产品都允许任何人,不需要写一行代码的情况,就可以在移动应用程序和Web应用程序上实现非常完善的身份验证和用户管理功能。
BaaS最早的时候,在移动应用程序开发中特别受欢迎,一开始人们甚至把它叫做Mobile Backend as a Service(MBaaS),但是实际上,BaaS除了被用作移动应用的后端服务之外,还可以应用到非常多的场景,比如我们可以不需要自己搭建和维护Mysql实例,而是使用亚马逊的RDS服务,或者可以用Kinesis替换自己搭建和管理的Kafka消息队列,其他数据基础设施服务包括文件系统、对象存储和数据仓库、语音分析、以及我们之前提到的身份验证,这些服务都是BaaS,都可以作为一个应用的后端服务的一部分。
FaaS
Serverless的另一半是FaaS, FaaS是Compute as a Service的另一种形式,概念上容易混淆的地方在于,AWS有时候将自己的FaaS服务,Lambda,称为Serverless Compute。
FaaS是一种构建和部署服务器端软件的新方法,只不过粒度更细,能够独立的部署某一个函数,许多人认为Serverless就是FaaS,但是实际上并不完全正确。
我们通过传统方式部署服务器端软件时,从主机实例开始,通常是虚拟机(VM)实例或容器(参见下图), 然后我们在主机中部署应用程序,如果主机是VM或容器,那么应用程序是一个操作系统进程, 通常我们的应用程序中的代码实现了一些不同功能的操作,例如,Web服务提供检索和更新资源的操作。
FaaS改变了这种部署模式(如下图), 部署模型中少了主机实例和应用程序进程,我们只关注实现应用程序逻辑的各个操作和函数,将这些函数代码单独上传到云供应商提供的FaaS平台。
但是,这些函数在云服务托管的服务器进程中缺省处于空闲状态,直到需要它们运行的时候才会被激活(如下图), 通过配置FaaS平台来监听每个函数的激活事件。 当该事件发生时,FaaS平台实例化函数,然后使用触发事件调用它。
一旦该函数执行结束了,理论上FaaS平台可以销毁掉实例,不过,通常为了优化性能,会将函数实例保留一段时间,可以被下一个事件复用。
FaaS本质上是一种事件驱动的模型,除了提供托管和执行代码的平台之外,FaaS平台还集成了各种同步和异步事件源,HTTP API网关就是一种同步事件源,消息总线、对象存储或类似于(cron)的定时器就是一种异步源。
AWS在2014年就推出了Lambda,到目前为止成熟度和接受度已经获得大幅的提高,一些公司每天在使用Lambda处理数十亿的事件,到目前为止,Lambda集成了超过20种不同类型的事件源,可以支持各种不同类型的应用程序。
除了AWS Lambda之外,还有其他一些来自Microsoft,IBM,Google厂商的商业FaaS产品,正如我们之前讨论的各种其他计算即服务平台(IaaS,PaaS,CaaS)一样,也有可以运行在私有云上开源FaaS项目,私有的FaaS领域目前比较早期,没有绝对的领先者,一些比较活跃的项目有OpenWhisk、Fission、IronFuncions、Serverless、Nuclio等。
为什么FaaS和BaaS都叫Serverless?
从表面上看,BaaS和FaaS完全不同,BaaS是托管应用程序的一部分依赖组件,FaaS托管应用程序的代码,那么为什么我们把它们放在一起,都叫做Serverless呢?
这里的关键就是不需要管理自己的服务器主机或服务器进程,完全使用Serverless架构的应用程序,将不再需要考虑服务器或者进程,应用程序的所有逻辑。无论您是自己编写的,还是与第三方服务集成的部分,都运行在完全弹性的环境中,状态也采用以类似弹性的形式存储,无服务器并不意味着服务器已经消失,这只是意味着着您不再需要关心它们了。
Serverless带给云计算的重大变化
在云计算过去十年的发展中,我们已经将应用程序的运行环境和通用组件,越来越多的外包给云厂商。Serverless也同样符合这一趋势,主机管理、操作系统管理、资源分配、扩展、甚至应用逻辑的整个组件,都外包给云厂商,在成本和运营效率方面获得了显著的提升。
但是,在应用程序架构方面,Serverless有很大的变化。之前的云计算服务,并没有从根本上改变设计应用程序的方式,例如,当使用Docker这样的工具时,我们在应用程序周围放置了一个更薄的“盒子”,但它仍然是一个盒子,逻辑架构不会发生显著的变化,在云中托管MySQL实例时,我们仍然需要考虑工作负载所需的虚拟机资源,而且仍需要考虑故障切换。
这种情况随着Serverless而发生变化,并且是非常大的变化,FaaS本质上是和传统架构非常不一样的架构类型——事件驱动模型。它的部署方式更加细粒度,以及需要将状态保存到FaaS组件之外,BaaS使我们无需编写完整的逻辑组件,但需要将应用程序与云厂商提供的特定接口和模型集成。
那么,Serverless的应用程序架构到底有什么不同之处,它看起来到底长什么样子? 这是我们接下来要讨论的内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。