1.2 Serverless是一种理念
在了解了为什么会出现 Serverless 技术及其背后的价值之后,我们再看看广义上Serverless 架构的特征是什么;同时我们将从前端研发的视角,讨论目前哪些服务可以被认为是Serverless 架构的。
针对一种服务,我们可以通过以下几个问题来判断它是否是 Serverless 架构的。如果对于你提供的这项服务,无法明确地回答下面几个问题,那么可以认为这项服务是 Serverless 架构的。这些问题如下:
◎ 我们有多少台机器?
◎ 这些机器部署在哪里?
◎ 机器运行的是什么操作系统?
◎ 机器上安装了哪些软件?
带着这些问题,让我们来看看下面这几个我们常用的产品和服务。
对于开发者来说,GitHub 是其再熟悉不过的代码托管产品了。GitHub 有一个众所周知的服务,即 GitHub Pages,如图1-1所示。通过 GitHub Pages,开发者可以直接将托管在 GitHub仓库中的代码文件部署为一个静态站点,同时系统将对这个站点分配一个域名,最终可以直接在浏览器中访问该站点。这是一个十分方便的服务。开发者无须自己申请服务器,也无须自己安装操作系统、软件,以及进行各种配置;只需要选择一个仓库,然后进行简单的设置,就可完成站点的部署和发布。
图1-1 基于 Serverless 理念的 GitHub Pages 服务
除了 GitHub Pages,另一个前端研发人员非常熟悉的服务是 CDN (Content Delivery Network,内容分发网络)。无论是 HTML、CSS 还是 JS 文件,我们都通过 CDN 进行分发。同样,它也是一个易于使用的服务。当我们把静态资源文件,通过云计算供应商的控制台或命令行工具上传后,这些文件将被自动分发到全球各个 CDN 节点。我们无须关心 CDN 的技术细节,如全球有多少个节点、这些节点是如何分布的,等等;我们只需要告诉 CDN 服务我们需要分发的文件即可,之后这些文件将被分发到它们应当被分发至的机房,以实现提高用户访问速度的目的。
基于上面的这两个例子可以看出,凡是将计算资源以服务的方式来提供的产品,都可以认为是符合 Serverless 理念的。因为它们将真正的技术细节屏蔽在这些服务内部,所以开发者无须知道这些计算资源是如何提供的。除了静态站点托管以及 CDN 服务,在以阿里云为代表的云计算供应商那里,还有更多的服务以这种形式提供。比如,用于保存大量文件的 OSS(Object Storage Service,对象存储服务)、用于存储数据的 RDS(Relational Database Service,关系型数据库服务)、用于协调多个服务的消息机制 MQS(Message Queue Service,消息队列服务)等都属于某种意义上的 Serverless 服务。不过这些服务均用于特定场景的技术产品,往往作为系统架构中的一环来使用。那么,有没有一种更通用的提供计算资源的 Serverless 服务呢?
Google 在 2008 年推出了 GAE(Google App Engine)产品,它是一个用于托管 Web 应用程序的平台。GAE 不像普通的虚拟机服务(如 AWS 的 EC2 或阿里云的 ECS),它对运行在上面的 Web 应用程序代码增加了诸多限制和要求。和虚拟机服务相比,其主要包括以下几个方面的不同:
◎ 仅支持特定的几种语言,包括 Python、Java、PHP 和 Go。
◎ 运行环境的类库使用会受到限制,仅允许使用在白名单中的类库。
◎ 只能提供 Web 服务,该服务只能被 HTTP 请求触发。
◎ 对于托管 Web 应用的服务器,开发者对其文件系统只有读取权限,不能写入或者修改文件。
Google App Engine(GAE)通过上述这些限制,使得用户的 Web 应用程序可以运行在统一的应用框架中。这种应用程序与应用框架以约定的方式实现解耦的设计,使平台可以实现一些在虚拟机服务场景下无法实现的能力。这里面最为主要的能力为自动扩容/缩容,此外,还提供了统一的日志监控和异常处理等功能。图 1-2 即展示了一个基于 GAE 的 Web 应用架构示例。
图1-2 基于 GAE 的 Web 应用架构示例
在这之前,对于这种提供给非特定场景的通用技术产品,要实现自动扩容/缩容是十分困难的;因为不同的 Web 应用可能使用的是不同的语言、不同的 Web 框架,还会依赖不同的第三方类库或软件。而 GAE 通过约定的方式,将这些不同点全部统一起来维护,从而抹平了不同 Web 应用程序之间的差异,使得一种能够在所有 Web 应用程序中通用的自动扩容/缩容能力得以实现。
这种通过交出一些权利(如选择操作系统、开发语言、应用框架的自由),得到某种保护(如应用稳定性的保障)的模式,在其他领域也是十分常见的。正如《社会契约论》的作者卢梭对权利的描述:“人们应当建立一种相互间的承诺,它要求我们每个人都需要将一部分权利交给主权者,从而使自己的其他权利得到更好的保护。”这就是社会契约的基本原则。
站在应用研发和部署的角度,我们一直在这条道路上不断深入,这可以被称为“云计算的契约”:从物理机到虚拟机,我们交出了选择机器配置的权利,得到了更易于迁移和维护的统一虚拟机;再从虚拟机到容器,我们交出了控制操作系统的权利,得到了更轻量化、更省资源的 Linux 容器。同样在 GAE 中,我们交出了选择语言、应用框架的权利,得到了更稳定的、更易于水平伸缩的应用容器。我们只需要遵照它所提供的框架编写和部署 Web 应用程序,就能更轻松地保障应用程序的稳定性,无须担心因流量的激增而导致服务不可用;同时,自动部署的监控系统也能使程序出现异常时立即收到通知。
我们不断地交出设备控制权,将注意力聚焦于业务。那些与业务无关的技术细节都由云计算供应商进行封装,这就是云计算的本质。而 GAE 的出现则弥补了通用型 Web 计算服务的空缺,开发者只需要根据自己的业务需求开发并部署应用代码即可。
然而,GAE 仅仅是 Serverless 服务的雏形。虽然从广义上来讲,上面这些服务都属于Serverless 理念的范畴,但当时并没有明确的定义。云计算供应商只是将“屏蔽技术细节,让开发者开箱即用”作为一种云计算产品的理念来践行。
那么我们今天所说的 Serverless 一词是在何时被提出的呢?