5 个规则,确保你的微服务优化运行

发布于:2020 年 8 月 7 日 14:08

前阿里 P9 技术专家 李运华,正在传授十几年架构实战心法,超过 46000 人跟随学习,点击查看 >>
5个规则,确保你的微服务优化运行

最近几年好像大家都开始对微服务着迷,与此同时单体架构也在慢慢淡出人们的视线。

当然,热门的趋势总是来来去去,而且它们所受到的关注往往被媒体夸大了,实际情况并不总是如此。不过,对于微服务来说,人们似乎已经达成共识,认为这个趋势会一直存在下去。这是有道理的。从概念的角度来说,微服务扩展了工程师们几十年来采用的相同原则。

一旦你开始使用微服务架构,也许你需要本文中提到的 5 个规则,帮助你成功运行它们。

微服务的另一面

关注点分离 (SoC) 是一项设计原则,规定软件的构建应根据 "关注点 "或总体功能来确定不同的部分,30 多年来一直被用来决定如何构建技术。在单体应用中,它体现在典型的 3 层架构中的表现层、业务层和数据层的分离。

微服务采用了这个概念,并将其颠覆。它们将同一个应用程序以这样的方式分离出来,应用程序的单一代码库可以被分解并单独部署。这样做的好处是巨大的,但也是有代价的,通常体现在时间和金钱两方面的运维成本较高。除了将现有的应用程序过渡到容器所带来的巨大的前期投资之外,维护该应用程序也带来了新的挑战。

挑战 1:似乎很难监控整体

虽然单体应用程序也有其自身的挑战,但在单体中回滚一个“坏”版本的过程是相当简单的。在容器化应用中,事情就变得复杂许多。无论你是将单体应用逐步分解为微服务,还是从头开始构建一个新系统,你现在都有更多的服务需要监控。其中每一个都可能会:

  • 使用不同的技术和 / 或语言。
  • 运行在不同的机器和 / 或容器上
  • 使用 K8s 或类似的技术进行容器化和编排

随之而来的是,系统变得高度分散,更需要集中监控。遗憾的是,这也意味着需要监控的东西也多了起来。以前只有一个单体进程,而现在可能有几十个容器化进程运行在不同的区域,有时甚至是不同的云。这意味着不再有一套单一的运维指标来统治它们,IT/ 运维团队可以用它来评估应用程序的一般正常运行时间。取而代之的是,团队现在必须处理数以百计(甚至数以千计)的指标、事件和告警类型,他们需要从中分离出有效信号和无效噪音。

解决方案

DevOps 监控需要从扁平化的数据模型转向分层模型,在这种模型中,可以随时观察到一系列高级系统和业务 KPI。只要有一点偏差,团队就必须能够进入指标层次结构,查看干扰来自于哪个微服务,并从那里了解实际发生故障的容器。这很可能需要从数据存储和可视化的角度重新调整 DevOps 工具链。开源的时序 DB 工具,诸如 Prometheus 和 Grafana 7.0 等使得这个目标非常容易实现。

挑战 2:跨服务日志记录

在谈论监控应用程序时,首先要提出的事情之一是:日志、日志、日志。服务器每天都会产生的 IT 日志相当于碳的排放量,最终导致溢出的硬盘驱动器以及疯狂摄取、存储和工具成本。即使采用单体架构,你的日志也可能已经使你的工程师有些头疼。

使用微服务,日志变得更加分散。一个简单的用户业务现在可以通过许多服务进行,所有这些服务都有自己的日志记录框架。要解决问题,你必须从业务可能通过的所有服务中提取所有不同的日志,以了解问题所在。

解决方案

这里的主要挑战是了解单个业务如何在不同服务之间“流动”。为了实现这一点,需要对传统的单体程序在顺序业务执行期间通常如何记录所有事件的方式进行大量修改。尽管已经出现了许多框架来帮助开发人员进行处理(我们特别喜欢 Jaeger 的方法),但对于希望将单体重构为微服务的企业而言,转向异步、跟踪驱动的日志记录仍需要付出艰巨的努力。

挑战 3:部署一项服务会破坏另一项服务

单片机世界中的一个关键假设是,所有代码都是在同一时间部署的,这意味着应用程序处于最脆弱状态的时间范围是一个已知的、相对较短的时间段(即部署后的前 24-48 小时)。在微服务的世界里,这个假设不再成立:由于微服务本质上是相互交织的,其中一个服务细微的变更可能会导致行为或性能问题,而这些问题会在另一个服务中体现出来。因此所面临的挑战是,当前出现故障的微服务使得另一个开发团队并没有预料到他们的代码会出现中断。这既会导致整个应用意外的不稳定性,也会导致一些组织内部的摩擦。虽然微服务架构可能让部署代码的过程变得更容易,但实际上却让部署后验证代码行为的过程变得更难。

解决方案

企业必须创建共享的发布日历,并且每当部署相关的微服务时,都要分配资源用于密切测试和监控整个应用的行为。在没有跨团队协调的情况下部署新版本的微服务,就像牛油果加吐司一样,是解决这一挑战的成功秘诀。

挑战 4:难以找到问题的根本原因

在这一点上,你已经锁定了有问题的服务,提取了所有需要提取的数据,包括堆栈跟踪和日志中的一些变量值。你可能还有一些 APM 解决方案,比如 New Relic、AppDynamics 或 Dynatrace。从那里,你会得到一些额外的数据,关于一些相关方法的异常高处理时间。但是…问题的根本原因呢?

你(希望)从日志中得到的前几位变量数据很可能不会是那些移动针的数据。它们通常更像是面包屑,指向下一条线索的方向,而不是更进一步的原因。在这一点上,我们需要尽我们所能,发掘出更多应用程序下的 “魔力”。传统上,这需要发出关于每个失败事务状态的详细信息(即到底为什么失败)。这里的挑战是,需要开发人员具有巨大的预见性,以知道他们需要哪些信息来提前排除问题。

解决方案

当微服务中的错误根源横跨多个服务时,制定一个集中的问题根源检测方法至关重要。团队必须考虑需要哪些信息颗粒来诊断未来的问题,以及它们应该在什么层级上发出日志,以考虑到性能和安全因素——这是一座高高的山,而且是一座永无止境的山。

挑战 5:版本管理

我们认为值得强调的问题是,从典型的单体架构中的层模型过渡到微服务的图模型。由于超过 80%的应用程序代码通常是第三方代码,因此在公司的不同微服务之间管理第三方代码的共享方式成为避免陷入前所未有的“依赖地狱”的关键因素。

考虑这样一种情况:一些团队在使用第三方组件或共享实例程序的 X.Y 版本(几乎所有公司都有),而其他团队则使用 X.Z 版本。这就增加了由于不同版本之间缺乏兼容性而产生的关键软件问题的风险,或者说,不同版本之间行为的轻微变化,可能会导致需要排查最特异和痛苦的软件 bug。

而在这一切之前,我们还要提醒自己,任何一个微服务使用第三方代码的旧版本、更脆弱的版本,都会产生安全问题——这是黑客的天堂。允许不同的团队在孤岛般的 repo 中管理他们的依赖性,在单体世界中可能是可行的,但在微服务架构中,这是绝对不可以的。

解决方案

公司必须在重新设计他们的构建流程方面进行投资,以便为第三方和共享实用程序代码利用集中式 artifact 仓库(Artifactory 将是其中之一)。团队应该只允许将自己的代码存储在单独的仓库中。

最后的思考

与科技行业的大多数进步一样,微服务采用了一个熟悉的概念,并将其颠覆。它们重新思考了大规模应用的设计、构建和维护方式。它们带来了许多好处,但也带来了新的挑战。当我们把这五个主要挑战放在一起看时,我们可以看到它们都源于同一个理念。因此,每当采用像微服务这样的新技术时,底线是既需要重新思考,也需要重新调整代码的构建、部署和观察方式。微服务所带来的优势是难以拒绝的——但风险也是巨大的。

原文链接:
https://thenewstack.io/5-steps-to-ensure-your-microservices-are-running-optimally/

作者介绍

Tal Weiss,OverOps 的联合创始人及 CTO,主要负责产品以及研发策略。OverOps 是一家旨在帮助用户更有效地发现软件错误的初创公司,成立于 2012 年。

本文转载自公众号 RancherLabs(ID:RancherLabs)。

原文链接

https://mp.weixin.qq.com/s/_VOJNRsdPYOaMB0xViSxbA

阅读数:2663 发布于:2020 年 8 月 7 日 14:08

更多 架构、运维、容器 相关课程,可下载【 极客时间 】App 免费领取 >

评论

发布
暂无评论
  • Buzzfeed 部署架构的改进

    Buzzfeed工程师团队分享了他们的部署演化做法。他们构建了一个称为Rig的内部框架,在其中使用了Docker、AWS ECS和Jenkins等工具,将先前需数日的基于单体应用的部署,演化为每日可达150次部署。由此实现了迁移到面向服务的架构,并构建了一个协作度更高的工程团队。

    2017 年 6 月 22 日

  • 微服务设计模式(下)

    微服务体系结构已经成为现代应用程序开发的实际选择。虽然它解决了某些问题,但它不是一颗银弹。它也有一些缺点,在使用这种体系结构时,有许多问题必须解决。

    2019 年 11 月 20 日

  • 微服务为什么要容器化?

    微服务与容器、DevOps,它们虽然分属于不同领域,但却有着千丝万缕的关系,可以说没有容器的普及,就没有微服务架构的蓬勃发展,也就没有DevOps今天的盛行。

    2018 年 10 月 18 日

  • 09|案例:互联网典型的 SRE 组织架构是怎样的?

    SRE并不是一个单纯的岗位定义,它是由多个不同角色组合而成的团队。SRE = PE + 工具平台开发 + 稳定性平台开发

    2020 年 4 月 6 日

  • 关于可观察性的三大支柱,你应该了解这些

    当我们设计复杂系统时,生产环境系统的可观察性是必须的。关于可观察性,你首先应该了解它的三大支柱。

    2019 年 3 月 4 日

  • Segment 放弃了微服务

    除非你一直生活在石器时代,否则你可能已经知道微服务是当前流行的架构。随着这一趋势的发展,Segment在早期就将其作为一种最佳实践,在某些情况下,这对我们很有帮助,但你很快就会了解到,在其他情况下效果并不好。

    2019 年 5 月 27 日

  • 为容器和 Kubernetes 构建应用程序的 7 个最佳实践

    当容器和 Kubernetes 变得日益普及时,我们更需要做的是保持清醒,不要被欺骗,误认为应该使用它们来运行任何类型的应用程序。

    2020 年 3 月 27 日

  • Prometheus 监控实战(一):监控机制

    监控的方法是多种多样的,实际上,你可以说从单元测试到检查清单(checklist)的所有事情都是监控的某种形式。

    2019 年 11 月 21 日

  • 微服务架构:微服务究竟是灵丹还是毒药?

    究竟该不该上微服务?微服务是灵丹还是毒药?

    2020 年 1 月 24 日

  • DevOps 工程师到底要做什么事情?

    DevOps可以理解为一种开发和运维一起紧密协作的工作方式,从而可以更快更可靠地构建、测试和发布软件。

    2019 年 5 月 23 日