背景 继微服务后,无服务器(serverless)架构概念比较火热,究竟什么是serverless?它能帮助我们做什么事情?本文从概念角度对serverless架构进行解析。名词解释 severless:无服务器 baas(Backend as a Service):后端即服务 faas(Functions as a Service):函数即服务前言 无服务器计算架构属于云原生架构的一种,在这种架构模式下能够让开发者可以在不考虑服务器的情况下构建并运行应用程序和服务。这种架构模式不仅可以减免开发者对基础设施服务器或集群配置、修补、操作系统维护和容量预置等管理任务,并且能够为几乎任何类型的应用程序或后端服务构建无服务器应用程序。 无服务器体系结构本质是一种应用程序设计模式,此模式可以由第三方baas提供服务,也可以由在faas平台上托管的临时容器中运行的用户自定义代码提供服务。这种体系结构消除了对传统的始终在服务器上的组件的大量需求。无服务器架构可以从显著降低的运营成本、复杂性和工程交付周期中获益,但代价是增加对供应商依赖性。为什么要使用serverless 任何一种新的软件概念的出现总会有其目的和应用场景,那么为什么要使用serverless呢?无服务器计算能够以更高的灵活性和更低的总体拥有成本构建现代应用程序。构建无服务器应用程序意味着开发人员能够专注于他们的核心产品,能够将更多时间和精力放在开发可扩展且可靠的出色产品上,而无需担心运行服务器的存在。 serverless具有以下几点优势: 1、无服务器管理 无需预置或维护任何服务器。无需安装、维护或管理任何软件或运行时工具。 2、灵活扩展 应用程序可自动扩展,或通过切换占用资源(如吞吐量、内存)的单位数(而不是切换单个服务器的单位数)来调整容量,从而实现扩展,调整粒度会更小,更符合实际调用需求。 3、自动化的高可用性 无服务器应用程序提供内置可用性和容错功能。开发者无需构建这些功能,因为运行此应用程序的服务在默认条件下会提供这些功能。什么是serverless 无服务器指服务器端逻辑由应用程序开发人员编写的应用程序,但与传统架构不同,它运行在无状态的计算容器中,这些容器是事件触发的、短暂的,并且完全由第三方组件管理。 下面用两个实际案例来进行详细说明。 一、实例一:用户界面驱动的应用程序 以一个具有服务器端逻辑的传统三层面向客户机的系统来进行说明。 系统架构类似于下图。假设它是在服务器端用Java或Javascript实现的,客户端使用HTML+Javascript组件作为客户端: 在这种架构中,客户端相对不是很智能,其本身需要处理的业务逻辑较少,大部分业务逻辑如系统认证、页面导航、搜索功能都是由服务器应用程序统一实现的。 相同的系统如果使用了无服务器体系结构,架构图如下图所示: 虽然这只是一个非常简化的示意图,但是也能从中看到许多重大的变化: 1.新架构删除了原先的身份验证逻辑,将其替换为第三方baas服务(例如auth0); 2.允许客户直接访问数据库中的产品子库,它本身完全由第三方(例如Google Firebase)托管。针对以这种方式访问数据库的客户机,有不同于访问数据库的服务器资源的安全配置文件。 3.服务器中的某些逻辑现在在客户机中,例如,跟踪用户会话、从数据库中读取数据并将其转换为可用视图,客户机正朝着成为单页应用程序的方向发展。 4.用另一个单独的faas函数替换“购买”功能,出于安全原因选择将其保留在服务器端,而不是在客户端重新实现。它也是由一个api网关前置的。在使用FaaS时,将不同的逻辑需求分解为单独部署的组件是一种非常常见的方法。 二、实例二:消息驱动应用程序 以一个在线广告系统为例,当用户点击一个广告时,服务程序很快地将请求重定向到该广告的目标地址,与此同时,还需要收集点击发生的事件。 传统架构如下所示: 广告服务器(AD Server)同步响应用户(图中未显示此动作),并向点击消息管道发送“点击消息”。然后,该消息由更新数据库的“点击处理器”应用程序异步处理。 使用serverless架构后,如下图所示: 与我们的第一个示例相比,这里的架构变化要小得多。从整体架构来看,两者并没有什么区别。这就是为什么异步消息处理是使用无服务器架构的一个非常常用的使用场景。在这里用faas函数替换了一个长生命周期的消息使用者应用程序。此函数在供应商提供的事件驱动上下文中运行。FaaS环境还可以通过实例化功能代码的多个副本并行处理多个消息,这取决于开发者如何编写处理逻辑。