云计算的发展是从IaaS开始的,比如EC2和AWS Simple Storage Service(S3), AWS云计算的早期的推动者,并且目前也是绝对领先的云提供商,紧随AWS后面的还有微软、谷歌、阿里云等。当我们谈论“云”时,我们通常指的是公共云,但是,我们也看到了私有云的市场发展的也不错,比如Open Stack。
公共云之后的另外一个潮流是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,比如AWS的Lambda,Google的Cloud Function,但是实际上,当我们深入研究就会发现,Serverless实际上涵盖了一系列技术,我们将这些技术分为两类:Backend as a Service(BaaS)和Functions as a Service(FaaS),所以,简单的说Serverless=BaaS+FaaS。
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,都可以作为一个应用的后端服务的一部分。
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等
从表面上看,BaaS和FaaS完全不同,BaaS是托管应用程序的一部分依赖组件,FaaS托管应用程序的代码,那么为什么我们把它们放在一起,都叫做Serverless呢?
这里的关键就是你不需要管理自己的服务器主机或服务器进程,完全使用Serverless架构的应用程序,将不再需要考虑服务器或者进程,应用程序的所有逻辑,无论您是自己编写的,还是与第三方服务集成的部分,都运行在完全弹性的环境中,状态也采用以类似弹性的形式存储,无服务器并不意味着服务器已经消失,这只是意味着着您不再需要关心它们了。
在云计算过去的十年中的发展,我们已经将应用程序的运行环境和通用组件,越来越多的外包给云厂商,Serverless也同样符合这一趋势,主机管理、操作系统管理、资源分配、扩展、甚至应用逻辑的整个组件,都外包给云厂商,在成本和运营效率方面,有获得了显著的提升。
但是,在应用程序的架构方面,Serverless有很大的变化。之前的云计算服务,并没有从根本上改变我们设计应用程序的方式, 例如,当使用像Docker这样的工具时,我们在应用程序周围放置了一个更薄的“盒子”,但它仍然是一个盒子,我们的逻辑架构不会发生显着变化,在云中托管我们自己的MySQL实例时,我们仍然需要考虑工作负载所需的虚拟机的资源,而且我们仍然需要考虑故障切换。
这种情况随着Serverless而发生变化,并且是非常大的变化,FaaS本质上是和传统架构非常不一样的架构类型,是事件驱动模型,它的部署方式更加细粒度,以及需要将状态保存到FaaS组件之外,BaaS使我们无需编写完整的逻辑组件,但需要我们将应用程序与云厂商提供的特定接口和模型集成。
至于Serverless的应用程序的架构到底有什么不同之处,它看起来到底是长什么样子? 这就是我们接下来要讨论的内容。
原文链接:Serverless 系列之(2):Serverless到底是什么 - 知乎