对企业而言,Serverless 架构有着巨大的应用潜力。随着云产品的完善,产品的集成和被集成能力的增强,软件交付流程自动化能力的提升,咱们相信在 Serverless 架构下,企业的敏捷性有 10 倍提高的潜力。本次分享我主要分为如下四个方面:
1、DevOps的挑战以及如何下降 DevOps 实施代价?
2、为何 Serverless 是云发展的必然结果?
3、Serverless+DevOps =?
4、实战案例分享算法
对于应用交付的整个流程而言,一般会涉及三个环节,即开发、测试和运维,而在传统的组织架构中,他们对应的也每每是三个不一样的团队。这三个环节各自有本身的侧重点,可是在实际上,想要让整个应用交付过程变得顺滑高效,而且让应用在上线后保持高可用的状态,每每须要三个团队将相互之间存在的墙打破掉。数据库
这里的墙不仅是组织架构隔阂所带来的障碍,还包括三个领域关注点的不一样。好比开发须要关注可测试性和可运维性,这些东西将会深入地影响应用的架构设计和开发实现,若是开发同窗没有充分考虑到代码的可测试性,那么交给测试同窗就会形成很大的问题,好比如何实现故障注入和精细流控,这都须要在开发时就考虑清楚。编程
对于运维而言也是同样的,开发的时候也须要考虑到可运维性,好比在开发的时候就须要考虑如何在服务实际上下线的时候作到平滑且不丢失数据,同时这样的设计也须要和运维系统进行深入的对接,这样才能很是可靠、很是安全地链接起来,提高运维的效率。小程序
阿里内部以前不少故障也都是由于开发和运维之间在设计上面存在信息不一致致使的,好比在开发设计时会作三副本的高可靠保证,可是在运维侧则可能会认为副本所在的机器没有提供服务所以被错误下线掉。缓存
因此,DevOps 实际上包含了两层含义,首先是将开发、测试、运维变成一个团队;其次,还须要让整个团队的心智统一,这也是DevOps 真正的挑战。安全
快速回顾一下DevOps每一个环节所须要考虑的东西。在开发阶段,首先须要梳理业务的需求和场景,而且将需求转换为系统设计,同时须要考虑数据模型如何设计,才可以让数据库不成为单点和瓶颈。由于在阿里巴巴这样的互联网企业中,应用承载了大量的用户访问,所以须要考虑复杂均衡、容错设计、流量控制等。服务器
若是采用了微服务架构,应用将由多个服务组成,那么还须要考虑服务管理。以上所有考虑到以后,将其转化为系统设计,最后进行开发调试以及单元测试,完成了这些以后才能够将应用交给测试环节。网络
在测试时须要考虑不少方面和维度,保证软件各方面的质量。测试包括了集成测试、端到端的 E2E 测试、性能测试、压力测试、容错测试、兼容测试、破坏测试等。架构
当应用经过测试以后,就产出了一个交付物,这个交付物被认为具有了能够发布的能力,后续就须要进行运维工做了,好比应用灰度发布、升级回滚、服务器上下线、监控报警、安全补丁升级、网路配置、操做审计、生产环境引流等。负载均衡
当咱们深刻地看 DevOps 中所包含的这些工做项以后,其实可以感觉到若是想要作一个具备弹性的、高可靠的应用,须要考虑的点是很是多的,而这些在实施了 DevOps 以后就变成了同一个团队在整个应用生命周期中须要考虑的事情了。这对于团队心智和能力的要求是很是高的。
DevOps 应用交付流水线里面包含了不少环节,如何将这些环节很是流畅地串联起来,实现自动化也是很是重要的方面。
回顾了 DevOps 的挑战以后,经过阿里内部和整个业界的实践能够看到,须要经过平台和工具下降 DevOps 的复杂度。
在介绍 Serverless 以前,首先回顾一下云的发展趋势,再来探讨为何 Serverless 是云发展的必然结果。
在过去的十年间,云计算得到了很大的发展,其使得用户可以经过API的方式很是轻松地得到近乎无限的算力,而这些算力是经过虚拟机来呈现的,这样的模式存在不少的优势,它和应用原来的开发和运行环境是兼容的,这种模式可以使得传统遗留应用很是平滑地迁移到云上。
云的第一个阶段就是基础设施云化,这里就是云托管模式。基于云上的存储、网络等基础设施来构建应用,这种模式的核心价值在于资源的弹性和成本。下一个阶段中,云的体系已经远远超越了基础设施,可以看到在各个领域都出现了不少的云服务。所以,在今天须要考虑如何利用云服务的能力,以搭积木的方式来更快速地构建应用,而不是重复造轮子,这就是云原生的模式。
目前,主流的云计算产商的产品体系也正在迅速地 Serverless 化,这并不是是对于将来的预测,而是实际正在发生的事实。下图中的数据是基于对于AWS、微软和阿里云的产品所发布的新功能或者新服务形式的统计,能够看到绝大多数的新服务都在呈现Serverless 化。
云计算产生了大量的服务,在效能的角度来看,这些云服务是在更高层次抽象的 Serverless 形态,这就变得很是有意义了。若是从云编程模型的角度从新来审视云产品体系,可以看到最底层是基础设施层,这一层包含两部分,分别是 IaaS 和容器。在基础设施之上就是云原生应用操做系统,K8s 是这一层的事实标准,它可以把底层 IaaS 基础设施很好地管理起来。在操做系统之上出现了很是丰富的API,也就是全托管的云服务体系。若是看阿里云的产品体系,就会发现了阿里云提供了丰富的产品体系,包括数据库、大数据、中间件,这些都是以 Serverless 全托管模式提供服务的。
在这样具备大量云 API 的状况下,今天的问题是如何设计一个通用的计算框架可以与这些 Serverless 的云服务、云 API 产生很是紧密的链接来帮助客户快速构建弹性、高可用应用。所以在框架层就出现了Serverless计算,其产生的缘由最主要是须要和云API发生紧密的化学反应,帮助用户提高应用构建和运维效率,帮助客户构建分布式、数据化、智能化的新一代的云原生应用。
这里对比一下采用云托管的应用和采用 Serverless 的应用最本质的差别在哪里。对于应用而言,能够将其构建模式拆分为三层,分别是底层基础设施管理、中间的外部服务集成和上层的应用逻辑。若是采用云托管模式,其实是在基础设施层去构建应用,应用构建的抽象层次是比较低的,所以会带来大量工做,用户本身须要整合不一样的组件和服务,须要进行大量的决策和实现,交付的速度会比较慢,须要考虑不少的事情,并且在运维方面有大量的重复工做。
若是用户采用 Serverless 的模式构建应用,也就是至关于在上层API的方式构建应用,粘合的逻辑和基础设施管理的工做都由云服务商来承担,用户所须要整合和决策的代价比较低,所须要考虑的主要就是如何将业务逻辑和需求与云服务进行适配来构建应用。基于很是高效的云API来构建应用的好处在于构建的成本很低,而且可以实现按天、按小时进行交付,而且大大下降将来运维的负担。
Serverless计算具备四个特色:首先,不须要维护云计算基础设施,应用构建的抽象层次上升,变得更加高效;其次,可以实现实时的弹性伸缩,这样可以经过将来的数据驱动的负载感知算法可以实现既知足很低的延时,也可以实现很高的资源利用率;再次,计量模式提供了很是细粒度的按需的模式,能够实现按秒级计量,可以实现彻底按需的付费模式,对于用户而言,资源利用率是100%;最后,可以实现高可用,将这种能力内置在平台层。
这里作一个说明,Serverless 计算只是阿里云 Serverless 产品中的一部分,除此以外还包括存储、API、分析、中间件等。所以,从这个角度来看,Serverless 也不是一个很是新的概念,最先的 OSS 对象存储就是一个 Serverless 产品,能够看出云产品体系正在 Serverless 化,只不过最近几年出现了函数计算这样通用的 Serverless 计算平台,进而可以将 Serverless 体系产品链接起来,构建一个 Serverless 应用。
当有了这些 Serverless 的能力,那么如何将这些能力与 DevOps 结合起来呢?
下图更多地是从如何构建高可用应用的角度来展示。这里将应用的模块分为四个方面:包括基础设施、运行时、数据和应用。基础设施层就是须要处理与机器相关的操做,好比故障处理。运行时则须要作应用资源隔离、流控等。数据层主要须要和数据库、缓存相关,好比如何设计数据库表结构,如何设计缓存策略,如何实现负载均衡,如何保证不会出现横向扩展瓶颈。
在应用层,则须要处理与应用相关的操做,好比代码包的错误、配置错误、心跳异常的处理。下图中蓝色虚框中的部分能够彻底由平台负责,用户能够无感知;蓝色实框则是平台帮助用户作了大量工做,可是仍是须要用户感知和做出必定决策;红色框则表明仍是须要用户本身管理的部分。能够看到,在容错方面,平台提供了很是强的能力,包括多AZ的容灾能力、快速的弹性能力、内置的流控能力以及多层次、多维度的监控报警能力。借助于这些能力,用户管理基础设施的复杂度就大大下降了。
下图展现了应用交付的流程,代码经过统一管理的代码库存储和管理起来,再经过持续集成将其变成一个交付物,再将其存储到交付物仓库里面。交付物能够是容器镜像,也能够是代码包的模式。产出了交付物以后,能够自动地将其部署到测试、生产环境中去作版本部署,最后实现到生产环境的自动部署。所以这样应用交付流程的关键点在于实现高度自动化,而自动化的关键环节有两点:分别是基础设施即代码和环节间的自动化串联。
下图展示的是自动化应用交付流水线,能够看到在下面的每个环节都须要实现不少的功能,而不少都是重复性工做,所以须要作到基础设施即代码。
下图是基础设施即代码的展现。Serverless 应用模型经过声明来定义应用资源,可以实现标准化、自动化和可视化。
能够为模板传入不一样参数,能够动态生成应用运行环境。
在函数计算里面,应用有版本的概念,版本是一个不可变实体,所以杜绝了版本由于非预期的修改形成线上应用受损,阿里云经过服务版本和灰度发布避免了这样的问题,客户端访问应用经过别名来访问。
阿里云提供了 Serverless 工做流方便用户将 DevOps 串联起来,用户能够经过配套的服务能力、工具能力快速地建立工做流,而且以可视化的方式展示出来,可以清楚地看到工做流的效果。
回顾一下当有了这些能力以后,如何实现自动化应用交付流水线。在源码阶段,能够实现代码质量静态检查,保证 CheckIn 的代码质量。当 CheckIn 到代码库以后,会自动运行单元测试,而且产出交付物。在测试的环节,经过与阿里云 ROS 的无缝集成可以实现自动化部署到测试环境,而且运行测试用例。这些完成以后,经过 ReleaseManager 能够确认部署,经过工做流将这些任务串联起来,发布到预发布环境中,而且进一步部署到生产环境中,每个步骤都实现了自动化,研发效能获得了极大提高。
在 Serverless 计算平台之上,原生提供了不少的日志收集和 Metric 收集能力,好比简单日志查询以及高级日志查询,可以经过日志方式为用户提供高级数据分析能力。
Serverless 计算平台除了提供了基本的指标视图以外,还支持自定义指标视图,用户能够经过自定义的关键词指标搜索实现与业务相关的数据分析。
当 Serverless 和 DevOps 结合以后,可以大大提高研发效能,一方面大大下降了开发团队的心智负担;另一方面,经过工具使得整个 DevOps 流水线可以实现高度自动化。
最后分享一些比较成功的案例。阿里Serverless计算支撑了阿里经济体小程序平台,节省了40%研发资源。阿里云 Serverless 支撑语雀使用函数计算实现文档等计算密集型业务,大幅度地下降了运维成本,还为石墨文档下降了58%的运维成本,帮助微博提高了研发效能,使得功能上线时间从本来的2周变为几小时。
能够看到,2020年业界对于Serverless的接受度有了极大提高,同时,Serverless的能力也变得更加普适。
杨皓然(不瞋),Serverless 计算负责人,2010 年加入阿里云,深度参与了阿里云飞天分布式系统研发和产品迭代的全过程。对大规模分布式计算,大规模数据存储和处理有很是深刻的理解。
原文连接本文为阿里云原创内容,未经容许不得转载。