Serverless是什么?
Serverless 架构即“无服务器”架构。它是一种全新的架构方式,是云计算(Cloud Computing)时代一种革命性的架构模式。
Serverless 是一种软件系统架构思想和方法,它的核心思想是用户无须关注支撑应用服务运行的底层主机。终端客户不需要部署、配置或管理服务器服务,代码运行所需要的服务器服务皆由云端平台来提供。
Serverless 这个词包含的信息量太大,而且适用性很广,但总结来说 Serverless 的含义有这样两种。
-
第一种:狭义 Serverless(最常见) = FaaS 架构 = FaaS + BaaS = Trigger(事件驱动)+ FaaS + BaaS
-
第二种:广义 Serverless = 服务端免运维 = 具备 Serverless 特性的云服务
名词说明
- FaaS(Function as a Service) 就是函数即服务。它可以让我们随时随地创建、使用、销毁一个函数。它还有个名字叫做无服务器运算(Serverless Computing)。
- BaaS(Backend as a Service) 就是后端即服务,持久化或第三方服务。
云服务的发展
云计算(Cloud Computing)的出现是21世纪IT业界最重大的一次变革。云计算的发展从基础架构即服务(Infrastructure as a Service:IaaS),平台即服务(Platform as a Service:PaaS),软件即服务(Software as a Service:SaaS),容器即服务(Container as a Service:CaaS),慢慢开始演变到函数即服务(Function as a Service:FaaS)以及后台即服务(Backend as a Service:BaaS),Serverless 无服务化。
XaaS(X as a Service) 就是 X 即服务,这是云服务商喜欢使用的一种命名方式。
不过这里要解决一个你可能会有的疑惑:为什么 BaaS 的出现,比 Serverless FaaS 还要早三年?那是因为早期出现的 BaaS 其实是 mBaaS(移动后端即服务),这概念当时也曾经火过一段时间,现在已经被 Google 收购的 FireBase 其实就是做的这个生意。
根据下图也可以看出,随着云服务的发展,我们需要关注的服务器的工作越来越少。
目前业界的各类 Serverless 实现按功能而言,主要为应用服务提供了两个方面的支持:函数即服务(Function as a Service,FaaS)以及后台即服务(Backend as a Service,BaaS)。
FaaS(函数即服务)
FaaS 提供了一个计算平台,在这个平台上,应用以一个或多个函数的形式开发、运行和管理。FaaS 平台提供了函数式应用的运行环境,一般支持多种主流的编程语言,如 Java、PHP 及 Python 等。FaaS 可以根据实际的访问量进行应用的自动化动态加载和资源的自动化动态分配。大多数 FaaS 平台基于事件驱动(Event Driven)的思想,可以根据预定义的事件触发指定的函数应用逻辑。
目前业界 FaaS 平台非常成功的一个代表就是 AWS Lambda 平台。AWS Lambda 是 AWS 公有云服务的函数式计算平台。通过 AWS Lambda,AWS 用户可以快速地在 AWS 公有云上构建基于函数的应用服务。
BaaS(后端即服务)
为了实现应用后台服务的 Serverless 化,BaaS(后台即服务)也应该被纳入一个完整的 Serverless 实现的范畴内。通过 BaaS 平台将应用所依赖的第三方服务,如数据库、消息队列及存储等服务化并发布出来,用户通过向 BaaS 平台申请所需要的服务进行消费,而不需要关心这些服务的具体运维。
Serverless的技术特点
为了实现解耦应用和服务器资源,实现服务器资源对用户透明,与传统架构相比,Serverless 架构在技术上有许多不同的特点。
- 按需加载
在 Serverless 架构下,应用的加载(load)和卸载(unload)由 Serverless 云计算平台控制。这意味着应用不总是一直在线的。只有当有请求到达或者有事件发生时才会被部署和启动。当应用空闲至一定时长时,应用会到达或者有事件发生时才会被部署和启动。当应用空闲至一定时长时,应用会被自动停止和卸载。因此应用并不会持续在线,不会持续占用计算资源。
- 事件驱动
Serverless 架构的应用并不总是一直在线,而是按需加载执行。应用的加载和执行由事件驱动,比如HTTP请求到达、消息队列接收到新的信息或存储服务的文件被修改了等。通过将不同事件来源(Event Source)的事件(Event)与特定的函数进行关联,实现对不同事件采取不同的反应动作,这样可以非常容易地实现事件驱动(Event Driven)架构。
- 状态非本地持久化
云计算平台自动控制应用实例的加载和卸载,且应用和服务器完全解耦,应用不再与特定的服务器关联。因此应用的状态不能,也不会保存在其运行的服务器之上,不能做到传统意义上的状态本地持久化。
- 非会话保持
应用不再与特定的服务器关联。每次处理请求的应用实例可能是相同服务器上的应用实例,也可能是新生成的服务器上的应用实例。因此,用户无法保证同一客户端的两次请求由同一个服务器上的同一个应用实例来处理。也就是说,无法做到传统意义上的会话保持(Sticky Session)。因此,Serverless架构更适合无状态的应用。
- 自动弹性伸缩
Serverless 应用原生可以支持高可用,可以应对突发的高访问量。应用实例数量根据实际的访问量由云计算平台进行弹性的自动扩展或收缩,云计算平台动态地保证有足够的计算资源和足够数量的应用实例对请求进行处理。
- 应用函数化
每一个调用完成一个业务动作,应用会被分解成多个细颗粒度的操作。由于状态无法本地持久化,这些细颗粒度的操作是无状态的,类似于传统编程里无状态的函数。Serverless 架构下的应用会被函数化,但不能说 Serverless 就是 Function as a Service(FaaS)。Serverless 涵盖了 FaaS 的一些特性,可以说 FaaS 是 Serverless 架构实现的一个重要手段。
Serverless解决了什么问题?
-
首先,Serverless 可以有效降低企业中中长尾应用的运营成本(中长尾应用就是那些每天大部分时间都没有流量或者有很少流量的应用)。Serverless 之前,这些中长尾应用至少要独占 1 台虚拟机;现在有了 Serverless 的极速冷启动特性,企业就可以节省这部分开销。
-
其次,Serverless 可以提高研发效能。SFF(Serverless For Frontend)可以让前端同学自行负责数据接口的编排,微服务 BaaS 化则让我们的后端同学更加关注领域设计。可以说,这是一个颠覆性的变化,它能够进一步放大前端工程师的价值。
Serverless的局限
世界上没有能解决所有问题的万能解决方案和架构理念。Serverless 有它的特点和优势,但是同时也有它的局限。有的局限是由其架构特点决定的,有的是目前技术的成熟度决定的,毕竟 Serverless 还是一个起步时间不长的新兴技术领域,在许多方面还需要逐步完善。
- 控制力
Serverless 的一个突出优点是用户无须关注底层的计算资源,但是这个优点的反面是用户对底层的计算资源没有控制力。对于一些希望掌控底层计算资源的应用场景,Serverless 架构并不是最合适的选择。
- 可移植性
Serverless 应用的实现在很大程度上依赖于 Serverless 平台及该平台上的 FaaS 和 BaaS 服务。不同IT厂商的 Serverless 平台和解决方案的具体实现并不相同。而且,目前 Serverless 领域尚没有形成有关的行业标准,这意味着用户将一个平台上的 Serverless 应用移植到另一个平台时所需要付出的成本会比较高。较低的可移植性将造成厂商锁定(Vendor Lock-in)。这对希望发展 Serverless 技术,但是又不希望过度依赖特定供应商的企业而言是一个挑战。
- 安全性
在 Serverless 架构下,用户不能直接控制应用实际所运行的主机。不同用户的应用,或者同一用户的不同应用在运行时可能共用底层的主机资源。对于一些安全性要求较高的应用,这将带来潜在的安全风险。
- 性能
当一个 Serverless 应用长时间空闲时将会被从主机上卸载。当请求再次到达时,平台需要重新加载应用。应用的首次加载及重新加载的过程将产生一定的延时。对于一些对延时敏感的应用,需要通过预先加载或延长空闲超时时间等手段进行处理。
- 执行时长
Serverless 的一个重要特点是应用按需加载执行,而不是长时间持续部署在主机上。目前,大部分 Serverless 平台对 FaaS 函数的执行时长存在限制。因此 Serverless 应用更适合一些执行时长较短的作业。
- 技术成熟度
虽然 Serverless 技术的发展很快,但是毕竟它还是一门起步时间不长的新兴技术。因此,目前 Serverless 相关平台、工具和框架还处在一个不断变化和演进的阶段,开发和调试的用户体验还需要进一步提升。Serverless 相关的文档和资料相对比较少,深入了解 Serverless 架构的架构师、开发人员和运维人员也相对较少。
Serverless的技术实现
搭建私有Serverless一般是使用Docker+Kubernetes。Kubernetes也叫 K8s,用于自动部署、扩展和管理容器化应用程序的开源系统,是 Docker 集群的管理工具。
Serverless架构图如下,这个过程需要很多运维技术,这里就只列出架构图,如有兴趣可再进一步研究。