Serverless架构:从原理、设计到项目实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第1章 初识Serverless

1.1 什么是Serverless

近年来,IT技术的更新迭代速度非常快,每个时间点都有典型的代表名词及概念,就目前而言,人工智能领域中的机器学习、深度学习、强化学习等,还有区块链、物联网等非常火热。在云计算领域,有一种技术被众多云厂商认为是“风口项目”,甚至可以颠覆现有云计算中的某些格局,为此AWS、Google腾讯云、阿里云等云厂商都投入了大量精力进行相关产品建设,这种技术就是Serverless。

Serverless又名无服务器,所谓无服务器并非是说不需要依赖和依靠服务器等资源,而是开发者再也不用过多考虑服务器的问题,可以更专注在产品代码上,并且无须管理和操作云端或本地的服务器,同时计算资源也开始作为服务出现,而并非作为服务器的概念出现。Serverless是一种构建和管理基于微服务的架构的完整流程,允许你在服务部署级别而不是在服务器部署级别来管理你的应用部署。与传统架构的不同之处在于,它完全由第三方管理,由事件触发,存在于无状态(Stateless),暂存(可能只存在于一次调用的过程中)在计算容器内。Serverless真正做到了部署应用时无须涉及更多的基础设施建设,就可以基本实现自动构建、部署和启动服务。

众所周知,云计算的发展历程如图1.1所示,从IaaS、PaaS、SaaS到最新的BaaS、FasS等。

图1.1 云计算的发展历程

在云计算的发展过程中,从IaaS到PaaS再到SaaS的过程中,去服务器化越来越明显,如图1.2所示。

目前的Serverless去服务器化到了什么程度呢?有人这样说,无服务器架构是传统的云计算平台的延伸,是PaaS向更细粒度的BaaS和FaaS的发展,那么Serverless与FaaS有什么关系?FaaS与PaaS又有什么区别呢?

图1.2 IaaS和PaaS、SaaS的区别

微服务(Micro Service)是软件架构领域另一个热门的话题。如果说微服务以专注于单一责任与功能的小型功能块为基础,利用模组化的方式组合出复杂的大型应用程序,那么我们可以进一步认为Serverless架构可以提供一种更加“代码碎片化”的软件架构范式,我们称之为Function as a Services(FaaS)。而所谓的“函数”(Function)提供的是相比微服务更加细小的程序单元。例如,微服务可以代表为某个客户执行所有CRUD操作所需的代码,而FaaS中的函数可以代表客户所要执行的每个操作:创建、读取、更新及删除。当触发“创建账户”事件后,将通过函数的方式执行相应的“函数”。单就这一层来说,可以简单地将Serverless架构与FaaS概念等同起来。但是如果就具体的概念深刻探索,Serverless和FaaS还是不同的,UC Berkley发表过一篇关于Serverless观点的文章:Serverless Computing:One Step Forward,Two Steps Back参考地址[1]。全书参考地址列表可到“博文视点”官网获取。

因此,云提供商很快就会强调Serverless并非不存在服务器,也并不仅仅是FaaS。它是由“Standard library”支持的FaaS:即由供应商(例如AWS、阿里云、腾讯云等)提供各种底层能力。对于AWS而言,这种底层能力包括S3(Large object storage)、DynamoDB(Keyvalue storage)、SQS(Queuing services)、SNS(Notification services)等,这些能力也可以称为BaaS。这些基础设施或者说底层能力由AWS管理和运营,开发人员只需注册使用相应服务即可,开发人员通过编写函数代码,使其运行在FaaS平台上,在适当的时候,可以使用这些底层能力,并且“即付即用”,即按量付费。

其中关于One Step Forward及Two Steps Back的说法大概如下:

One Step Forward:

通过提供Autoscaling(自动伸缩,也称为自动扩缩容),今天的FaaS产品向云编程迈出了一大步,提供了一个实际上可管理的、看似无限的计算平台。参考地址[2]。

Two Steps Back:

首先,它们(Serverless架构)忽视了高效数据处理的重要性,即在Function的情况下,每个Function是独立的,Function之间的交互是通过持久或临时的存储、事件驱动来完成的,导致了完成交互的时间比以前慢了很多很多;其次,也阻碍了分布式系统的开发,即通常分布式系统会依赖很多的类似leader election协议、数据一致性、事务机制等,而这些在目前的FaaS类型的平台里是很难实现的。

FaaS与PaaS的概念有许多相似的地方,人们甚至认为FaaS就是另一种形式的PaaS,但是Intent Media的工程副总裁Mike Roberts有自己的不同看法:

Most PaaS applications are not geared towards bringing entire applications up and down in response to an event, whereas FaaS platforms do exactly this.(大多数PaaS应用程序都不适合响应事件而对整个应用程序进行调整,而FaaS平台是可以这样做的。)

FaaS和PaaS在运维方面最大的差异在于缩放能力。对于大部分PaaS平台,用户依然需要考虑缩放。但是对于FaaS应用,这种问题完全不存在。就算将PaaS应用设置为自动缩放,依然无法在具体请求的层面上进行缩放,而FaaS应用在成本方面少很多。AWS云架构战略副总裁Adrian Cockcroft曾经针对两者的界定给出了一个简单的方法:

If your PaaS can efficiently start instances in 20ms that run for half a second, then call it serverless.(如果PaaS可以在20ms内有效地启动运行半秒的实例,那么它就可以被称为Serverless架构。)

正因为Serverless与PaaS的不同,以及Serverless与FaaS和BaaS的关系,所以有人说Serverless真正实现了当初云计算的目标,更有人这样定义Serverless:

Serverless=BaaS+FaaS+…

诚然,这种说法未必是百分之百准确的,就像Martin Fowler的一句话:Like many trends in software, there's no one clear view of what Serverless is.但是不可否认的一点是Serverless在很多层面、很多领域,越来越显现出“期望中云计算”的样子了。Martin Fowler在 Serverless Architectures中对Serverless这样定义:

· Serverless was first used to describe applications that significantly or fully incorporate third-party, cloud-hosted applications and services, to manage serverside logic and state.These are typically“rich client”applications—think single-page web apps, or mobile apps—that use the vast ecosystem of cloud-accessible databases(e.g., Parse, Firebase), authentication services(e.g., Auth0, AWS Cognito), and so on. These types of services have been previously described as“(Mobile)Backend as a Service", and I use "BaaS" as shorthand in the rest of this article.

· Serverless can also mean applications where server-side logic is still written by the application developer, but, unlike traditional architectures, it's run in stateless compute containers that are eventtriggered, ephemeral(may only last for one invocation), and fully managed by a third party. One way to think of this is“Functions as a Service”or“FaaS”.(Note: The original source for this name—a tweet by @marak—is no longer publicly available.)AWS Lambda is one of the most popular implementations of a Functions-as-a-Service platform at present, but there are many others, too.

通过Martin Fowler的描述可以大概用图1.3来总结Serverless与FaaS及BaaS的关系。

图1.3 Serverless与FaaS、BaaS关系图

讲到此处,想必各位读者已经对Serverless及FaaS、BaaS、SaaS、PaaS、IaaS等都有了一定的了解,同时对什么是Serverless也有了比较清晰的基本认识,那么Serverless在实际项目中到底有什么具体表现呢?此处以一个Web项目为例,当我们做一个Web项目的时候,用户通过浏览器获得数据的流程,如图1.4所示。

图1.4 Web项目传统结构图

这里面服务器中可能涉及路由规则、鉴权逻辑及其他各类复杂的业务代码,同时开发团队要花很多精力在服务器的运维上面,包括客户量突然增多时是否需要扩容服务器,服务器上的脚本、业务代码等是否还在健康运行,是否有黑客在不断地对服务器发起攻击。当我们切换到Serverless的逻辑之后,就变成了如图1.5所示的结构。

图1.5 Web项目Serverless架构下的结构图

可以看出,在这个结构下,在客户端和数据库未发生变化的前提下,服务器变化巨大,之前需要开发团队维护的路由模块及鉴权模块都接入了服务商提供的API网关系统及鉴权系统,开发团队无须再维护这两部分的业务代码,只需要持续维护相关规则即可。业务代码也被拆分成了函数粒度,不同函数表示不同的功能。同时,在这个结构下,我们已经看不到服务器了,因为Serverless的目的是让使用者只关注自己的业务逻辑,所以部分安全问题、资源调度问题(例如用户量暴增时如何实现自动扩容等)交给云厂商负责。传统项目无论是否有用户访问,服务都在运行中,都有成本支出,而在Serverless架构下,只有在用户发起请求时,函数才会被激活并且执行,从而节约了成本。更多Serverless架构的优势、应用场景和价值等,会在后续章节详细说明。

总而言之,Serverless技术是在传统容器技术和服务网格上发展起来的,更侧重让使用者只关注自己的业务逻辑。它是云计算发展到一定阶段的必然产物,云计算作为普惠科技,发展到最后一定是绿色科技(最大限度地利用资源,减少资源浪费)、大众科技(成本低,包括学习成本及使用成本),而Serverless将很好地诠释这些!