当前位置: 首页 > 科技观察

服务网格如何简化微服务的可观察性?_0

时间:2023-03-18 15:00:23 科技观察

翻译|陈军策展|YunZhao最近,ServiceMesh和Observability成为了微服务社区的热门话题。在这里,我们将详细讨论服务网格和可观察性技术栈如何帮助我们克服使用微服务过程中的各种挑战。常见的微服务挑战通常,微服务会给应用启动的运维工作引入大量的开销。在调试并确保其持续运行的过程中,我们经常面临以下挑战:分布式系统中的错误很难调试在单体时代,我们只需要查看日志和堆栈跟踪来确定错误的根本原因。在微服务中,由于其分布式的特性,当出现错误时,挖掘微服务的日志可能仍然无法直接了解到确切的问题所在。相反,它只能简要报告从相关微服务接收到的请求和/或响应中的错误。换句话说,我们必须跟踪整个网络以确定哪个微服务是问题的根本原因。此外,这是一个非常耗时的过程。难以识别系统中的瓶颈在单体应用程序中,识别性能瓶颈就像分析应用程序本身一样简单。通过基础分析,我们往往可以准确定位到代码库中哪些方法最耗时,从而使后续的优化工作集中在这一小段代码上。但是,定位拖慢整个系统速度的微服务可能具有挑战性。虽然在单独的测试中,每个微服务似乎都表现得很好。但是在实际的应用场景中,每个服务所面临的负载可能会有很大的差异。毕竟其中一些可能会成为其他微服务所依赖的核心微服务。在隔离的测试环境中很难重现这种情况。微服务的主要优点是我们可以敏捷地发布新的软件和服务。但是,在实际场景中,我们经常会因为以下事件导致新发布的微服务对其下游功能产生多重影响:在上游依赖的基础上,发布新的依赖微服务删除发布微服务,破坏现有API的兼容性adeprecatedAPI在旧系统中仍然存在依赖当微服务之间没有清晰的“依赖树”时,上述情况的发生将变得不可避免。依赖树可以更容易地通知相应的团队各个组件之间的关系,以指定更好的发布计划。微服务的可观察性其实上面提到的各种问题都可以通过可观察性来解决。这里的可观察性是根据系统生成的指标和日志来捕获系统当前状态的做法。作为一个系统,它可以帮助我们监控应用程序的健康状况,生成故障警报,并在出现问题时捕获足够的信息,以便后续进行问题调试。图1:带有开源示例的可观察性堆栈组件如上所示,可观察性堆栈通常由以下组件组成:指标/日志源-用于生成数据的代理或库指标/日志移动器-将数据传输到存储引擎的代理,通常嵌入在指标源中收集器/存储-负责存储生成数据的有状态服务仪表板-通过综合图表满足数据解释和汇总警报管理器-负责触发通知的服务强大的开源工具。ServiceMeshes简介从原理上讲,可观察性主要是通过捕捉网络中的遥测数据(telemetry),利用良好的网络洞察力,帮助开发者解决上述各种问题。当然,生成遥测数据的任务是一个极其繁琐且容易出错的过程。开发人员不仅要确保功能的安全实现,还要使数据通信能够抵抗可能出现的故障。为此,我们可以通过Istio、Linkerd或ConsulConnect等服务网格将微服务网络的复杂性解耦到底层平台。接下来,我们就以Istio为例,来了解下服务网格的工作原理。图2:典型的服务网格架构图片来源-https://istio.io/latest/docs/ops/deployment/architecture如上图所示,服务网格有两个主要组成部分:数据平面(dataplane)和控制平面。其中,数据平面负责管理微服务产生的所有网络流量。为此,服务网格会在每个微服务旁边注入一个边车代理。我们可以将Envoy用作sidecar,负责透明地拦截流经该服务的所有流量。控制平面只负责配置代理。也就是说,没有应用程序流量到达控制平面。如图2所示,服务网格架构帮助我们抽象出所有的复杂性,而无需编写一行代码。同时,服务网格可以利用以下三个优势帮助我们管理基于微服务的应用架构的方方面面:全面了解流量如何控制网络流量保护微服务通信全面了解流量如何流动如下图3,应用程序A正在向应用程序B发出请求。由于每个应用程序旁边的Envoy代理正在拦截请求,因此它们可以完全了解流经这两个微服务的流量。例如,Envoy代理可以检查流量以收集信息,例如发出的请求数量和每个请求的响应状态代码。具体来说,服务网格可以帮助我们回答以下问题:哪两个服务正在通信?每个微服务观察到的请求吞吐量是多少?每个API的错误率是多少?图3:服务网格可以帮助收集指标以控制网络流量服务网格不会袖手旁观,而是积极参与塑造所有网络流量。例如,用作sidecar的Envoy代理不仅可以识别HTTP,还可以配置为:自动尝试-遇到网络错误时重放请求请求重写的黑名单副本-当满足某些条件时,设置标头或修改请求的URL图4:服务网格可以控制网络流量此外,代理还可以根据一定的权重划分流量。例如,通过支持Canary部署等高级方法,我们可以配置代理将95%的传入流量发送到服务的稳定版本;并将其余部分重定向到金丝雀版本。简化发布管理流程。保护微服务通信使用服务网格的另一个优势是安全性。我们的Sidecar代理可以配置为使用双向TLS,以确保所有网络流量在传输过程中自动加密。其中,mTLS所需的证书管理和替换任务可以由服务网格的控制平面自动完成。服务网格还可以通过选择性地允许哪些服务相互通信来协助访问控制。相应地,我们可以有效地消除中间人攻击等安全漏洞。图5:服务网格可以保护网络流量服务网格如何帮助提高可观察性?接下来,让我们继续深入了解服务网格捕获的遥测数据可以支持哪些用例。分布式追踪为了解决上述调试微服务的挑战,我们可以使用分布式追踪来捕获请求的整个生命周期。基于此,我们只需要一张图就可以很容易地找出问题的根源。通常,大多数服务网格会自动收集网络跟踪并将它们发送到Jaeger等工具。因此,只需要在应用程序的代码中转发相关的HTTP标头即可。流量指标服务网格还可以帮助我们收集以下三个值得关注的“黄金监控信号”,以确定服务的健康状况:请求吞吐量——微服务正在服务的请求数。响应错误率-失败请求的百分比。响应延迟-微服务响应所需的时间。它往往是一个直方图,可以从中提取n个百分位数的延迟。当然,服务网格可以收集许多其他类型的指标。这些指标可用于支持各种丰富的用例。例如:启用基于请求吞吐量等高级参数的扩展启用高级流量控制功能,例如:速率限制和熔断执行自动金丝雀部署和A/B测试网络拓扑结合指标以帮助我们构建自动化网络拓扑.通过网络拓扑,我们可以一目了然地可视化整个微服务的依赖树。此外,服务网格还可以突出集群的网络健康状况,帮助我们有效识别应用中的瓶颈。总结综上所述,服务网格主要可以在以下几个方面提高微服务的可观察性:通过生成分布式跟踪数据简化调试,通过捕获微服务的黄金监控信号作为关键指标的来源网络拓扑可见,服务网格无需编写任何代码即可运行。如果您对此感兴趣,目前,您还可以使用以下指南和链接在微服务可观察性方面进一步了解服务网格。Istio、LinkerD、Kuma、Prometheus、Grafana相关的实践已经有很多,应用详情和案例可以到官网获取,是可观察性的有力工具。译者简介JulianChen,社区编辑,拥有十余年IT项目实施经验,善于把控内外部资源和风险,专注传播网络与信息安全方面的知识和经验;通过其他形式分享前沿技术和新知识;经常在线上和线下开展信息安全培训和讲座。原文链接:https://dzone.com/articles/how-a-service-mesh-simplifies-microservice-observa