在目前主流云计算IaaS(Infrastructure-as-a-Service,基础设施即服务)和PaaS(Platform-as-a-Service,平台即服务)中,开发人员进行业务开发时,仍然需要关心很多和服务器相关的服务端开发工作,比如缓存、消息服务、Web应用服务器、数据库,以及对服务器进行性能优化,还需要考虑存储和计算资源,考虑负载均衡和横向扩展能力,考虑服务器容灾稳定性等非专业逻辑的开发。这些服务器的运维和开发知识、经验极大地限制了开发者进行业务开发的效率。设想一下,如果开发者直接租用服务或者开发服务而无须关注如何在服务器中运行部署服务,是否可以极大地提升开发效率和产品质量?这种去服务器而直接使用服务的架构,我们称之为Serverless架构(无服务器架构)。
2014年,云厂商AWS推出了“无服务器”的范式服务。
其实,最初“无服务器”意在帮助开发者摆脱运行后端应用程序所需的服务器设备的设置和管理工作。这项技术的目标并不是为了实现真正意义上的“无服务器”,而是指由第三方供应商负责后端基础结构的维护,以服务的方式为开发者提供所需功能,例如数据库、消息,以及身份验证等。这种服务基础结构通常可以叫做后端即服务(Backend-as-a-Service,BaaS),或移动后端即服务(MobileBackend-as-a-service,MBaaS)。
现在,无服务器架构是指大量依赖第三方服务(也叫做后端即服务,即“BaaS”)或暂存容器中运行的自定义代码(函数即服务,即“FaaS”)的应用程序,函数是无服务器架构中抽象语言运行时的最小单位,在这种架构中,我们并不看重运行一个函数需要多少CPU或RAM或任何其他资源,而是更看重运行函数所需的时间,我们也只为这些函数的运行时间付费。无服务器架构中函数可以多种方式触发,如定期运行函数的定时器、HTTP请求或某些相关服务中的某个事件。
以带有服务功能逻辑的传统面向客户端的三层应用为例(一个典型的电子商务应用网站)。一般来说包含客户端、服务端程序、数据库,服务端用Java开发完成,客户端用JavaScript。
采用这种架构,服务端需要实现诸多系统逻辑,例如认证、页面导航、搜索、交易等都需要在服务端完成。如果采用Serverless架构来对该应用进行改造,则架构如图所示:
Serverless架构相比于传统面向客户端的三层应用架构,有以下几方面的差异:
- 删除认证逻辑,用第三方BaaS服务替代。
- 使用另外一个BaaS,允许客户端直接访问架构与第三方(例如AWS Dynamo)上面的数句子库。通过这种方式提供给客户更安全的访问数据库模式。
- 前两点中包含着很重要的第三点,也就是以前运行在服务端的逻辑转移到客户端中,例如跟踪用户访问。客户端则慢慢转化为单页面应用。
- 计算敏感或者需要访问大量数据的功能,例如搜索这类应用,我们不需要运行一个专用服务,而是通过FaaS模块,通过API Gateway对HTTP访问提供响应。这样可以使得客户端和服务端都从同一个数据库中读取相关数据。由于原始服务使用Java开发,AWS Lambda(FaaS提供者)支持Java功能,因此可以直接从服务端将代码移植到搜索功能,而不用重写代码。
- 最后,可以将其他功能用另外一个FaaS功能取代,因为安全原因放在服务端还不如在客户端重新实现,当然前端还是API Gateway。
2014年11月14日,AWS发布了AWS Lambda。AWS Lambda是市面上最早,也是最为成熟的Serverless框架之一。该服务最迟支持Node.js,现在也支持Java和Python。它与Alexa Skills Kit(软件开发工具包)紧密集成,亚马逊提供交互式控制台和命令行工具,以便上传和管理代码片段。
Google是为服务架构的最前沿公司,除了推动Kubernetes,Google还投资了Cloud Functions,该架构可以在其公共云基础设施上运行。
Iron.io最初是为企业级应用提供微服务。Iron.io是用Go语言编写的,用于处理高并发、高性能计算服务,并已经集成Docker服务,提供一种完整的微服务平台。
2016年2月的InterConnect大会,IBM发布了OpenWhisk,这种事件驱动型开源计算平台可以用来替代AWS Lambda。OpenWhisk平台让广大开发人员能够迅速构建微服务,从而可以响应诸多事件,比如鼠标点击或收到来自传感器的数据,并执行代码。事件发生后,代码会自动执行。
Serverless Framework是无服务器应用框架和生态系统,旨在简化开发和部署AWS Lambda应用程序的工作。Serverless Framework作为Node.js NPM模块提供,填补了AWS Lambda存在的许多缺口。它提供了多个样本模板,可以迅速启动AWS Lambda开发。
Azure Web的应用功能,可以与Web、API应用相同的上下文中运行程序或脚本。可以上传并运行可执行文件,例如cmd、bat、exe、psl等等。WebJobs提供SDK用于简化针对Web作业可以执行的常见任务,例如图像处理、队列处理、RSS聚合、文件维护,以及发送电子邮件等等。
Serverless架构是SOA概念的自然延伸。在Serverless架构中,所有自定义代码作为孤立的、独立的、细粒度的函数来编写和执行,这些函数在AWS Lambda之类的无状态计算服务中运行。开发人员可以编写函数,执行常见的任务。在比较复杂的情况下,开发人员可以构建更复杂的管道,编排多个函数调用。
单单负责处理某一项任务的函数很容易测试,并稳定运行。通过以一种松散编排的方式将函数和服务组合起来,能够构建易于理解、易于管理的复杂后端系统。为lambda等计算服务编写的代码应该以无状态方式进行构建,这样会让无状态功能很强大,让平台得以迅速扩展,处理数量不断变化的请求或者事件。
可以构建满足任何用途的服务器架构。系统可以一开始就构建成无服务器,也可以逐步设计现有的单体型应用程序,以便充分发挥这种架构的优势。最灵活、最强大的无服务器设计是事件驱动型的。构建事件驱动的、基于推送的系统常常有利于降低成本和系统复杂性,但是要注意,并不是任何情况下都是适当的或者容易实现的。
由于Lambda的定价基于请求数量、执行时间段以及分配的内存量,所以代码执行需要越快越好。数据签名的令牌让前端可以与不同的服务直接通信。相比之下,传统系统中所有通信经由后端服务器来实现。让前端与服务进行通信有助于减少创建环节、尽快获得所需的资源。
如果第三方服务能提供价值,并减少自定义代码,那么自然它们就很有价值。开发人员可以通过引入第三方服务来减少自己实现各种业务逻辑的需要,可以减少小型公司的开发成本,避免价格、性能、可用性等要素上的劣势。
随着移动和物联网应用蓬勃发展,伴随着面向服务架构(SOA)以及微服务架构(MSA)的盛行,造就了Serverless架构平台的迅猛发展。在Serverless架构中,开发者无须考虑服务器的问题,计算资源作为服务而不是服务器的概念出现,这样开发者只需要关注面向客户的客户端业务程序开发,后台服务由第三方服务公司完全或者部分提供,开发者调用相关的服务即可。Serverless是一种构建和管理基于微服务架构的完整流程,允许我们在服务部署级别而不是服务器部署级别来管理应用部署,甚至可以管理某个具体功能或端口的部署,这就能让开发者快速迭代,更快速地交付软件。
这种新兴的云计算服务交付模式为开发人员和管理人员带了很多好处。它提供了合适的灵活性和控制性级别,因而在IaaS和PaaS之间找到了一条中间道路。由于服务器端几乎没有什么要管理的,Serverless架构正在彻底改变软件开发和部署流程,比如推动了NoOps模式的发展。
评论