基于Serverless的云原生转型实践

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

云原生架构是什么

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

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

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

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

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

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

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

为什么需要云原生架构

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

纵观中国企业级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):

    云原生架构成熟度模型

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

    传统架构

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

    无服务化(Serverless)

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

  • 运维成本高:ECS的各项状态、高可用都需要运维同学维护。
  • 弹性能力不足:每次有大促活动时,都需要提前购买ECS,扩展服务的节点数,然后再释放,并且这种情况只适用于定时定点的活动,如果是不定时的流量脉冲则无法应对。
  • 所以首先我们要将服务的部署方式Serverless化,我们可以选择Serverless App Engine(SAE)作为服务应用的发布、部署平台。SAE是面向应用的Serverless PaaS平台,能够帮助用户免运维IaaS、按需使用、按量计费,做到低门槛服务应用云原生化,并且支持多种语言和高弹性能力。

    命名空间

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

    创建应用

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

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

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

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

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

    绑定SLB

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

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

    服务/配置中心

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

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

  • 需要快速转型,对服务/配置中心高可用要求不是特别极致的情况下,建议直接使用SAE自带的Nacos即可,代码不需要做改动,直接在SAE中创建应用即可。SAE控制台提供的配置管理在界面操作和功能上和开源Nacos的控制台基本一致。
  • 对服务/配置中心高可用要求比较高的情况下,建议使用MSE Nacos,它的优势是独享集群,并且节点规格和节点数量可以根据实际情况动态的进行调整。唯一不足的一点就是需要修改Nacos的接入点,算是有一点代码侵入。
  • 对于现状是使用Eureka和ZooKeeper的客户而言,建议直接使用MSE Eureka和MSE ZooKeeper。

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

    MSE有三块核心的功能点:

  • 支持三大主流服务中心,节点规格和数量灵活搭配,可在运行时动态调整节点规格/数量。
  • 通过命名空间逻辑隔离不同环境。配置变更实时推送并且可追踪。

  • 配置变更实时推送并且可追踪。
  • 配置变更实时推送并且可追踪。
  • 手动扩缩

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

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

    自动扩缩

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

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

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

    成本优化

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

    可观测性(Observability)

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

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

  • 应用的整体健康状况。
  • 应用每个实例的健康状况。
  • 应用每个接口的健康状况。
  • 而SAE对应用的监控也都覆盖了上述这两个维度和三个角度。

    应用整体健康状况

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

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

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

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

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

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

    比如查看JVM指标:

    应用接口健康状况

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

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

    比如查看SQL调用分析:

    纵向Metrics指标

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

    横向调用链路

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

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

  • 该接口在服务级别的完整请求链路,比如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服务中的接口也有问题。
  • 声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

  • (0)
    上一篇 2021年3月5日
    下一篇 2021年3月5日

    相关推荐