微服务思想以及相关的技术为 IT 架构的发展带来了一系列深刻的变革:
易于开发和维护:一个应用只会关注一组特定的业务功能,通过服务拆分,能减少应用之间的耦合度,让开发和维护更加简单。
技术栈不受限制:在微服务架构中,可以结合项目业务及团队的特点,合理的选择技术栈。
加快系统演进速度:每一个应用都可以独立的进行版本更新,通过灰度发布等技术手段能确保发布过程中整个系统稳定运行。
突破性能瓶颈:每个应用都能独立的水平伸缩,使系统性能可以根据计算资源的增加而得到线性的扩展。
微服务的挑战
世上没有免费的午餐,微服务技术让 IT 系统变得更敏捷、更健壮、更高性能的同时,也带来了架构复杂度的提升。对于开发者而言,要想更好的驾驭微服务架构,需要解决持续集成、服务发现、应用通信、配置管理、流量防护等一系列难题。幸运的是,针对这些普遍存在的难题,业界涌现了一系列优秀的开源技术组件和工具,让开发者可以更轻松的构建微服务应用。像 Spring Cloud 和 Dubbo 这样的技术框架,经过多年的发展,已经演化为微服务领域的通用标准,极大地降低了微服务的门槛,但这些技术框架依然没有办法解决其中两个最大的挑战,这两个挑战成为摆在开发者面前的两座大山。
挑战一:亟需完善的生命周期管理与服务治理方案
在一个频繁迭代的系统中,每个应用会经常性面临新版本发布需求,需要对应用的上线、下线、更新、回滚等流程进行集中性的管理,并配合精细粒度的灰度发布手段,减少版本迭代对业务造成的影响。
挑战二:亟需完善的水平扩容与缩容方案
当某一个应用的性能出现瓶颈,需要通过增加实例数量来提升性能的时候,就需要引入新的计算资源。
新的计算资源从何而来呢?
对于线下 IDC 而言,计算资源是需要预先规划的,扩容并不是一件简单的事情,可能会因为各种条件的制约而导致扩容无法实现。当然这种困扰在云计算时代不复存在了,为一个应用扩充计算资源是信手拈来的事情,但光有计算资源是不够的,还得在上面部署应用,并将应用容纳到微服务体系中。
为了解决这两个难题,开发者们尝试了各种各样的方案,新的理念以及技术框架在过去的这五年层出不穷。在一轮轮的优胜劣汰下,以 Docker 为代表的容器技术,在 Kubernetes 生态的支撑下,在业界成为了主流,是构建云原生(Cloud Native)应用的必备要素。容器化相关技术能够更大程序的挖掘云计算的价值,在一定程度上帮助开发者解决这两个难题。
在应用生命周期管理以及服务治理方面, Kubernetes 提供了比较完善的实现机制,通过构建 Deployment 资源,配合 proStop 和 postStart 脚本,能比较方便的实现滚动发布以及应用的优雅上下线。虽然在灰度发布的过程中,依然没有办法直接对流量进行精细粒度控制(引入 Service Mesh 技术能增强流量控制力,不在本文讨论范围),但相比简单的发布脚本,已经有了飞跃性的提升。
在应用的水平扩容与缩容方面,通过容器化技术可以极大程度的减少操作系统安装以及系统级初始化的时间,但购买虚拟机的操作是无法避免的,所以在系统遇到流量增突的时候,依然没有办法实现快速水平扩容。我们可以预留一部分计算资源,放在资源池中,当应用有扩容需求的时候,就向资源池申请资源,当业务负载下降的时候,再把多余的计算资源归还到资源池中。
这其实并不是一个好主意,每一个计算资源都是需要成本的,资源池虽然能够解决计算资源快速投入使用的问题,却造成了巨大的浪费。另外,到底规划多大的资源池,也是一件很伤脑筋的事情,池子越大,造成的浪费就越大,但池子太小,又可能满足不了扩容的需求。
资源成本更深层次的分析
可能有的开发者会认为,目前的业务运行非常的稳定,在用户流量上并不存在明显的突增,所以扩容和缩容是一个伪需求,在将来也不会有这样的需求。这可能是对互联网业务的一种误解,因为完全没有扩容需求的情况是不存在的。
首先,只要一个系统是为人服务的,就必然存在波峰和波谷。对于一个 7*24 小时运行的系统,不可能永远保持同样的用户流量,二八原则对于很多业务系统依然适用( 80% 的用户流量集中在 20% 的时间段)。即便是用户流量相对平衡的系统,在凌晨也存在流量的低谷,如果能更进一步的释放闲置计算资源,提升资源利用率,就能显著的降低资源使用成本。
因此,微服务架构在本质上就是对弹性伸缩有着强烈诉求的,在弹性伸缩的过程中,不管是单应用的水平弹性伸缩,还是整套环境的启停,资源利用率都对最终的资源成本起着决定性的作用。如果能想办法提升资源利用率,就能为企业节省大量资源成本。值得我们重视的是,绝大多数的微服务应用的资源利用率都是非常低的。
我们可以做一个简单的统计:把所有服务器的 CPU 利用率每 5 分钟导出一次,按照天的维度求平均值,就能从整体上了解系统的资源利用率数据。如果把开发测试环境的服务器资源也纳入统计的范围,资源利用率很有可能会更低。
Serverless 化探索
资源利用率低的根本原因,在于以服务器为载体的应用架构中,开发者需要将构建好的程序包部署到服务器上,从而对多个用户事件进行响应。为了确保事件响应的及时性,需要让程序长驻于服务器上,而且尽可能保守的规划资源,以避免出现负载过重而导致服务崩溃的情况。在这个过程中,实际的负载在时间上分配并不均衡,从而导致整体的资源利用率偏低。
Serverless 技术的出现,为提升资源利用率提供了新的思路。Serverless 是一种构建和管理基于微服务架构的完整流程,允许开发者脱离服务器资源而直接部署应用。它与传统架构的不同之处在于,完全由第三方管理,由事件触发,存在于无状态(Stateless)的计算容器内。构建无服务器应用程序意味着开发者可以专注在产品代码上,而无须管理和操作服务器资源,真正做到了部署应用无需涉及基础设施的建设。
Serverless 技术存在多种形态,最典型的一种是 FaaS(Function as a Service,函数即服务),比如阿里云的函数计算(Function Compute,FC)产品。在函数计算领域,一切计算资源的申请和调度都由具体的业务事件触发,当业务事件所对应的任务完成之后,计算资源会被立即释放。这样的方式真做到了计算资源的按需分配,能显著提升资源利用率,是 Serverless 技术的终极形态。
另外一种是 Serverless 化的容器技术,Serverless 化的容器实例运行在案例隔离的环境中,每个计算节点通过轻量级虚拟化安全沙箱技术完全强隔离。对于使用者而言,无需购买服务器资源即可直接部署容器应用,也无需对集群进行节点维护和容量规划,可以根据应用配置的 CPU 和内存资源量进行按需付费。当微服务应用需要扩容的时候,就可以快速获得计算资源,不需要再经过购买服务器这个步骤了,可以帮助开发者降低计算成本,减少闲置资源浪费,平滑应对突发流量高峰。阿里云的 Serverless Kubernetes(ASK)就是 Serverless 化容器技术的代表产品。
https://gocn.vip/topics/11161