云原生微服务应用平台 EDAS 2022 年度报告

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-应用监控,每月50GB免费额度
简介: 最近一年来,随着我们的客户对于云技术的诉求从资源快速交付的服务,转变为对资源精益运用的服务。EDAS 团队结合公共云上所服务的企业类客户的几万个应用,选取了 8 个最具代表性的指标,进行了一次系统性的分析整理和总结,希望可以给当前正在从事软件架构的从业人员一个侧面的视角,来了解一些当下发生在身边的技术现象。

作者:孤戈


最近一年来,随着我们的客户对于云技术的诉求从资源快速交付的服务,转变为对资源精益运用的服务。EDAS 团队结合公共云上所服务的企业类客户的几万个应用,选取了 8 个最具代表性的指标,进行了一次系统性的分析整理和总结,希望可以给当前正在从事软件架构的从业人员一个侧面的视角,来了解一些当下发生在身边的技术现象。


报告内容


JDK 版本分布


1.png


解读


在 JDK 9 之前,JDK 基本上平均每三年出一个版本。但是自从 2017 年 9 月分推出 JDK9 到现在,JDK 开始了疯狂更新的模式,基本上保持了每年两个大版本的节奏。到现在已经发布了十个版本到 JDK 19。其中包括了两个 LTS 版本(JDK11 与 JDK17)。除了版本更新节奏明显加快之外,JDK 也围绕着云原生场景的能力,推出了一系列诸如容器内资源动态感知、无停顿 ZGC、云原生安全等方面的能力。不过从 EDAS 中的数据也可以看出,目前大部分的用户目前主要停留在 JDK8 上,近一年能看得出大家有意识的在往高版本上靠拢。这里友情提醒一下,JDK8 确实是最为经典的一个版本,但是他的推出已经是八年前,官方的支持与更新也已经停止一段时间,建议大家尽快升级到比较新的 LTS 版本。如果确实因为客观原因无法升级的用户,也建议使用阿里巴巴开源的免费的 JDK 版本 DragoonWell ,可获得无差别的兼容能力。


微服务框架分布


2.png


解读


服务框架是微服务体系中最为重要的一个技术组件,在业务开始之初确定选型之后,基本上会伴随整个业务的生命周期,直至业务出现大范围重构。HSF 是阿里巴巴内部使用最为广泛的一个服务框架,整个电商系统都围绕 HSF 进行构建,EDAS 产品化之后,HSF 也跟随商业化节奏输出到了很多的国计民生的业务中。到后来我们重启了 Dubbo 的开源,Dubbo 以优雅的设计,丰富的扩展能力,和性能强劲的通信框架获得了程序员的广泛认可。在后来的云原生席卷之下,有越来越多的客户开始选择了 Spring Cloud + Kubernetes 这一形态作为架构选型上的默认搭配。云原生下另一被认为是未来的微服务架构是 Service Mesh,它以语言无侵入的设计,融合全流程的流量治理能力推出之初就足够惊艳,但是任何技术都不会绝对的完美,近几年微服务框架是 Fast SDK 还是 Mesh 的争论也一直在进行。在目前我们观察到的现象来看,这一理念已经被越来越多的客户接受,但落地场景目前大部分还是存量异构业务架构的通信能力上。从技术成熟度曲线来看,Mesh 即将往成熟期迈进。


云资源形态分布


3.png


解读


在公共云上 EDAS 一共支持虚拟机 ECS、Kubernetes 与  Serverless 三种形态,从数据上看,随着 Kubernetes 成为微服务架构形态下的默认选择,Kubernetes 应用的占比第一年超越ECS,从去年的 45% 攀升至 67%。另外随着大家对于降本诉求显著增加,Serverless 以低资源碎片、免运维全托管、随用随弹的特性,变得越来越流行。阿里云自身的云产品也很多都在以 Serverless 的形态进行重新托管,而微服务以无状态的属性,和 Serverless 的弹性更加的契合。针对存量应用已经是 Kubernetes 集群的场景,EDAS 也支持以原有资源为基础,使用 Serverless 资源承载弹出来的负载的混合资源调度方式。也增强了以应用为维度将微服务和 Serverless 的技术融合,可使原有应用在无需任何改造和迁移的情况下获得 Serverless 的技术红利。


应用实例规格分布


4.png


解读


ECS 应用的规格主要集中在 2C4G、4C8G、8C16G 中,同时大规格的应用也占据了相当大的一部分;同时以 Kubernetes 应用的规格更加多样化,除去有将近 30% 的应用没有设置 Request 或 Limit 的场景,有设置的应用中,主流 Kubernetes 的应用规格均以小规格为主,占比最大的规格为 CPU:MEM = 0.25C1G 的规格。这一数据很能说明云原生的优势,即容器以轻量隔离的方式,支持主机内任意资源的调配,即使在 JVM 默认会占用大块内存的应用形态下,大部分的微服务应用在运行时依然只需要很小的资源就能保证稳定运行。相比于虚拟机的的场景,不仅能提供更加丰富的规格来满足业务的形态,而且还能以更高密的部署形态来提升资源的整体使用率。


JVM 堆内存设置分布


5.png


解读


内存资源区别于其他的基础资源(网络、计算、存储),是一种非压缩的资源。我们给客户提供优化建议时,这是一个最重要的参考指标。在 JVM 中,由于本身堆的设计,叠加容器内 CGroup 对于内存分配的影响,让容器内的内存变得愈发的朴素迷离。在最近的几个 JDK 版本发布过程中,GC 技术是每个版本中最为重要的更新之一,从 G1 到 ZGC 再到 Shenandoah GC,在以前经典且优秀的 GC 设计基础之上,推陈出新。围绕着云原生场景推出了一系列让人振奋的新的能力,如:JEP 351 中定义的 "Uncommit Unused Memory" 让 JVM 可以有机会将未使用的堆归还内存给操作系统。JEP 387 中定义的 "Elastic Metaspace" 让 JVM 可以有机会将未使用的 Metaspace 归还给操作系统。JEP 393/424 中定义了全新的 Foreign Memory/Function/Linker Access API 等等,这些迹象表明即使 JVM 也在新的云原生场景下,正在一步步的完成自己的蜕变,使自己更加云原生,一步步的将云计算的红利向我们释放。


应用启动时长分布


6.png


解读


应用启动时长直接影响整个业务的健康程度,尤其是在发布场景下,由于进程有一个重启切换的过程,应用启动越快,可以更小范围的影响应用的发布带来的流量损耗。近年来,各个云计算的厂商在使用各种不同的技术手段来优化应用冷启动的时长,在不考虑应用自身启动时长的前提下,很多云厂商基本上都突破了秒级启动的场景,现在在进一步攻克毫秒级的冷启动能力。抛开云厂商利用自身的基础设施进行不断的优化之外,我们自己的业务初始化是否能做到快速的冷启动这个话题更值得我们自己去探究。正常来说,启动的时间主要分布在应用的构建,调度与初始化阶段:


  1. 在构建和调度阶段,构建之后需要将更新的镜像层进行重新推送,这也会进一步导致在 POD 调度之后更新所更新镜像层的重新拉取。所以我们要合理利用容器镜像本身的分层机制,做最大程度的缓存是提升的关键
  2. 在初始化阶段,在主容器启动之前,要尽量避免 init-container 执行时间过长;同时在主容器启动拉起 JVM 之后,新版本的 JDK 也提供了 CDS 这样的 Class 预加载技术,如果能合理利用在业务类很大的应用中,可节省大量的冷启动时间。


弹性策略使用情况分布


7.png


解读


从数据上来看,虚拟机的应用类型弹性(8.2% 的应用设置了弹性策略)占比反而比容器形态(仅有 1.37%的应用设置了弹性策略)比较高,不过都处在一个较低的水平。而弹性规则上,60% 的应用都趋向于直接使用基础指标的 CPU 弹性。弹性能力是云计算诞生以来,带来的最大的技术红利。在满足业务平常流量的前提下,用户可以将突发流量所需要用到的资源以弹性的方式对待。站在资源供给的角度来说可分为以下三种:


  1. 第一种是按需新购:即从 0 到 1 的供给形式,在需要使用时再临时将资源买入。
  2. 第二种是资源池化:即先将资源进行池化处理,在需要时分配,不需要时归还。利用各个应用的资源峰值不一样,将资源进行自动的调配。
  3. 第三种是混合调度:即池化和按需新购相结合,在池化的资源依然不能满足最终容量的时候,将需要弹性分配的资源按需购买再进行应用的扩容。


EDAS 一直持续在优化各个场景下的弹性伸缩能力,如:在 ECS 虚拟机类型的应用场景中,从应用视角支持临时购买的方式将资源一步接入到应用中 ;在容器的场景中,不仅提供资源混合调度的能力,而且也提供基于容器服务 ACK 的智能预测 AHPA 机制,让弹性行为先一步于业务高峰触发,保证流量高峰真正到来时的服务质量。在资源高效利用、业务连续稳定这两个场景下,我们会持续耕耘,永不停息。


应用健康度指标分布


8.png9.png


解读


第一张图的 CPU 利用率是统计了所有应用在一天中的平均指标,简单理解就是绝大多数的 CPU 利用率为 10% 以下。第二张图和第三张图分别是所有应用的错误率(4xx/5xx/RPC Error等)分布图和响应时间分布图。这个三个数据,如果是在同一个业务中(即有业务的上下游关联关系),它大致可以解读为:在提供一定的资源容量下,系统的稳定性(响应时间 + 响应错误率)情况。这在压测场景下是一个通用的系统容量评估指标。


10.png


如上图所示,资源供给量和系统稳定性,不是一个绝对的线性关系,在性能评估的过程中,我们主要是需要评估两个点:第一个性能前拐点是 P1,在这个点之前,可以简单理解为整个的稳定性吞吐会随着资源的增加而增加。但是到达这个点之后,单纯的资源增加并不能带来更好的系统稳定性,这个时候我们需要去优化的是业务逻辑、业务架构、或者其他的基础设施(如参数调优等)。找到并不断的将这个点往左移,是我们在常规的系统压测时最主要的目标。


第二个性能后拐点是图中的 P2,这个往往被大部分人所忽略,由于绝对意义上的水平伸缩的系统太理想了,我们绝大多数应用尤其是微服务应用依赖错综复杂,单纯优化一处的资源等到我们的业务量真正上来的时候往往是不够的,因为我的依赖方(DB、Redis、下游应用、或其他基础设施容量等)可能无法做到水平扩展来应对无限的容量。


尾言


这一份报告,某些数据能反馈出当下流行的技术趋势,可以结合咱们自己所从事的业务系统有一个行业维度的对照,但是不能一概而论简单的套到我们自己的业务形态中。技术跟随着一定的趋势像大河一样往前涌动。在每一个当下,如何运用技术为我们的业务创造更多更大的价值,是我们技术人员始终应该去追求的目标。EDAS 作为一个云原生应用 PaaS 平台,始终围绕着微服务这种工作负载类型结合云技术,给大家提供以应用为中心的最佳技术实践。让大家在微服务架构在云原生场景下落地的过程中,少走一些弯路,缩短落地路径。


点击此处查看 EDAS 详情

相关实践学习
使用DAS实现数据库自动SQL优化
本场景介绍如何使用DAS实现数据库自动SQL优化。
SpringMVC框架入门
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts2等。 相关的阿里云产品企业级分布式应用服务 EDAS:企业级分布式应用服务 EDAS(Enterprise Distributed Application Service)是一个应用托管和微服务管理的 PaaS 平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持 Spring Cloud、Apache Dubbo(以下简称 Dubbo )等微服务运行环境,助力您的各类应用轻松上云。产品详情: https://www.aliyun.com/product/edas 
相关文章
|
16天前
|
运维 持续交付 开发工具
深入浅出:GitOps在微服务架构中的应用
【10月更文挑战第26天】本文深入探讨了GitOps在微服务架构中的应用,介绍了其核心理念、自动化部署流程和增强的可观测性。通过实例展示了GitOps如何简化服务部署、配置管理和故障恢复,并推荐了一些实用工具和开发技巧。
|
7天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
8天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
6天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
6天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
6天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代软件开发中的应用与挑战
【10月更文挑战第37天】随着云计算技术的不断演进,云原生技术已经成为推动软件开发现代化的重要力量。本文将深入探讨云原生技术的核心概念、优势以及面临的挑战,并通过一个实际的代码示例,展示如何在云原生环境中部署一个简单的应用。我们将从云原生的基础架构出发,逐步引导读者理解其在现代软件开发中的关键作用。
18 1
|
14天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
52 1
|
20天前
|
敏捷开发 Cloud Native 持续交付
云原生技术在现代企业中的应用与实践
【10月更文挑战第23天】本文将深入探讨云原生技术在现代企业中的广泛应用,并结合具体案例分析其对企业数字化转型的推动作用。我们将从云原生技术的基本原理出发,逐步揭示其在提高业务敏捷性、降低成本和增强系统可靠性方面的优势。同时,文章还将分享一系列成功实施云原生技术的企业案例,为读者提供实践中的参考和启示。最后,我们将讨论云原生技术面临的挑战及未来的发展趋势,为企业在这一领域的进一步探索提供指导。
|
21天前
|
Cloud Native 持续交付 云计算
云原生技术深度探索:构建现代化应用的基石####
【10月更文挑战第21天】 本文将深入探讨云原生技术的核心概念、关键技术及其在现代软件开发中的应用。我们将从容器化、微服务架构、持续集成/持续部署(CI/CD)、无服务器架构等关键方面展开,揭示这些技术如何共同作用,帮助企业实现高效、弹性且易于维护的应用部署与管理。通过实例分析,展现云原生技术在实际项目中的显著优势,为读者提供一套全面理解并应用云原生技术的指南。 ####
31 2
|
16天前
|
Cloud Native 安全 持续交付
云原生技术在现代软件开发中的应用与挑战####
本文深入探讨了云原生技术在现代软件开发中的广泛应用及其面临的主要挑战,旨在为开发者和企业提供实用的指导和策略。云原生技术通过其独特的架构和方法论,极大地提升了软件的可扩展性、弹性和敏捷性。然而,随着技术的不断演进,如何有效应对其在安全性、复杂性和成本控制等方面的挑战,成为了业界关注的焦点。本文将详细阐述云原生技术的核心概念、实际应用案例,并针对当前面临的主要挑战提出相应的解决策略。 ####

相关产品

  • 企业级分布式应用服务