基于Serverless的云原生转型实践

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 新一代的技术架构是什么?如何变革?是很多互联网企业面临的问题。而云原生架构则是这个问题最好的答案,因为云原生架构对云计算服务方式与互联网架构进行整体性升级,深刻改变着整个商业世界的 IT 根基。

作者:计缘,阿里云解决方案架构师


云原生架构是什么


回顾过去十年,数字化转型驱动着技术创新和商业元素的不断融合和重构,可以说,现在已经不是由商业模式决定采用何种技术架构,而是由技术架构决定企业的商业模式。所以无论是行业巨头还是中小微企业都面临着数字化转型带来的未知机遇和挑战。机遇是商业模式的创新,挑战来自对整体技术架构的变革。


新一代的技术架构是什么?如何变革?是很多互联网企业面临的问题。而云原生架构则是这个问题最好的答案,因为云原生架构对云计算服务方式与互联网架构进行整体性升级,深刻改变着整个商业世界的 IT 根基。


虽然云原生的概念由来已久,很多人并不理解什么是云原生。从技术的角度来讲,云原生架构是基于云原生技术的一组架构原则和设计模式的集合,旨在将云应用中的非业务代码部分进行最大化的剥离,从而让云设施接管应用中原有的大量非功能特性(如弹性、韧性、安全、 可观测性、灰度等),使业务不再受非功能性业务中断困扰的同时,具备轻量、敏捷、高度自动化的特点。简单的说,就是帮助企业的业务功能迭代更快、系统能承受住各种量级的流量冲击的同时,构建系统的成本更低。


image.png

传统架构

云原生架构

代码

三方软件使用

非功能性能力

业务代码给写

三方饮件使用

集功能性能力

业务代码填写

开发人员

基础设龙运蠕

业务运线

Paas

1aa5

业务运维

运维人员

传统架构与云原生架构的区别


上图展示了在代码中通常包括的三部分内容,即业务代码、第三方软件、处理非功能特性的代码。其中“业务代码”指实现业务逻辑的代码。“三方软件”是业务代码中依赖的所有三方库,包括业务库和基础库。“处理非功能性的代码”指实现高可用、安全、可观测性等非功能性能力的代码。


这三部分中只有业务代码是对业务真正带来价值的,另外两个部分都只算附属物,但随着软件规模的增大、业务模块规模变大、部署环境增多、分布式复杂性增强,使得今天的软件构建变得越来越复杂,对开发人员的技能要求也越来越高。云原生架构相比较传统架构前进了一大步,即从业务代码中剥离了大量非功能性特性到 IaaS 和 PaaS 中,从而减少业务代码开发人员的技术关注范围,通过云服务的专业性提升应用的非功能性能力。


这便是云原生架构的核心思路。


为什么需要云原生架构


解释完什么是云原生架构后,大家可能会有进一步的思考,即当今互联网企业为什么需要云原生架构。分析下SaaS的市场规模可以发现,2019年SaaS市场规模为360亿元,2020年仍保持可观上涨趋势,2022年SaaS市场规模预计破千亿。

image.png

纵观中国企业级SaaS行业发展历程,大体分为四个阶段:2015年之前,中国市场和绝大多数中国企业对“什么是SaaS”缺乏基本认知,基于私有部署的传统软件形式仍为主流,企业级SaaS市场方兴未艾。到了2015年,随着云计算技术的进一步成熟,中国企业级SaaS行业进入快速成长阶段,这个慢赛道逐渐为公众所知。


时至今日,在疫情、经济、社会环境的大背景下。互联网企业开始寻求新的商业模式,一些抓住机会的SaaS企业实现了快速响应,结果是其业务呈现成倍增长,比如:


  • 餐饮SaaS厂商帮助线下餐饮门店开发小程序点餐系统,实现无接触点餐。
  • 电商零售领域的ERP厂商帮助企业建立会员管 理系统。
  • 营销SaaS厂商通过流量平台帮助企业在线营销,远程触达客户。


所以,在“如何活下去”成为热门议题的背景下,快速响应能力成为企业之间的核心竞争优势,SaaS企业需要及时满足市场的新需求。而这正是前几年中国SaaS企业为了快速占领市场、盲目跟风、一味借鉴国外产品所产生的天生缺陷。为弥补这些缺陷,SaaS厂商需要根据市场的需求快速调整产品服务方向,业务功能要多元化,业务体系需要新的枝杈,在技术上也有更大的挑战。


除了市场带来的压力,SaaS企业自身也有诸多痛点:


  • 大多SaaS产品只做所谓的通用能力,或者只是一味模仿国外产品,一旦深入到行业属性比较重的场景时便无法满足需求,所以被贴上了“半成品”的标签,导致市场接受程度不如预期。
  • 产品模块单一、功能相似的SaaS产品很容易陷入价格竞争,最后只能以亏损获得网络效应,但会终食恶果。
  • 市场对SaaS产品的定制化需求过多,使得SaaS企业缺乏对产品打磨的精力,把一个SaaS型公司做成了项目型公司。


SaaS企业解决以上的外忧内患的核心就是专注在业务。要做好一款SaaS产品,对于业务渠道、竞争格局、用户体验等诸多方面都有更加严苛的要求,甚至从市场运营、产品经理到研发、运维都要专注在业务,所有这些角色的本职工作都应该为行业业务服务,行业的深度分析,快速响应市场,稳定的产品质量这些是必须要具备的。但这就要求技术具备更快的迭代速度,业务推出速度从按周提升到按小时,每月上线业务量从“几十 / 月”提升到“几百 / 天”,并且不可接受业务中断。


另一个互联网企业需要云原生转型的原因是中国的刘易斯拐点已经到来。刘易斯拐点,即劳动力过剩向短缺的转折点,是指在工业化进程中,随着农村富余劳动力向非农产业的逐步转移,农村富余劳动力逐渐减少,最终达到瓶颈状态。用大白话说就是中国的人口红利已经逐渐消退,企业劳动力成本不断增加,加上2020年疫情的影响,成本因素越来越成为企业的重要考量。而SaaS产品订阅制付费、通用性强、低部署成本的特点,便成了企业降本增效的新选择。这是SaaS企业在市场中的机会,而且对于SaaS企业本身来说,同样有降本增效的需求,而且内部降本增效做得越好,SaaS产品在市场上的竞争力会更加明显。


以上这些现状的解法和云原生架构和核心能力不谋而合:


  • 云原生将三方软件和非功能性能力的完全兜底,可以极大程度解放企业研发、运维人员的精力,并使其可以专注在业务上。
  • 系统的横向扩展性、高可用性、健壮性、SLA由云原生架构兜底,解决了SaaS产品最忌讳的稳定性问题。
  • 将一些自建的组件迁移至云原生架构中,对传统的部署方式和资源进行云原生化,GitOps的落地,在资源成本和人力成本方面都有进一步的优化。


如何落地云原生架构


在聊如何落地云原生架构之前,我们先来看一看云原生架构成熟度模型(SESORA):

image.png

ACNA-1

ACNA-4

ACNA-3

ACNA-2

指标维度

(1分)

(0分)

(3分)

(2分)

全部服务化&有治理体系

服务化能力

部分服务化&缺乏治理

Mesh化的服务体系

(自持技术,初步服务化)

(单体应用)

(自持技术,初步服务化)

(云技术,治理最佳实践)

(Service)

非全云方式闭环

半闭环

全人工扩缩容

弹性能力

基于云全闭环

(监控+代码伸缩,百节点规模)

(监控+人工扩缩容)

(固定容量)

(基于流量等多策略,万节点规模)

(Elasticity)

无服务器化程度

有状态存储委托给云

无状态计算委托给云

全无服务器方式运行

未采用Baas

(Serverless/FaaS运行全部代码)

(数据库,文件,对象存储等)

(计算,网络,大数据等)

(Serverless

360度SLA度量

用户体验持续优化

性能优化&错误处理

可观测性

(用观测大数据提升业务体验)

(链路级Tracing,Metrics度量)

(Observability)

(日志分析,应用级监控,APM)

秒级切流,业务无感

十分钟级切流

韧性能力

分钟级切流

(主备HA,集群HA,冷备容灾)

(Serverless,Servicemesh等)

(Resilience)

(熔断,限流,降级,多活容灾等)

自动化能力

基于容器的自动化

基于AI的自动化

具备自描述能力的自动化

(自动化软件交付和运维)

(提升软件交付自动化)

(基于容器做CV/CD)

(Automation)

云原生架构成熟度模型


云原生架构成熟度模型有六个评判维度,可以将成熟度划分为4个级别。我会从自动化能力、无服务化能力、弹性能力、可观测性、韧性能力这五个维度,贯穿说明如何落地云原生架构。


传统架构

image.png

HTTP请求

NGINX

简单的反向代理

VUE前端

公网SLB

绑定SLB

ECS集群

两台ECS

统一对外暴露接口

spring

ServiceA

java

REST调用

台ECS

三台ECS

台ECS

ServiceB

ServiceD

Service

一台ECS

三台ECS

三台ECS部署Nacos

ServiceE

ServiceF

NACOS

应用注册在自建Nacos

上图展示的是一个较传统的Java+SpringCloud架构应用服务侧的部署架构。除了SLB,基本上所有的组件都部署在ECS上。下面我们来一起看看如何将这个架构转型为云原生架构。


无服务化(Serverless)


Serverless的概念是什么在这篇文章不在赘述,可以参阅这篇文章进行了解。使用ECS集群部署服务的架构有两个显著的短板:


  • 运维成本高:ECS的各项状态、高可用都需要运维同学维护。
  • 弹性能力不足:每次有大促活动时,都需要提前购买ECS,扩展服务的节点数,然后再释放,并且这种情况只适用于定时定点的活动,如果是不定时的流量脉冲则无法应对。


所以首先我们要将服务的部署方式Serverless化,我们可以选择Serverless App Engine(SAE)作为服务应用的发布、部署平台。SAE是面向应用的Serverless PaaS平台,能够帮助用户免运维IaaS、按需使用、按量计费,做到低门槛服务应用云原生化,并且支持多种语言和高弹性能力。


命名空间

打开SAE控制台,我们首先创建命名空间,SAE的命名空间可以将其下的应用进行网络和资源的逻辑隔离,通常我们可使用命名空间来区分开发环境、测试环境、预发环境、生产环境。

image.png

Serverless应用引SAE

Serverless应用引车SAE金名空间

命名空间

咸览页

创球命名空间

应用列表

命名空闷名称/D

道述

操作

命名空间

配玄百理

详情

从认碎名空间

AK..

cn-hangzhou

SK:显示

详怡裤华出除

cn-hangzhou:1

SKC安示

开发

详情维辑

出除

AK:

SK:显示

详惊关别出障

cn-hangzhou:tost

SK:显示


创建应用

创建好命名空间后,我们进入应用列表,即可选择不同的命名空间,看到其下的应用或者创建应用:

image.png

Serverless应用引SAE密列表

Serverloss应用引率SAE

应用列表

杯.览页

应用列卖

当龙合名密面的遗型统程内行或珑.互右详}

命名字司

Ponmunm

全Is认(cr-hangzhoutltestdemoiweizhong-tes

你等

创起店用

问海入应用名称

血用奖称

会名空间

应用播述

标签

弗性策差启电队态

密用名欢

当前实例效/目标实列教

IKF-BIOO

木设置

cn-hangzhou:jiyuan

未设置

ikf-nginx

cn-hangzhour:jiyuan

未设西

iKF-SAEDemo

曾国/集制

angzhoucivuan

未亲用

Di3

iKF-wieb

cn-hangzhouciyuan

末设置

女制

ienkins

cn-hangzhou:jiyuar

口Ka

启理包制

末没置

Kalka-consumer-dcmo

官玩与动

末注百

50/50

台玩15制

末没置

3月3

2X

甘理:1日制

末设置

管理/生刘

末设置

Tedl-sl


选择对应的命名空间,然后创建应用:

image.png

创建须知:

1.创建应用之前请提前创建VPC网络,不支持经典网络.

2.SAE仅支持无状态应用.

面用在YC内就以是不限动间公网的,如果爱场问公网请按以下误示带作用如何汤间公同,见间公网场是佳

4.如果你的应用需要访问RDS数据库,请参考:如何设晋RDS白名单

应用基本信息

确认规格

应用部智配置

您当产下Cn-hanghou的应用总实钢政制为300个,目您已使用11个,如需埠加额度请现工单.

应用名称:

自定义配置

自动配置

专有网络配置:

命名空间

请选择VPC

请选择

(支持多选)

请选择vswitch

VSwitch:

安全组:

请输入安全组全名查询

(最多创建50个)

应用实例数

VCPU:

0.5core

8Core

16Core

32Core

4Core

1Core

2Core

内存

4GIB

2GIB

应用描述:

介绍应用的基本情况

o/100

  • 应用名称:服务名称,用户自行输入。
  • 专有网络配置:
  • 自动配置:自动帮用户配置VPC、Vswitch、安全组。这些组件都会新创建。
  • 自定义配置:用户选择命名空间,VPC,VSwitch以及安全组。一般选择自定义配置,因为咱们的服务所属的VPC肯定要和其他云资源的VPC是相同的,这样才能保证网络畅通。这里需要注意的一点是,当在新的命名空间下第一次创建好应用后,该命名空间就会和所选的VPC进行绑定,之后再创建应用时,该命名空间对应的VPC不可更改。如果需要更改,可以进入命名空间详情进行更改。
  • 应用实例数:应用(服务)节点数量,这里的节点数量按需设置,而且不是最终设定,因为后续可以手动或者自动的扩缩节点数。
  • VCPU/内存:该应用在运行过程中需要的CPU和内存的规格。这里的规格是单个实例数的规格。既如果选择了2C4G,那么有2个实例的话,就是4C8G。


配置完基本信息后,下一步进入应用部署配置:

image.png

  • 技术栈语言:Java语言支持镜像、War包、Jar包三种部署方式,其他语言支持镜像部署方式。以Java Jar包方式为例:
  • 应用运行环境:默认标准Java应用运行环境即可。
  • Java环境:目前支持JDK7和JDK8。
  • 文件上传方式:支持手动上传Jar包或者配置可以下载Jar包的地址。
  • 版本:支持时间戳和手动输入。
  • 启动命令设置:配置JVM参数。
  • 环境变量设置:设置容器环境中的一些变量,便于应用部署后灵活的变更容器配置。
  • Host绑定设置:设置Host绑定,便于通过域名访问应用。
  • 应用健康检查设置:用于判断容器和用户业务是否正常运行。
  • 应用生命周期管理设置:容器侧的生命周期脚本定义,管理应用在容器在运行前和关闭前的一些动作,比如环境准备、优雅下线等。
  • 日志收集服务:和SLS日志服务集成,统一管理日志。
  • 持久化存储:绑定NAS。
  • 配置管理:通过挂载配置文件的方式向容器中注入配置信息。


我使用Jar包的方式部署完应用后,在对应命名空间下就可以看到刚刚创建的应用了:

image.png

Serverless应用引SAE列表

应用列表

全部1致认(cn-hangzhoujliitestdemo1wzhang-tes开发

鼓屿

美试

zoujing-hangzhou

ICI项目

谢北/jason-ns

shda

test-serverless

shiyangENV

xunrU

jiyuan

md-5a时

标签

创注应用

应用名称

检入应用名称

命名空间

弹性策障启开状态

标签

应用名称

当前实例数/目标实例数

操作

应用描述

未设置

2/2

仓理

复制

Service-A

cn-hangzhourtestservertess

(已送中0个应用)

北量设置标料

共1条

北量自动应用

上一页

每页吴示:

拉量停止应用

下一页


点击应用名称可以查看应用详情:

image.png


绑定SLB

因为ServiceA在架构中是对外提供接口的服务,所以需要对该服务绑定公网SLB暴露IP和做负载均衡,在SAE中,绑定SLB非常简单,在详情页中,即可看到应用访问设置:

image.png

添加SLB时可以选择新建也可以选择已经创建好的SLB:

image.png


服务/配置中心

对于微服务架构,服务中心和配置中心是必不可少的,大家常用到一般是Nacos、Eureka、ZooKeeper三种。对于云原生架构来讲,根据不同的场景,服务/配置中心可以有以下几种选择:

image.png


对于现状就是使用Nacos的客户而言,转型云原生架构,服务/配置中心如上面表格所示有两种选择:


  • 需要快速转型,对服务/配置中心高可用要求不是特别极致的情况下,建议直接使用SAE自带的Nacos即可,代码不需要做改动,直接在SAE中创建应用即可。SAE控制台提供的配置管理在界面操作和功能上和开源Nacos的控制台基本一致。

image.png

  • 对服务/配置中心高可用要求比较高的情况下,建议使用MSE Nacos,它的优势是独享集群,并且节点规格和节点数量可以根据实际情况动态的进行调整。唯一不足的一点就是需要修改Nacos的接入点,算是有一点代码侵入。


对于现状是使用Eureka和ZooKeeper的客户而言,建议直接使用MSE Eureka和MSE ZooKeeper。


这里我简单介绍一下MSE。微服务引擎MSE(Microservice Engine)是一个面向业界主流开源微服务框架Spring Cloud和Dubbo一站式微服务平台,提供治理中心、托管的注册中心和托管的配置中心。这里我们用到的是MSE的托管注册中心和托管配置中心。

image.png

MSE有三块核心的功能点:


  • 支持三大主流服务中心,节点规格和数量灵活搭配,可在运行时动态调整节点规格/数量。

image.png

引擎类型

ZOOKeeper

Eureka

Nacos

引擎版本

1.2.1

1.1.3

Nacos在1.2.1版本开始支持配置中心

4核8G

引擎规格

(MSE实例能力评估)>>

+

集群节点数

3台

代一个集联零台上浊规格的ECs组成,例如:zo0keepe集群址汉至少由3台ECS组成,否则无法保障高可用.

  • 通过命名空间逻辑隔离不同环境。

image.png

命名空间名

命名空间ID

public

205048f9-8dd9-4df2-alee-80a309baa292

test

b88fdadd-3e014728-873e-6fa693891d61

develop

b8db9ac2-98fb4652-b297-686b109780cb

prod

  • 配置变更实时推送并且可追踪。

image.png


弹性能力(Elasticity


云原生架构成熟度模型中的弹性能力同样依托于SAE来实现,因为Serverless的底层实现原理,所以在SAE中的应用实例数(节点数)扩缩速度非常快,可达到秒级。


进入应用详情页的实例部署信息,可以看到应用的具体实例:

image.png


SAE提供了两种扩缩应用实例数的方式,手动方式和自动方式。

手动扩缩

在控制台右上方有手动扩缩操作按钮,然后选择要扩缩到的实例数即可:

image.png


当进行扩缩时,我们可以看到具体实例的变更状态:

image.png

应用列表(Service-A)

挂本信总

ELe月

回汇万安版本

品烹空用

手动扩

动扩馆

基本信

密用市罗更流程正在执行,处干执行中状态,查有详

1.他用至Vpg内界不性才公河,如课需公网山校洪下任性应用而公包,见而公网,律

2.如来的夜用需要间RDS双库,请梦考:如何改置RDS白名中

查本信总

实例部去信息

常性仲箱

用芸列志

论控

Java

认分组

表态:运行2个实炒

示奖号P信点

进鸡道店

实闲名称

步行狱态

操门

去行时自

1614071269545

init:or1

可用区fe

H牌

实时且

可用区G长

件|无尼|划险

weoshel

1614071269545

Running

实时日击

实时目击

可用区Gfe

RunNing

未配置健质检膏

H除

WABSHOL

牛件

1614071269545

仁一页

image.png

应用列表(Service-A)

马本追总

变更记录/变更详情

转止效更

变死记录

变买程D:sh34c17-3516-480-Bdae-odf19b7a

分批间处理方试:

发布分批数:

用工料

2021-02-2610:26:35

饮用善

苏行扶心:

常亮一型:

发布到间:

执行中

日志无理

日标实外微:

显豆对统:

达信总:

型礼监控

第1扯变更

匠用生理

别新

服务列表

广容应用

初始化环说

取功

应用扩道

吃功

程何话仅克持laval

适键报宫

scalcscrverlessappsucco5s

找行应用部苦


自动扩缩

在控制台右上角有自动扩缩操作按钮,然后可以看到创建扩缩规则的界面。SAE自动扩缩提供时间策略和指标策略两种。

image.png

上图是时间策略,即设置好具体的时间节点,在这个时间节点要将应用的实例数扩到几个或者缩到几个。这种策略适合流量高峰期有相对明确时间节点的场景,比如在线教育的客户,通常流量高峰在晚上8点开始,11点逐渐结束,这种情况下,通过定时策略在7点半左右把应用的实例数扩起来,然后11点之后逐渐把应用实例数缩回正常。


image.png

上图是指标策略,目前提供CPU使用率、内存使用率、应用的QPS阀值、应用接口平均响应时间(RT)阀值四种指标,这四种指标可以配合使用。当这四种指标其中有一种达到阀值后就会触发扩容,会对应用实例进行逐渐扩容。当指标小于阀值后触发缩容。这种策略适合流量高峰时间不固定的场景,比如市场营销,游戏运营。


成本优化

对于弹性能力,大家可能更多的是关注它能让系统快速支撑流量脉冲,增加系统横向扩展的能力。其实因为SAE有极致的弹性能力,再加上按分钟、按量计费的模式,对整体的资源成本是有一定优化的。

image.png

SAEVS非Serverless模式弹性成本对比

500

450

400

350

300

250

200

150

100

50

0

12345678910111314151617181920223

非Serverless模式

SAE


可观测性(Observability


应用侧的可观测性分两个维度,一是纵向的Metrics指标,比如主机的CPU、内存、磁盘各项指标,Pod的CPU、内存各项指标,JVM的Full GC、堆内存、非堆内存各项指标。另一个维度是横向的请求调用链路监测,上游服务到下游服务的调用、上游接口到下游接口的调用。


在监控微服务架构时,通常需要从三个角度来看:

  • 应用的整体健康状况。
  • 应用每个实例的健康状况。
  • 应用每个接口的健康状况。


而SAE对应用的监控也都覆盖了上述这两个维度和三个角度。


应用整体健康状况

进入应用详情页,点击左侧菜单中的应用监控/应用总览,便可以看到应用的整体状况:

image.png

总请求品

平均响应时间

实时实例数

FullGC

ESQL

18

7.9ms

2845.4K

83次

周同比+2.7%

周同比合3.0%

固同比一0%

周同比一0%

周同比-0%

日同比一0%

日同比+0.4%

日同比一0%

日同比:

日同比素0.4%

0%

应用相关事件?

02-1300:00

02-0100-00

02-1900:00

02-0700:00

应用提供服务?

4口

~口

应用提供服务平均响应时间/每天点击的钱突培点深度分析(专家版可用)

应用提供服务请求/每天点击由线突措点深展分析(专家版可用)

?HTTP入口

HTTP入口

3000K

8.6ms

2250K

1500K

750K

2.2ms

Dms

02-0100:00

02-2200:00

02-2200:00

02-0800:00

02-1500:00

02-0100:00

02-1500-00

02-0800:00

  • 总请求量:可以一目了然的看到请求量是否明显的异常,比如骤降或者陡升。
  • 平均响应时间:应用整体接口的平均响应时间,这个指标直接反映最真实的应用健康状况。
  • Full GC:JVM里比较重要的指标,也是会直接影响系统性能的因素。
  • 慢SQL:智能抓取执行时间大于500ms的SQL。
  • 一些曲线视图:帮助我们掌握不同时段的应用情况。


应用实例节点健康状况

进入应用详情页,点击左侧菜单中的应用监控/应用详情,便可以看到应用每个节点的信息:

image.png

从上图可以看到,左侧会列出当前应用的所有实例节点,包括该节点的平均响应时间、请求次数、错误数、异常数。如果我们按照影响时间降序排序,比较靠上的节点就是响应时间较慢的节点,然后我们就需要分析是什么原因导致这些节点的响应时间较慢。所以,右侧会提供了一些检查维度来帮助我们分析排查问题。


比如查看JVM指标:

image.png

下游应用

SQL调用分析

概览

接口快照

JVM监控?

错误分析

上游应用

NOSQL调用分析

GC腺时次数/每天

GC院时耗时/每天

挝时佰

茅计信

原时信

东计佰

YOungGC次数

FUINGC耗时YoungGc耗时

FUIIGC次数

1.75

165

8

1.2s

900ms

02-04-02-05

02-04-02-05

800ms

600ms

FUlIGC尾时:1.1s

FULIGC次款:

YoungGC次拨:35

YoLngGC耗时:1.4s

300ms

Omg

02-2600:00

02-0900:00

02-2600:00

02-1700:00

02-0900:00

02-1700:00

02-0100:00

02-0100:00

4日

元空间详情/每天

堆内存详情/每天

年轻代Edon区

使用总和

老年代

年轻代Surwivor区

114.4M

381.5M

02-04~02-05

858M

286.1M

使用总和:345.2M

02-04~02-05

老年代:52.0M

57.2M

元空间:110.7M

年轻代Surtvor区:11.3M

年轻代Edan区:281.9M

02-2200:00

02-2200:00

02-1500:00

02-1500:00

02-0100:00

02-0100:00

02-0800:00

02-0800:00

直接缓冲区/每天

非堆内存/每天

DirectBuer总大小DrectButter用大小

程交字节数初始节数?大字节拟

8594K

644.5k

02-04-02-05

02-04-02-05

DirectButter总大小808.2K

?提交字节莅:170.9M

DirectBufier使用大小808.2K

初始字节数:2.4M

47.7M

2148K

最大字节数:0

02-0100:00

02-0800:00

02-1500:00

02-0100:00

02-1500:00

02-2200:00

02-0800:00

02-2200:00

MM线程数!每天

02-04~02-05

120

钱程总数:139

牙锁钱程敬:0

新注铁程数:0

即等华程数:0

Runnable的线程队:28

1800:00

02-1500:00

02-2200:00

02-0100.00

终结线程数:0

Tmod_WArtng的线程数:75

死锁线程致新硅程致距基线程数Rumnable的程数终结钱程数

Waiting的线程数

TimedWaiting的钱程数

Waiting的选程款:37


应用接口健康状况

进入应用详情页,点击左侧菜单中的应用监控/接口调用,便可以看到应用每个接口的信息:

image.png

NE浓

接口快照

响应时间求敬/错误数/异常仪

错误分析

N海

梓览

SQL调用分析

链路上游

连路下沪

NoSQL调用分析

话罐入

API

iblog/selection/1

4.8s/110/0/0

ikf-wveoyb..

/blogitag/o/o/SlowsQL/o

785.2ms/38/00

35.2BAWEHUIP

/bloghtmi7

89.8ms/14/0/0

/blogltag/o/10/AMQP/o

年话352ms

50.1ms/28/0/0

readSize

34.3ms/78/0/0

KF-Blog:...

ftopArticles

26.4ms/111/0/0

/blog/tag/o/o/undefined/o

21ms/2/010

1.18次线MYSCL

14.8ms/24/0/0

/blog/tag/Lotalo/SlowSol

T商CA1Ms

/bloghtml/10

14.06ms/17/010

RESET

ikeyforge

/blog/tag/o/o/AMQPDeleyMg/13.8m2

/blog/7

13.3ms/1293.2K/0/0

响应时间/每天点击由线突话点温度分析(专家版可用)

请求数/每天

/bloghtml/5

12.1ms/9/0/0

1600K

16ms

[article/match/%C3%A5%c2...

11.06ms/16/0o

120CK

12ms

jarticle/match/%C3%A6%C2%...

9.2ms/26/0/0

OCK

blogjallyo/10/o

8.2ms/2422/0/0

Om5

blog/5

8.1ms/18/0/0

02-2200:00

02-1500:00

D2-0100:00

02-0日00:00

02-2200:00

02-1500:00

02-0800:00

02-0100:00

HTTP入口

HTTP入口

jarticlejmatch/%C3%A7%c2%..07s14

接口监控和应用实例节点监控的思路一致,左侧会列出所有请求过的接口,同样显示了响应时间、请求数、错误数,右侧同样提供了一些检查维度来帮助我们分析接口RT高的原因。


比如查看SQL调用分析:

image.png

错误分析

异常分析

SQL调用分析

接口快照

链路下游

链路上游

概览

NOSQL调用分析

NEW

NEW

SQL调用统计/每天

员9

4000

3000

2000

1000

01-0500:00

03-0500:00

数据库类

所属应用

平均耗时小

操作

调用次数非

SQL语句

selectdeckojdasdkik

aerc32deckoamcontlkic

ikf-

artiact52kocouk

调用统计接口快照

50

3.6s

MySQL

database

cd8_2decko.citycitkucu

decko.creaturecountasceatur2kocu

decko_.cxascx13_2,

2.dcko.czascz14._2odkatir


纵向Metrics指标

在上述三个角度中,其实已经涵盖了绝大多数Metrics指标,比如有应用健康状态的指标、JVM的指标、SQL指标、NoSQL指标等。

横向调用链路


在很多时候,我们单纯的看Metrics指标是无法确定问题的根本原因的,因为会涉及到不同服务之间的调用,不同接口之间的调用,所以需要查看服务和服务之间、接口和接口之间的调用关系以及具体的代码信息。在这个维度上,SAE集成的ARMS的监控能力便可以实现。我们在应用监控/接口调用/接口快照中可以看到有请求的接口快照,通过TraceID便可以查看该接口的整体调用链路:

image.png

链路下游

SQL调用分析

镇误分析

橄览

链路上游

接口快照

NOSQL调用分析

响应时间:求致/错误故异常数具

新入接口名称搜案

计轮入

接口名称

耗时护

产生时间

所店月

状态

操作

blog/selection/1

4.8s/138/0

2021-02-0412:06:21

音看日志

iIKF-BIoG

119a907b1612411580794100697ba1

5.055

blogiselection/1

/blog/tag/o/o/SlowSQL/o

785.2ms/38/00

./blogftag/o/o/AMQP/o

查石日志

119a907b1612411580794100697ba1

iKF-BIoG

50.1ms/28/0

2021-02-0412:06:20

5.055

plog/selection

ireadSize

35.0ms/162/0/0

查石日志

5.05s

KF-BIOG

2021-02-0412:42:00

blog'selection/

d8b80d981612413720791100897ba1

21.9m5/139/00

ltopArticles

查布日志

iKF-BIOg

2021-02-0412:41:26

5.03s

bloa/sclcction/1

ce7219db1612413685984100697ba1

21.01ms/82/0/0

blog/10

云布日志

iKF-BIOG

5.02s

blogiselection/

393beb2e1612413746008102997ba1

2021-02-0412:42:25

19.5ms/4/0/o

rblog/tag/o/o/undefined'o

查石日志

KF-Blog

a16fbd1t1612413727270100897ba1

2021-02-0412:42:07

5.01s

店log/selectionh

18.4ms/1903.0k/0/0

/blogl7

查看日志

KF-Blog

59112C61612413776446100897ba1

2021-02-0412:42:55

5.01S

blog/solection/

iblogitag/totao/SlowSQL

14.8ms/24/0/0

KF-BIOG

右日志

2021-02-0412:42:53

5.01S

blogrsclection/1

4727CC41612413773467100897ba1

/blog/tag/o/o/AM@PDeleyMsg/o13.8m/25/

查看日志

KF-BIoG

2858767a1612413688444100697ba1

2021-02-0412:41:28

blogiselection/

5.010s

jarticle/match/%C3%A5%C2..

11.06ms/16/0/0

查石日志

/bloghtmi/o

10.2ms/773/00

KF-BIOG

393beb2e1612413746008102997ba1

Bblogiselectionh

5.009s

2021-02-0412:42:26

bloghtml/5

10.1ms/699/010

查石日志

7514Q5f1612413750562100897ba1

KF-Blog

5.009s

2021-02-0412:42:29

blogyselection/1

10ms/2/0/0

blog/9

7514511612413750562100897ba1

矿右日志

2021-02-0412:42:30

KF-BIoG

blog/selection/1

5.009s

10ms/1/0/0

/bloghtml/9

bloa/selectionn

查看日志

2021-02-0412:41:25

KF-BloG

5.0095

ce7219db16124136859841000697ba1

image.png


从上面这个图我们可以看出很多信息:


  • 该接口在服务级别的完整请求链路,比如ikf(前端)-> ikf-web(java服务)-> ikf-blog(java服务)-> ikf-blog(java服务)
  • 每个服务的状态情况,比如状态一列是红点,说明在这个环节是有异常出现的。
  • 在每个服务中请求的接口名称。
  • 每个服务的请求耗时。


除了上述这些显性的信息以外,还有一些隐性的信息:


  • 上游服务ikf-web的总耗时是2008ms,但下游服务ikf-blog的总耗时是5052ms,而且耗时起点是一样的,说明ikf-webikf-blog是一个异步调用。
  • 既然ikf-webikf-blog是异步调用,然而ikf-web的耗时有2s之多,说明ikf-web服务中的接口也有问题。
  • ikf-blog服务中,又有内部接口被调用,因为从调用链上出现了两个ikf-blog,并且这个内部调用是同步调用,而且问题出现在最后一个接口调用上。


从以上这些信息可以帮我们缩小和圈定问题根因出现在哪个环节的范围,然后我们可以点击方法栈一列的放大镜,查看具体的方法栈代码信息:

image.png

方法栈

应用名称:iKF-Blog

服务名称:/blog/selection/1

IP地址:

产生时间:2021-02-0412:06:21.044

耗时:5053ms

Traceld:119a907b1612411580794100697ba1

线程剖析

方法栈

提示:如果方法栈不足以定位代码问题,请继续查看线程剖析结果.

调用方法

行号

时间轴(ms)

扩展信息

5053ms

TomcatServletProcess

Oms

org.apachecatalina.co.dHl

5053ms

109

che.catalina.connector.Rquestrquestc.caai

connector.Responseresponse)

异常:org.apache.catalina.com

org.springframework.web.selet.ameworkSele.dG

866

atorg.apache.catali5052ms

etCiavax.serlet.http.Httqqjax

rlet.http.HttpSerletResponseresponse)

atorg.apache.catali

BlogController.findBlog

5035ms

227

BylsSelection(intisselection)

com.mysqljdbc.connectionlmpl.prepareStteen

1ms

4036参

参数:selectblogo.idasid

tdjava.lang.Stringsql)Tags

com.mysqljdbc.Preparedttemet.execQ

1ms

1964

参数:selectblogo.iaasi

yoTags

从方法栈这里我们又可以得到很多显性信息:


  • 具体的方法。
  • 每个方法的耗时。
  • 方法产生的具体异常信息。
  • 数据库操作的具体SQL语句,甚至SQL上的Binding Value。


当然除了显性信息外,还有一个比较重要的隐性信息,比如我们可以看到BlogController.findBlogByIsSelection(int isSelection)这个方法的耗时是5s,但是该方法内部的数据库操作的耗时很少,只有1ms,说明耗时是属于业务代码的,毕竟业务代码我们是抓不到也不会去抓取信息的。这时我们可以有两种方式去定位具体问题:


  • 从方法栈信息中已经知道了具体的服务和具体的方法,那么直接打开IDE查看、分析代码。
  • 查看方法栈页签旁边的线程剖析,也基本可以确定问题所在。比如上图这个情况,我们查看线程剖析后会发现他的耗时是因为java.lang.Thread.sleep( ):-2 [3000ms]

image.png

韧性能力(Resilience)

对于云原生架构的韧性能力,我会从优雅上下线、多AZ部署、限流降级三个方面来聊一聊。

优雅上下线

一个好的产品,要能快速应对用户对产品功能、能力具有普适性的反馈和意见,能快速响应市场需求的变化。那么产品的功能就需要快速的做迭代和优化,从IT层面来看,就是要有快速、高效、高质量的发布变更流程,能够随时进行生产环境的服务发布。


但是这会带来一个核心问题,即频繁的服务发布,并且不能影响用户体验,用户的请求不能断流。所以这就要求我们的系统部署架构中有优雅上下线的能力。


以微服务架构来说明,虽然开源的产品有能力和方案做到近似优雅上下线,但也是近似做到,当发布服务节点较多的情况下依然会有断流的情况。所以开源方案有诸多问题:

  • 注册中心不可靠、通知不及时。
  • 客户端轮训不实时、客户端缓存。
  • 自定义镜像非1号进程,Sigterm信号无法传递。
  • 无默认优雅下线方案,需要添加actuator组建。


在无服务化/服务配置中心章节中,我阐述了SAE自带的服务中心和MSE的服务中心,无论使用那种方案,我们都对优雅上下线做了进一步的优化。

image.png

-----------

注册中心

4.通知消费者

2.主动从注册中心注销

2.通知下线信息

服务提供者

服务消费者A

1.正常调用

3.服务进行发布

5,刷新调用列表

6.切换调用目标

服务消费者B

服务提供者

5,刷新调用列表

从上图可以看到,部署在SAE的应用具有主动通知服务中心和服务消费者的能力,再结合Liveness应用实例探活和Readiness应用业务探活的机制,能让我们的服务在进行部署和因为其他原因挂掉时不会影响用户的正常访问。

多AZ部署

本着鸡蛋不能放在一个篮子里的原则,一个应用的多个节点,应该分布在不同的可用区,这样整体应用的高可用和健壮性才是足够好的。SAE支持设置多个交换机(VSwitch),每个交换机可以在不同的可用区,这样在部署、扩容应用的节点时会随机从可选的可用区拉起实例:

image.png

image.png

什本信息

实例部暑信息

弹性伟圩

黑认分组

状态:运行6个实例

显示实例IP信耳

操作

运行状态

版本

运行时间

实列名称

ySwitch

小时

可用区Gfc

1614935796516

实时日志

车件

Running

H除

主肩

..567zk

2小时

可用区Gfc

实时日志

1614935796516

Running

Nobshe

可用区HSwitch-cnh

小时

实时日志

Running

.fwcbg

小时

可用区Hswitch-cnh

1614935796516

实时日志

Running

..ptvsp

可用区HSwitch-cnh

1小时

1614935796516

实时日志

...nw65t

Running

川除

1614935796516

实时日志

1小时

出除

可用区Gfc

Running

子付

..X4gbc

Webshel


这就避免了当某个可用区出现问题挂掉时,整体系统因为在一个可用区而挂掉,这也是最基本的同城多活的实践。

限流降级

限流降级是系统断臂求生的能力,在遇到突发的流量脉冲时,可以及时限制流量,避免整个系统被击穿,或者当流量超出预期时,及时切断非核心业务,释放资源来支撑核心业务。


目前对于Java应用,SAE也支持限流降级的能力,首先对应用的所有接口的请求指标进行抓取和监控:

image.png

image.png

然后我们可以针对每一个接口设置流控、隔离、熔断的规则,比如我对/checkHealth接口设置一条流控规则:

image.png

新增规则

隔离规则

熔断规则

流控规则

根据实时调用QPS控制接口流量,超过值时通过配置的方式进行流控处理.查看详情

接口名称

/checkHealth

是否集群流控

该规则关闭,不生效

是否开启

来源应用

default

链路入口

当前接口

关联接口

统计维度

用于接口调用流控.该接口被来源应用调用次数超过间值时,会对当前接

口来自于来源应用的请求进行流控

单机QPS阚值

50

排队等待

预热启动

快速失败

流控效果

常规流控方式.当前接口超过设置闸值的流量,直接返回默认流控信息,

如文本/静态页面等.

当该接口的QPS达到50后,单个机器超过50的请求将快速失败。比如我们对一个有6个节点的应用进行压测时,可以看到每个节点的QPS情况:image.png

当开启流控规则后,可以立即看到限流的效果:

image.png

历史数据

历史数据

RT数据

QPS数据

400

4.8

Wdyhhiuh价

2021-03-0520:12:27

300

3.6

通过qps

50

拒绝qps

278

200

2.4

异常gps

2021-03-0520:12:28

1.2

100

RT(ms)

20:09

20:10

20:12

20:10

20:10

20:11

20:10

20:09

20:11

20:12

拒绝aps

通过qps

异常qps

RT(ms)

历史数据

历史数据

CPU

Load

100

2021-03-0520:12:50

1.2

75

系统CPU使用率

等待10完成的CPU使用率

50

0.8

用户CPU使用率

8.72

2021-03-0520:12:50

0.4

25

0.38

load

20:09

20:11

20:12

20:13

20:10

20:11

20:10

20:13

20:12

20:09

用户CPU使用率

等待10完成的CPU使用率

系统CPU使用率

load

image.png

QPS统计

174.4k

239.7k

同比

环比

通过请求数

流控请求数

异常请求数

2.4k

20:12

1.8k

通过QPS

300

1.2K

拒绝QPS

1.7k

600

异常QPS

0

20:10

20:13

20:12

20:11

20:11

可以看到QPS被精准的控制到50,超过50的请求直接返回失败。


自动化能力(Automation)

在自动化能力方面,我主要从CICD流程这个维度来聊一聊。大家从上面章节的截图可以看到,有很多是SAE控制台的截图,在实际应用中肯定不会通过控制台来一个一个发布应用,必然都是通过CICD流程来做自动化的应用打包和发布流程。


SAE在这个方面提供两种实现自动化运维的方式。

基于Gitlab和Jenkins

目前很多企业的CICD流程都是基于Gitlab和Jenkins来做的,那么SAE也支持将发布的操作集成到这种方案里。这个方案的核心是SAE会提供一个Maven插件,同时对应有三个配置文件,Maven插件通过这三个配置文件中的信息将打包好的Jar/War或者镜像发布到对应的SAE应用中。

image.png

  • toolkit_profile.yaml:配置RegionID、AccessKey ID、AccessKey Secret。
  • toolkit_package.yaml:配置比如应用部署包类型、部署包地址、镜像地址。
  • toolkit_deploy.yaml:配置比如SAE应用的ID、应用所属命名空间ID、应用名称、发布方式等。


更详细的配置信息可以参阅该文档


然后在Jenkins的任务中,对Maven设置如下的命令即可:

clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml 


这样就可以很容易的将SAE的部署流程集成到基于Gitlab和Jenkins的CICD方案里了。

image.png

基于Open API

还有一些企业会自己研发运维平台,运维赋能研发,由研发同学在运维平台上进行运维操作。面对这种场景,SAE提供了丰富的Open API,可以将SAE控制台上90%的能力通过Open API集成到客户自己的运维平台中。详细的OpenAPI说明可以参与该文档


总结


基于SAE武装过系统后,整体的部署架构会变成这样:

image.png

HTTP请求

NGINX

简单的反向代理

VUE前端

公网SLB

绑定SLB

SAE

SAE应用,2个实例

统一对外暴露接口

ServiceA

REST调用

SAE应用,1个实例

SAE应用,3个实例

SAE应用,1个实例

iKF-Blog

iKF-User

iKF-Database

SAE应用,3个实例

SAE应用,1个实例

MSE

iKF-Katka

iKF-AMQP

NACOS

应用注册在MSE

云原生架构成熟度模型(SESORA)在我阐述的这五个维度一共是15分,基于SAE的云原生架构在这五个维度会达到12分:


  • 无服务化:3分
  • 弹性能力:3分
  • 可观测性:2分
  • 韧性能力:2分
  • 自动化能力:2分


对于上手、实践、落地快捷简单,又能达到比较好的云原生架构成熟度的SAE方案,大家还在等什么呢?一起实践起来吧。如果大家有任何问题,可以加入钉钉群:35712134来寻找答案,我们不见不散!


扫码了解更多技术干货与客户案例:

公众号.png


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
23天前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
13天前
|
Cloud Native 安全 Java
铭师堂的云原生升级实践
铭师堂完整经历了云计算应用的四个关键阶段:从”启动上云”到”全量上云”,再到”全栈用云”,最终达到”精益用云”。通过 MSE 云原生网关的落地,为我们的组织带来了诸多收益,SLA 提升至100%,财务成本降低67%,算力成本降低75%,每次请求 RT 减少5ms。
铭师堂的云原生升级实践
|
9天前
|
人工智能 Serverless API
尽享红利,Serverless构建企业AI应用方案与实践
本次课程由阿里云云原生架构师计缘分享,主题为“尽享红利,Serverless构建企业AI应用方案与实践”。课程分为四个部分:1) Serverless技术价值,介绍其发展趋势及优势;2) Serverless函数计算与AI的结合,探讨两者融合的应用场景;3) Serverless函数计算AIGC应用方案,展示具体的技术实现和客户案例;4) 业务初期如何降低使用门槛,提供新用户权益和免费资源。通过这些内容,帮助企业和开发者快速构建高效、低成本的AI应用。
50 12
|
18天前
|
Serverless 开发工具 开发者
活动实践 | 西游再现,函数计算一键部署 Flux 超写实文生图模型部署
这些图片展示了阿里巴巴云开发者生态的多个方面,包括开发工具、技术文档、社区交流、培训认证等内容,旨在为开发者提供全方位的支持和服务。
|
12天前
|
Cloud Native 安全 Java
杭州铭师堂的云原生升级实践
在短短 2-3 年间,杭州铭师堂完整经历了云计算应用的四个关键阶段:从“启动上云”到“全量上云”,再到“全栈用云”,最终达到“精益用云”。也从云计算的第一次浪潮,迈过了第二次浪潮,顺利的进入到了 第三次浪潮 AI + 云。
|
12天前
|
Cloud Native
邀您参加云原生高可用技术沙龙丨云上高可用体系构建:从理论到实践
云原生高可用技术专场,邀您从理论到实践一起交流,探索云上高可用体系构建!
|
18天前
|
存储 弹性计算 关系型数据库
活动实践 | 告别资源瓶颈,函数计算驱动多媒体文件处理测评
本方案介绍了一种高效处理文件的方法,适用于企业办公和社交媒体应用。通过阿里云的函数计算、对象存储OSS和轻量消息队列,实现文件的异步处理,如格式转换和水印添加,有效减轻了核心应用的负担,提高了业务稳定性和资源利用率。方案包括云服务器ECS、云数据库RDS、OSS存储等组件,支持快速部署和资源清理。
|
23天前
|
Kubernetes Cloud Native API
云原生入门:从理论到实践的探索之旅
本文旨在为初学者提供一个关于云原生技术的全面介绍,包括其定义、核心原则、关键技术组件以及如何将这些概念应用于实际项目中。我们将通过一个简易的代码示例,展示如何在云原生环境下部署一个简单的应用,从而帮助读者更好地理解云原生技术的实践意义和应用价值。
|
23天前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
37 0
|
25天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。

相关产品

  • 函数计算