Serverless简介
概念
Serverless的全称是Serverless computing无服务器运算,又被称为函数即服务(Function-as-a-Service,缩写为 FaaS),是云计算的一种模型。以平台即服务(PaaS)为基础,无服务器运算提供一个微型的架构,终端客户不需要部署、配置或管理服务器服务,代码运行所需要的服务器服务皆由云端平台来提供。 国内外比较出名的产品有Tencent Serverless、AWS Lambda、Microsoft Azure Functions 等。
Serverless称为微服务运算,但不代表它真的不需要服务,而是说开发者再也不用过多考虑服务器的问题,计算资源作为服务而不是服务器的概念出现。Serverless是一种构建和管理基于微服务架构的技术,允许开发者在服务部署级别而不是服务器部署级别来管理应用部署,你甚至可以管理某个具体功能或端口的部署,以便让开发者快速迭代,更快速地开发软件。
以亚马逊的AWS Lambda为案例,Lambda能让不用思考任何服务器,也就是说,不用你处理服务器上的部署、服务器容量和服务器的扩展和失败容错,还有服务器上选择什么OS操作系统,语言的更新,日志等等问题。
目前,Serverless 仍然处于探索和发展阶段,并且对于Serverless也没有一个权威的定义,不过我们仍然可以从以下几个方面来理解它: - Serverless代表的是一种服务理念或模式。这种服务理念希望用户无需关注除了业务逻辑本身之外的主机管理、服务运维、配置等事务,不需要关注运营维护问题。也即是说,只要有了Serverless,几乎可以不需要再考虑Devops工作流。 - Serverless是一种软件系统架构方法,并不代表某种技术。通常我们称Serverless 为一种架构而不是某种技术框架。 - Serverless是一种云服务产品形态。通常我们称Serverless为一种产品,比如各大厂商推出的各种 Serverless 服务或能力、封装的 API 网关等产品。
当前业界最常见的 Serverless 实现方案为 FaaS(函数即服务) + BaaS(后端即服务),我们经常听到的「云服务」就是基于 FaaS + BaaS 架构。
Serverless历史
Serverless 架构是云的自然延伸,为了理解 Serverless,我们有必要回顾一下云计算的发展。
IaaS
2006 年AWS 推出 EC2(Elastic Compute Cloud),也是目前公认的第一代 IaaS(Infrastructure as a Service),用户可以通过 AWS 快速的申请到计算资源,并在上面部署自己的互联网服务。IaaS 从本质上讲,是服务器租赁并提供基础设施外包服务,就比如我们用的水和电一样,我们不会自己去引入自来水和发电,而是直接从自来水公司和电网公司购入,并根据实际使用付费。
EC2 真正对 IT 行业带来的改变是硬件的虚拟化,并且 EC2 给用户和行业带来了以下五个好处。 - 降低劳动力成本:减少了企业本身雇佣IT人员的成本。 - 降低风险:不用再像自己运维物理机那样,担心各种意外风险,EC2 有主机损坏,再申请一个就好了。 - 降低基础设施成本:可以按小时、周、月或者年为周期租用 EC2。 - 扩展性:不必过早的预期基础设施采购,因为通过云厂商可以很快的获取。 - 节约时间成本:快速的获取资源开展业务实验。
Pass
相信很多人都听说过Paas,那什么是Paas呢?PaaS(Platform as a Service)是构建在 IaaS 之上的一种平台服务,提供操作系统安装、监控和服务发现等功能,用户只需要部署自己的应用即可,最早实现商业PaaS的是Heroko ,以及开源的 PaaS——Cloud Foundry,用户可以基于它来构建私有 PaaS,如果同时使用公有云和私有云,如果能在两者之间构建一个统一的 PaaS,那就是“混合云”了。
在 PaaS 上最广泛使用的技术就要数 Docker 了,因为使用容器可以很清晰的描述应用程序,并保证环境一致性。管理云上的容器,可以称为是 CaaS(Container as a Service),如 GCE(Google Container Engine),也可以基于 Kubernetes、Mesos 这类开源软件构件自己的 CaaS。
PaaS 是对软件的一个更高的抽象层次,已经接触到应用程序的运行环境本身,可以由开发者自定义,而不必接触更底层的操作系统。
Serverless
历史上第一个 Serverless 平台可以追溯到 2006 年的 Zimki(该公司已倒闭),这个平台提供服务端 JavaScript 应用,虽然他们没有使用Serverless 这个名词,但是他们是第一个“按照实际调用付费”的平台。而真正第一个使用 Serverless 名词的是 iron.io。
不过,Serverless 真正流行起来还的是 2014 年亚马逊推出的 AWS Lambda,然后其他公司也陆续跟进,比较出名的有2016 年推出 Google Cloud 与 IBM 等厂商。而国内的要属阿里云和腾讯云起步最早,也最成功。
FaaS 和 IaaS、PaaS 的区别
如下图所示,FaaS 不仅给用户提供了标准的 Runtime,同时在应用层也帮用户管理了请求的调度。开发者只需要聚焦在核心业务逻辑开发,按照函数的粒度去编写代码。而与底层硬件相关的资源维护,则交给更加专业的云厂商来搞定。
因此,对于用户来讲,可以把更多的精力和时间放在业务上。而 IaaS 和 PasS,则均需要用户去运维云主机或者容器集群、搭建业务所需的运行环境。
Serverless的应用场景
虽然 Serverless 的应用很广泛,但是也有使用上的局限性,Serverless 比较适合的场景有以下一些: - 异步的并发,组件可独立部署和扩展 - 应对突发或服务使用量不可预测(主要是为了节约成本,因为 Serverless 应用在不运行时不收费) - 短暂、无状态的应用,对冷启动时间不敏感 - 需要快速开发迭代的业务
基于此,我们发现,Serverless非常适合做实时文件处理、周期性的数据处理和移动及 Web 应用后端等。下面,我们通过一个游戏应用为例来说明什么是 Serverless 应用。
通常,一款移动端游戏至少包含如下几个特性: - 移动端友好的用户体验 - 用户管理和权限认证 - 关卡、升级等游戏逻辑,游戏排行,玩家的等级、任务等信息
那么,应用的架构应该是下面这样的。
所以,技术可能是下面这样的: - 一个 app 前端,iOS 或者安卓 - 用 Java 写的后端,使用 JBoss 或者 Tomcat 做 server 运行 - 使用关系型数据库存储用户数据,如 MySQL
不过,这样的架构虽然开发起来比较容易,但是维护起来确十分复杂,前端开发、后端的开发都需要十分专业的人员、环境的配置,还要有人专门维护数据库、应用的更新和升级。而如果使用Serverless架构,那么看起来可能是下面这样的。
可以发现,在 Serverless 架构中,我们不再需要在服务器端代码中存储任何会话状态,而是直接将它们存储在 NoSQL 中,这样将使应用程序无状态,有助于弹性扩展。前端则可以直接利用 BaaS 而减少后端的编码需求,这样架构的本质上是减少了应用程序开发的人力成本,降低了自己维护基础设施的风险,而且利用云的能力更便于扩展和快速迭代。
Serverless的缺点
Serverless作为一种全新的技术架构,具有很多的优点,如降低运营成本、降低运维需求、降低人力成本和减少资源开销等。不过,Serverless也并不是一点缺点也没有,下面我们来看一下Serverless架构的缺点。
状态管理
要想实现*的缩放,无状态是必须的,而对于有状态的服务,使用 Serverless 这就丧失了灵活性,有状态服务需要与存储交互就不可避免的增加了延迟和复杂性。
延迟
应用程序中不同组件的访问延迟是一个大问题,我们可以通过使用专有的网络协议、RPC 调用、数据格式来优化,或者是将实例放在同一个机架内或同一个主机实例上来优化以减少延迟。而 Serverless 应用程序是高度分布式、低耦合的,这就意味着延迟将始终是一个问题,单纯使用 Serverless 的应用程序是不太现实的。
本地测试
Serverless 应用的本地测试困难是一个很棘手的问题。虽然可以在测试环境下使用各种数据库和消息队列来模拟生产环境,但是对于无服务应用的集成或者端到端测试尤其困难,很难在本地模拟应用程序的各种连接,并与性能和缩放的特性结合起来测试,并且 Serverless 应用本身也是分布式的,简单的将无数的 FaaS 和 BaaS 组件粘合起来也是有挑战性的。