跳转到内容
云栖回顾 | 2024 云栖大会微服务和网关相关演讲材料点此了解

1.1 业务发展离不开服务治理保驾护航

微服务开发不简单

随着微服务技术的发展,微服务(MicroServices) 的概念早已深入人心,也越来越多的公司开始使用微服务架构来开发业务应用。
如果采用得当,微服务架构可以带来非常大的优势。微服务架构的最大好处是它可以提升开发和效率和系统整体的稳定性:

  • 开发和部署相对简单:单个微服务的功能可以更快地更改,因为可以独立部署、影响范围更小,启动和调试单个微服务的时间成本相比于单体应用也大大减少。
  • 横向扩展简单:根据业务的高峰低谷周期快速的横向扩展非常简单,因为单个微服务通常很小,可以随着系统整体负载的变化更快地启动和停止。
  • 架构升级灵活:单个微服务的“内部架构”可以迅速升级,因为微服务之间松散耦合的,只面向定义好的通讯接口进行编程。这使开发团队能够基于自身的技术背景和偏好灵活选择,而不会直接影响其他应用程序、服务或团队。
  • 更好的容错性:微服务之间可以实现更好的故障隔离,单个服务内的内存泄露等故障不容易影响其他服务,相比单体应用一个组件故障会拖垮整个系统。

但是微服务在实施过程中,也很容易遇到一些难点。如果微服务治理得不恰当,反而有可能适得其反,不仅不能享受到微服务架构带来的好处,反而会因为微服务带来的系统复杂性,造成开发、运维部署的复杂度增加,进而影响开发迭代的速度,甚至影响系统的整体稳定性。

我们总结了一些微服务开发实施过程中常见的问题:

  • 服务之间使用远程调用进行通讯,这比进程内的直接调用复杂很多。由于通讯链路的复杂性,可能会出现很多不确定的问题,会出现远程调用不可用或者延迟较高的情况,开发人员需要能够处理这些偶发问题,避免影响业务。
  • 随着业务的发展,微服务之间的拓扑图开始变得复杂,排查问题变得困难,搭建完整的开发测试环境成本也越来越大。
  • 当功能涉及到多个微服务模块时,迭代时需要谨慎地协调多个开发团队的迭代排期,才能保证迭代能够按时交付,达到敏捷开发的效果。

一个微服务成功落地的典型案例

观察了阿里云众多客户之后,我们总结抽象了一个微服务成功落地的典型案例,叙述了某公司是如何借助于微服务架构的红利,实现了业务快速增长的。案例详细说明了在业务发展的不同阶段,该公司在微服务实施过程遇到的问题,也描述了如何通过微服务治理来解决这些问题,从而享受到了微服务带来的开发效率和业务稳定性提升的红利,进而促进业务快速发展。

业务孵化期

初创公司在刚起步时,虽然业务量比较小、业务模式比较简单,但是为了在后续的快速发展中能够快速迭代,同时公司的人才储备也满足微服务开发的条件,于是在初创期就选择了使用微服务架构进行业务开发。

在技术选型方面,如果公司创始员工是技术出生,那么会比较倾向于使用自己擅长的微服务框架,比如创始人是 Dubbo 的 contributor ,或者是 Spring Cloud 社区的大咖或者 Spring Cloud Alibaba 的 contributor,又或者是 Service Mesh 社区的大咖,那么一般都会选用自己所擅长的微服务框架类型。还有一种选择是选用市面上最流行的微服务框架,比如 Java 体系,会选择 Spring Cloud 和 Dubbo。这样的话,在目前的招聘市场上也容易招聘到熟悉相关领域的人,从初学者到专家级的候选人都能很容易招聘到。

选定了技术选型后,基于开源的框架,很容易就能开发好最初的业务应用系统,跑通业务流程。这一阶段组件也很简单。简单的两三个应用,用户系统、业务系统、支持系统 + 注册中心 + 数据库 + 缓存,就可以开发完全部的应用。

对于一个生产级别的系统来说,在将整套系统部署上线之前,还需要建设监控报警系统。监控报警系统能够帮助我们实时监控机器和应用的状态。我们可以配置预设的报警规则,在出现机器资源不足,业务出现异常报错时这些情况时主动报警,提醒我们尽快处理系统中的风险和异常。保留下问题的现场,并帮助我们快速地定位和排查问题也同样重要,阿里云应用实时监控服务 ARMS 和 日志服务 SLS 能够在这些场景提供很大的帮助。

采用 ARMS + SLS 完成监控报警系统建设之后,将业务系统部署上线,完成第一次成功上线,业务开始正常运行起来了。

但是业务的开发和运营从来都不是一帆风顺的,在这个过程中,肯定也会遇到很多问题,我们先总结一下这个阶段常见的问题及应对方案:

  1. 因为代码本身逻辑出错导致业务异常:这时可以通过 SLS 查询日志,结合 ARMS 分析错误堆栈,找到根因,修改完代码后,重新发布来修复问题。
  2. 遇到性能瓶颈:则直接扩容操作,比如水平扩容应用,或者升级数据库。
  3. 发布新版本影响到用户:因为用户数和请求数都不算多,很容易就可以找到业务低峰期,在业务低峰期进行发布。
  4. 如何确保新版本的正确性,因为业务场景不复杂,内部测试就能覆盖所有的场景,测试通过就可以直接上线。

那如何识别自身的业务是否处于这个阶段呢?有一系列典型的特征:应用不超过 4 个,应用节点总数不超过 10 个 ,最高峰时候的 QPS 不超过 10 。

业务快速发展期

在活过初创期之后,公司的业务很受用户和市场的欢迎,注册的用户越来越多,用户使用的时长和功能点也越来越多,日活数越来越大,甚至市场中还出现了其他竞争者开始抄袭公司的业务,国内某巨头还亲自下场参与竞争。公司业务发展得非常顺利,这也意味着系统进入了快速发展时期。

市场发展很迅速,注册用户数、日活这些数据也是节节攀升,所有统计报表的数字都是一片向好。但是带来的挑战也越来越大,这个时期也是最危险的时期:在业务快速发展中,既要保证好已有业务的稳定性,又要快速地迭代新功能,还要克服团队招聘节奏跟不上业务发展的问题。

这个阶段典型的特征是 应用个数在 5 到 50 个,QPS 在 10 到 1000。这个时期经常会遇到的问题概括起来就是两个:稳定性问题和开发效率问题。

稳定性的问题:用户数多起来之后,系统的稳定性就显得比较重要,无论是用户在某段时间遇到异常报错增多,还是某一个功能点持续性地报错,再大到系统有一段时间完全不可用,这些都会影响产品在用户中的口碑,最后这种完全不可用的场景,甚至还可能成为微博等社交网络上的舆论热点。

开发效率的问题:随着用户的增多,相应的需求也越来越多,业务场景也越来越复杂,在这个时候测试可不是内部测试就能覆盖所有的场景,需要加大在测试上的投入。虽然功能需求越来越多,但是迭代的速度却要求越来越快,因为市场中已经出现了竞争者,如果他们抄得快,新功能也上得快,业务有可能会竞争不过,特别是当巨头亲自下场的时候,更需要跑得更快,开发节奏要快,测试节奏要快,发版节奏也要快。

那么如何去解决这两个场景的痛点呢,这时候可以要借助微服务治理的能力来解决。

  1. 开发测试提效
    1. 【开发环境隔离】传统的多套开发环境,需要使用多套的物理环境,才能实现多套环境各自独立互不干扰,但是多套物理环境的隔离的机器成本是很高的,基本上不大能接受。但通过全链路灰度这种逻辑隔离的方式实现开发环境隔离,可以在不增加成本的情况下增加多套开发测试环境,助你实现敏捷开发。
    2. 【自动化回归测试】自动化回归测试功能,可以将多个测试用例串联成测试用例集,将上一条测试的返回值作为下一跳测试入参,串联成具体的业务场景并沉淀到自动化回归测试中,在每一次的发版之前都跑一次自动化回归来验证功能的正确性,这样就可以大大节省测试的人力成本。更进一步,还可以通过 MSE 提供的流量录制回放功能,将线上的真实流量录制下来,并沉淀成自动化回归用例集,在测试环境进行流量回放,更进一步地提升测试 case 的覆盖率。
    3. 【服务契约】功能越来越多,迭代越来越快,API 越来越复杂,团队之前沟通的效率越来越低,API 文档严重过期。如果能自动生成服务契约,可以有效地避免文档腐化造成的开发效率低下的问题。

使用上面三点之后,可以再低成本的条件下支持多套开发测试环境,实现自动化回归测试,实现开发节奏和测试节奏的大大提效。

  1. 安全发布
    1. 【无损下线】无损下线问题的根本原因是开源的微服务体系没有确保应用提供者节点在停止服务前确保已经通知到所有消费者不再调用自己,也无法确保在处理完所有请求之后再停止应用。所以及时是新发版的应用,即使业务代码没有任何问题,也可能在发布过程影响用户的体验。
    2. 【无损上线】无损上线问题出现的原因是因为在某些场景下服务提供者,需要经过一段时间才能正常地接收大流量的请求并成功返回。同时在 K8s 场景下,还需要和 K8s 中的 readiness 、滚动发布等生命周期紧密结合,才能确保应用发布过程中能不出现业务报错。
    3. 【全链路灰度】新功能上线之后,可以通过灰度规则控制哪些用户可以使用。这样可以先选择让内部用户使用,测试新功能的正确性。当内部用户验证通过后,再渐渐地扩大灰度范围,确保每个功能都经过充分验证后再全量开放给客户,屏蔽掉发布新功能的风险。而且当出现问题时,可以通过修改灰度规则来实现快速回滚,做到新版本发版时几乎无风险。

使用以上几点之后,可以确保新版本的发布不出问题,而且可以做到白天在大流量场景下也轻松发布,在实现白天轻松发布之后,一天就可以发布多次,提升发布时候的稳定性和发版的效率。

  1. 屏蔽偶发异常导致的风险
    1. 【离群实例摘除】对于这些偶发的异常问题,离群摘除功能可以智能判断应用中的服务提供者某个出现了问题,智能地在一段时间内屏蔽掉这个服务提供者,保证业务的正常,等这个服务提供者恢复过来之后再进行调用。可以在应用节点出现偶发异常时,智能屏蔽掉此节点,以免影响业务,等此节点恢复后再继续提供服务,从而屏蔽偶发异常导致的风险。

据统计数据显示,有将近90%的线上故障是由于发版过程中出现的,剩下的 10% 左右的线上问题,可能是由于一些偶然的原因导致的。比如偶然的网络故障、机器 I/O出现问题、或者是某台机器负载过高等。在解决了发布时候的稳定性问题和偶发异常导致的风险后,基本能够确保线上业务不会出现灾难性的问题。

在业务快速发展的生死存亡期,您需要借助于这些微服务治理能力,才能确保业务能够又快又稳地增长,度过这段生死存亡期,成为这个领域的重要玩家。

业务成熟期

当业务进入成熟期之后,业务的开发进入了新的阶段,这时候,虽然快速发展过程中的问题仍旧存在,但是会因为业务量上来之后,遇到新的问题。
低成本创新:虽然发展不像原来那么迅速,但是业务创新探索的诉求仍旧存在,由于业务规模的扩大,创新的成本也在增加。这个时候不仅是需要快速开发迭代,更大的需求是用尽可能小的成本进行创新探索测试,有时候还需要使用上 AB 测试的手段进行实验比较。
容灾多活:由于业务规模已经很大了,治理中的稳定性的诉求更加强烈,而且随着业务范围的扩大,应用也开始在多个地域、多个云产品中进行部署。同城容灾、异地多活这类需求也开始出现。
问题定位:出现任何问题都必须彻查。虽然出现问题时,业务恢复仍旧排查第一位,但是业务恢复之后的问题根因定位也是不能少的,因为如果不彻查,难免后续不出现同样的问题。
风险预案:紧急预案、风险预防也变得非常重要,需要提前做好业务的保护和降级的埋点演练,再遇到绝大多数可预见问题可以紧急修复,出现不可控问题时,可以通过预案手段执行预案,确保整体业务的可控性。

从这个典型的案例中,我们可以看到,微服务的成功落地和业务的快速发展,离不开微服务治理的支持。在业务发展的不同阶段,会遇到不同的微服务问题,需要借助于治理的能力,为业务的又快又稳发展保驾护航。