如何经过 Serverless 技术下降微服务应用资源成本?

头图.jpg

前言

在大型分布式 IT 架构领域,微服务是一项必不可少的技术。从本质上来说,微服务是一种架构风格,将一个大型的系统拆分为多个拥有独立生命周期的应用,应用之间采用轻量级的通讯机制进行通讯。这些应用都是围绕具体业务进行构建,能够独立部署、独立迭代,也可能根据业务负载独立进行水平扩展。前端

微服务思想以及相关的技术为 IT 架构的发展带来了一系列深入的变革:shell

**易于开发和维护:**一个应用只会关注一组特定的业务功能,经过服务拆分,能减小应用之间的耦合度,让开发和维护更加简单。编程

**技术栈不受限制:**在微服务架构中,能够结合项目业务及团队的特色,合理的选择技术栈。安全

**加快系统演进速度:**每个应用均可以独立的进行版本更新,经过灰度发布等技术手段能确保发布过程当中整个系统稳定运行。服务器

**突破性能瓶颈:**每一个应用都能独立的水平伸缩,使系统性能能够根据计算资源的增长而获得线性的扩展。网络

微服务的挑战

世上没有免费的午饭,微服务技术让 IT 系统变得更敏捷、更健壮、更高性能的同时,也带来了架构复杂度的提高。对于开发者而言,要想更好的驾驭微服务架构,须要解决持续集成、服务发现、应用通讯、配置管理、流量防御等一系列难题。幸运的是,针对这些广泛存在的难题,业界涌现了一系列优秀的开源技术组件和工具,让开发者能够更轻松的构建微服务应用。像 Spring Cloud 和 Dubbo 这样的技术框架,通过多年的发展,已经演化为微服务领域的通用标准,极大地下降了微服务的门槛,但这些技术框架依然没有办法解决其中两个最大的挑战,这两个挑战成为摆在开发者面前的两座大山。架构

挑战一:亟需完善的生命周期管理与服务治理方案

在一个频繁迭代的系统中,每一个应用会常常性面临新版本发布需求,须要对应用的上线、下线、更新、回滚等流程进行集中性的管理,并配合精细粒度的灰度发布手段,减小版本迭代对业务形成的影响。负载均衡

1.png

在一个简单的微服务架构中,若是某应用处于整个链路的入口位置,它的前端通常会挂上负载均衡组件(上图中的应用 A),以承接来自于最终用户的业务请求。这类应用在进行生命周期管理的时候,复杂度会更高,为了确保应用在新版本发布过程当中的平衡稳定,会通过以下的步骤:框架

2.png

在这个流程中,尚未涉及到对于流量精细粒度控制的高级灰度方案,但已经足够体现出其复杂性和操做难度了。若是仅仅依赖于简单的发布脚本进行管理,不但效率很低,还很容易致使顾此失彼,对系统稳定性形成巨大的风险。less

挑战二:亟需完善的水平扩容与缩容方案

当某一个应用的性能出现瓶颈,须要经过增长实例数量来提高性能的时候,就须要引入新的计算资源。

新的计算资源从何而来呢?

对于线下 IDC 而言,计算资源是须要预先规划的,扩容并非一件简单的事情,可能会由于各类条件的制约而致使扩容没法实现。固然这种困扰在云计算时代不复存在了,为一个应用扩充计算资源是信手拈来的事情,但光有计算资源是不够的,还得在上面部署应用,并将应用容纳到微服务体系中。

3.png

根据这个流程,若是须要扩容一个应用实例,保守估计也须要 20 分钟以上,其中购买、系统初始化、应用部署都须要占用大量的时间。假设系统流量突增,须要在 2 分钟以内紧急扩容,这个方案就无用武之地了。 

一剂良药:容器化技术

为了解决这两个难题,开发者们尝试了各类各样的方案,新的理念以及技术框架在过去的这五年层出不穷。在一轮轮的优胜劣汰下,以 Docker 为表明的容器技术,在 Kubernetes 生态的支撑下,在业界成为了主流,是构建云原生(Cloud Native)应用的必备要素。容器化相关技术可以更大程序的挖掘云计算的价值,在必定程度上帮助开发者解决这两个难题。

在应用生命周期管理以及服务治理方面, Kubernetes 提供了比较完善的实现机制,经过构建 Deployment 资源,配合 proStop 和 postStart 脚本,能比较方便的实现滚动发布以及应用的优雅上下线。虽然在灰度发布的过程当中,依然没有办法直接对流量进行精细粒度控制(引入 Service Mesh 技术能加强流量控制力,不在本文讨论范围),但相比简单的发布脚本,已经有了飞跃性的提高。

在应用的水平扩容与缩容方面,经过容器化技术能够极大程度的减小操做系统安装以及系统级初始化的时间,但购买虚拟机的操做是没法避免的,因此在系统遇到流量增突的时候,依然没有办法实现快速水平扩容。咱们能够预留一部分计算资源,放在资源池中,当应用有扩容需求的时候,就向资源池申请资源,当业务负载降低的时候,再把多余的计算资源归还到资源池中。

4.png

这其实并非一个好主意,每个计算资源都是须要成本的,资源池虽然可以解决计算资源快速投入使用的问题,却形成了巨大的浪费。另外,到底规划多大的资源池,也是一件很伤脑筋的事情,池子越大,形成的浪费就越大,但池子过小,又可能知足不了扩容的需求。 

资源成本更深层次的分析

可能有的开发者会认为,目前的业务运行很是的稳定,在用户流量上并不存在明显的突增,因此扩容和缩容是一个伪需求,在未来也不会有这样的需求。这多是对互联网业务的一种误解,由于彻底没有扩容需求的状况是不存在的。

首先,只要一个系统是为人服务的,就必然存在波峰和波谷。对于一个 7*24 小时运行的系统,不可能永远保持一样的用户流量,二八原则对于不少业务系统依然适用( 80% 的用户流量集中在 20% 的时间段)。即使是用户流量相对平衡的系统,在凌晨也存在流量的低谷,若是能更进一步的释放闲置计算资源,提高资源利用率,就能显著的下降资源使用成本。

5.png

另外,相比生产环境,开发和测试环境对于扩容和缩容的需求会更加迫切。一套微服务应用由不一样的团队进行开发,在理想的状况下,多个团队会共享一套测试环境:

6.png

然而,每一个团队对于应用的迭代都会有本身的节奏,与此同时,他们又想拥有独立的端到端测试环境,从而实现环境之间的隔离,以免团队之间的相互影响。这样的话,颇有可能会造成多套测试环境:

7.png

随着应用、团队、业务功能点数量的增长,所须要的开发测试环境数量还会成倍的增加,形成巨大的资源浪费。对于测试环境的计算资源而言,资源利用率要远低于生产环境。有的时候仅仅是一个简单功能点的验证,为了端对端的跑通业务功能,又避免团队之间的相互影响,就会开启一套包括所有微服务应用的新环境。这样的资源浪费,对于不少企业,都是一个多年都不曾获得解决的难题。 

所以,微服务架构在本质上就是对弹性伸缩有着强烈诉求的,在弹性伸缩的过程当中,无论是单应用的水平弹性伸缩,仍是整套环境的启停,资源利用率都对最终的资源成本起着决定性的做用。若是能想办法提高资源利用率,就能为企业节省大量资源成本。值得咱们重视的是,绝大多数的微服务应用的资源利用率都是很是低的。

咱们能够作一个简单的统计:把全部服务器的 CPU 利用率每 5 分钟导出一次,按照天的维度求平均值,就能从总体上了解系统的资源利用率数据。若是把开发测试环境的服务器资源也归入统计的范围,资源利用率颇有可能会更低。 

Serverless 化探索

资源利用率低的根本缘由,在于以服务器为载体的应用架构中,开发者须要将构建好的程序包部署到服务器上,从而对多个用户事件进行响应。为了确保事件响应的及时性,须要让程序长驻于服务器上,并且尽量保守的规划资源,以免出现负载太重而致使服务崩溃的状况。在这个过程当中,实际的负载在时间上分配并不均衡,从而致使总体的资源利用率偏低。

Serverless 技术的出现,为提高资源利用率提供了新的思路。Serverless 是一种构建和管理基于微服务架构的完整流程,容许开发者脱离服务器资源而直接部署应用。它与传统架构的不一样之处在于,彻底由第三方管理,由事件触发,存在于无状态(Stateless)的计算容器内。构建无服务器应用程序意味着开发者能够专一在产品代码上,而无须管理和操做服务器资源,真正作到了部署应用无需涉及基础设施的建设。

8.png

Serverless 技术存在多种形态,最典型的一种是 FaaS(Function as a Service,函数即服务),好比阿里云的函数计算(Function Compute,FC)产品。在函数计算领域,一切计算资源的申请和调度都由具体的业务事件触发,当业务事件所对应的任务完成以后,计算资源会被当即释放。这样的方式真作到了计算资源的按需分配,能显著提高资源利用率,是 Serverless 技术的终极形态。

另一种是 Serverless 化的容器技术,Serverless 化的容器实例运行在案例隔离的环境中,每一个计算节点经过轻量级虚拟化安全沙箱技术彻底强隔离。对于使用者而言,无需购买服务器资源便可直接部署容器应用,也无需对集群进行节点维护和容量规划,能够根据应用配置的 CPU 和内存资源量进行按需付费。当微服务应用须要扩容的时候,就能够快速得到计算资源,不须要再通过购买服务器这个步骤了,能够帮助开发者下降计算成本,减小闲置资源浪费,平滑应对突发流量高峰。阿里云的 Serverless Kubernetes (ASK)就是 Serverless 化容器技术的表明产品。 

更进一步发掘开发者的诉求

Serverless 技术无缝是云计算和云原生应用架构的发展方向,但对于微服务应用的开发者而言,无论是 FaaS 形态,仍是 Serverless Kubernetes ,都存在必定的局限性。

不是每一种业务都适合经过 FaaS 的方式进行构建,特别是对于链路长,上下游依赖特别明显的应用,根本没有办法进行 FaaS 化改造。即使某些业务系统的 FaaS 化改造被证实可行,把现有的微服务架构改形成 FaaS 架构也须要必定的工做量,并不能作到无缝移植。

Serverless Kubernetes 架构虽然能适配全部的业务场景,但对于开发者而言,构建一整套 Kubernetes 体系,须要掌握一系列跟 Kubernetes 相关复杂的概念,有着很是陡的学习曲线。并且 Kubernetes 生态中各类组件的搭建,再加上网络层与存储层的适配,都涉及很是复杂的工做。

形成这种局限性的缘由很简单,在以 Spring Cloud 为表明的微服务技术阵营中,系统的构建都是围绕着应用(也能够理解为单个的服务)而展开,无论是版本更新仍是水平扩展,都是针对应用自己。Serverless Kubernetes 架构的核心在于 Pod ,比应用更偏向系统底层,因此使用者须要投入更多的精力用于应用下层资源的管理。而 FaaS 架构的核心在于函数,比应用更偏向系统上层,所以灵活度会下降,不能适配全部的业务场景。

对于使用主流 Spring Cloud 体系或 Dubbo 体系构建微服务应用的开发者而言,若是须要引入一种方案下降资源成本,他的最终诉求必定包含两个方面:

(1)可否零改形成本,或者接近零改形成本; (2)可否适配全部的业务场景。

应用层 Serverless 技术

是否有一种介于 FaaS 和 Serverless 化容器之间的技术,能够实现上述重要诉求呢?固然有,这就是以阿里云 Serverless 应用引擎(SAE)为表明的应用层 Serverless 技术。

9.png (图:不一样层级的 Serverless 技术 )

SAE 实现了 Serverless 架构 + 微服务架构的完美融合,对于 Spring Cloud 和 Dubbo 等主流的微服务架构,能够实现无缝兼容,基本上没有改形成本,并真正按需使用、按量计费,节省闲置计算资源,同时免去 IaaS 层运维方面的工做,有效提高开发运维效率。

以 Spring Cloud 应用为例,若是须要部署一个新的应用,只须要 2 个步骤:

(1)告诉 SAE 这个应用须要多少个实例,并指定每一个实例须要的 CPU / 内存规格。 (2)上传应用的 JAR 包 / WAR 包,并启动应用。

咱们发现,这两个步骤中并不涉及容量评估、服务器购买、操做系统安装、资源初始化等工做,就能让包含多个对等实例的微服务应用运行起来。这是由于在 Serverless 的世界中,再也不具备服务器资源这样的概念,应用的载体是 SAE 调度出来的沙箱容器,每一个实例只有在真正投入使用后,才会按使用时长进行计费。

对于开发者而言,他们不用关心应用到底部署在物理机里面,仍是虚拟机里面,或是容器里面,也不须要知道底层的操做系统是什么版本的,只须要关注每一个应用实例占据多少运算资源就能够了。若是应用须要从 4 个实例扩容到 6 个实例,或者缩容到 2 个实例,只须要一个指令就能够完成,甚至与 SLB 的绑定关系,均可以自动的创建或解除,这是 Serverless 技术为开发者带来的巨大价值。

使用 SAE 部署微服务应用,由于只是变动了应用运行的载体,因此能够 100% 的兼容现有的技术架构和业务功能,迁移成本能够忽略不计。 

SAE 的极致弹性能力

除了手动的扩缩容指令,SAE 还支持 2 种自动弹性机制,能够对微服务应用进行灵活的水平扩展,更进一步的发挥云计算的弹性能力。

**定时弹性机制:**对于会预期发生的周期性行为,能够设置定时弹性策略。举例:若是天天的上午 9 点是业务高峰,能够定时天天 8 点半增长实例数量,并在 9 点半减小实例数量。

**基于指标阈值的弹性机制:**对于超出预期的业务流量突增,能够设置基于指标阈值的弹性策略,根据 CPU 、内存等资源指标,以有 QPS 等业务指标让应用实现自动的弹性缩。

经过多种弹性机制,可以对系统容量进行精细粒度的管理,使资源的使用量能随着业务流量的变化而调整,从而极大程度的增长资源利用率,大幅下降资源成本。

10.png

在计算资源的调度和启动上, SAE 作了多项优化,对于扩容出来的新实例,只须要几秒钟的时间就能拉起,这项能力对于一些须要紧急快速扩容的突发场景,是具备重大意义的。

对于开发测试环境而言,SAE 的机制弹性能力能体现得更加淋漓尽致,得益于 SAE 出色的资源调度能力,能够一键启停一整套微服务应用。即使仅对一项简单的新功能进行冒烟测试,也彻底能够新启一套完整而隔离的测试环境来进行。新的环境能够在秒级搭建完成,快速投入使用,而测试完毕后,又能够当即释放。从成本上来说,一套新环境实际投入使用的时间很短,所以只会消耗极少的费用。这对于微服务应用开发过程当中的多团队协做,是一个巨大的变革。

11.png

成本分析

SAE 经过资源的实际使用量来付费,费用由两部分组成,每部分根据统计结果和计算方式进行费用结算,按小时出帐单扣款。每一个应用使用的资源计量方式以下所示:

应用 CPU 资源使用量=∑实例 CPU 规格×本月运行时长(以分钟计),即应用中全部实例的 CPU 规格乘以本月运行时长的总和。

应用内存资源使用量=∑实例内存规格×本月运行时长(以分钟计),即应用中全部实例的内存规格乘以本月运行时长的总和。

其中 CPU 部分的价格为 0.0021605 元/分钟/Core,内存部分的价格为 0.0005401 元/分钟/GiB。SAE 还提供预付费资源包,至关于批发的方式预购计算资源,只要能要有效期内消耗完,就能更进一步的节省使用成本,当资源包扣完之后,系统会自动变动为按量付费的模式。

让咱们经过一个实际案例来进一步体会 SAE 如何帮助微服务应用下降资源成本。假设一个微服务系统包含 87 个应用实例,每一个时间天天的平均运行时长为 8 小时,实例的配置为 2 Core + 4 GiB + 20 G 磁盘。

  • 使用包年包月的 ECS 部署应用:须要购买 87 台计算型 c5 ,单台的月成本为 186 元,每个月总成本 16146 元。
  • 使用按量付费的 ECS 部署应用:单台价格为 0.63 元/小时,每个月累计使用 20880 小时,总成本 13154 元。
  • 使用 SAE 部署应用:购买 1 个 75000 元的包年资源包,87 个实例天天运行 8 个小时,恰好把资源包额度用完,折合每个月总成本 6250 元。

从这个对比咱们能够得出,只要可以合理的运行 SAE 的弹性能力,就能够为微服务应用大幅度下降资源成本。  

附加能力

SAE 除了能够简化运维工做量,下降资源成本之外,还为微服务应用提高了一系列附加的功能,这是应用层 Serverless 技术为开发者带来的额外价值,咱们能够尽量的利用这些开箱即用的功能,让建设微服务应用变成更加简单。

**完整的应用生命周期管理:**应用托管至 SAE 后,能够对应用执行更新、扩缩容、启停、删除、监控启停等应用生命周期管理操做。

**开箱即用的注册中心:**SAE 自带商业版 Nacos 注册中心,能够无偿使用,不须要自行搭建。若是有特殊的需求,好比让部署在 SAE 的应用和其余应用相互发现,也可使用微服务引擎(MSE)产品提供的注册中心,或者自建的注册中心。

**开箱即用的配置管理中心:**SAE 集成了 ACM(Application Configuration Management,应用配置管理)中的配置管理功能,能够在 SAE 中使用 ACM 对应用配置进行集中管理。

应用级流量防御: SAE 集成 AHAS 实现应用级别的流控与降级能力,全面保障应用的高可用性。

**监控能力:**应用托管到 SAE 之后,能够免费得到基础资源(包括 CPU、内存、负载和网络)以及应用层(包括 JVM 分析、接口调用分析等方面)的监控能力。若是须要更高级的 SQL 分析、异常分析、链路上下游和接口快照,能够集成阿里云应用时间监控产品(ARMS)。

**CI/CD 集成能力:**SAE 与云效、云效 2020、 Jenkins 等产品进行了深刻集成,能够方便开发者将构建好的应用快速部署。

12.png

多语言支持

对于非 Java 语言编写的应用,或者没有使用 Spring Cloud 等微服务框架的 Java 应用, SAE 能不能完美支持,并帮助企业下降资源成本呢?

固然是能够的。SAE 提供容器镜像部署方式,这就表明着无论采用哪一种编程语言,只要最终的应用可以发布成容器镜像,就能够部署在 SAE 上。

对于 Java 系的微服务应用, Java 系统的普通应用,以及非 Java 系应用而言,SAE 的极致弹性能力并无本质的区别,都能经过 Serverless 技术提供系统的资源利用率。只不过 SAE 提供的一些附加价值,好比免费的微服务注册中心,就只能为 Spring Cloud 或 Dubbo 应用服务罢了。 

总结

让咱们用这张图回顾 Serverless 技术的巨大价值:

13.png

常见问题

1.问:应用实例没有固定的机器资源,连固定的 IP 地址都没有,如何 SSH 到一台服务器排查问题?

答:并不须要有固定的机器资源和固定的IP地址才能排查问题,在云计算时代,经过 SSH 登陆到一台机器排查问题的方式并非一个好的实践。相反, SAE 提供了完善的监控能力,还能够方便的与云监控、 ARMS 等新一代监控诊断类产品进行了集成,为排查故障提供了更大的便利。固然,若是必定要登陆到某一台机器,SSH 依然是能够支持的,也能够利用 SAE 提供的 Webshell 工具简化这个流程。

2.问:磁盘不是计费的维度吗?应用须要大容量磁盘怎么办?应用重启后碰盘中的数据还保留吗?

答:在微服务领域,应用通常是无状态(Stateless)的,不须要保存大量的本地数据。若是在特殊的场景下离不开这个需求,能够集成 NAS ,使用集中式的存储实现。

3.问:应用的日志怎么查看?

答:SAE 控制台界面提供了对于文件日志的实时查阅能力,至关于免费提供了一个分布式日志采集平台。固然强烈建议接入阿里云日志服务(SLS)产品,更进一步的发挥应用日志的价值。

课程推荐

为了更多开发者可以享受到 Serverless 带来的红利,这一次,咱们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。点击连接便可免费学习课程:https://developer.aliyun.com/learning/roadmap/serverless

Serverless 公众号,发布 Serverless 技术最新资讯,聚集 Serverless 技术最全内容,关注 Serverless 趋势,更关注你落地实践中的遇到的困惑和问题。