Envoy 代理如何处理用户请求以实现追踪

深入探讨 Envoy 代理在云原生环境中如何处理用户请求,实现分布式追踪,提升应用可观测性。

版权声明
本文为 Jimmy Song 原创。转载请注明来源: https://jimmysong.io/blog/envoy-tracing/
查看本文大纲

在云原生环境中,提升对应用程序的可观测性以更好地理解用户体验是至关重要的。然而,单纯依靠指标和日志无法提供个别案例的具体细节。这时,追踪(Tracing)技术就显得尤为重要。

追踪的基本原理

追踪通过为每个用户请求附加一个关联 ID,向开发人员提供完整的用户体验上下文。这个关联 ID 就像一根线,将跨越多个服务的追踪串联起来,从而实现全面的可观测性。

下图展示了 Envoy 处理用户请求的流程。

image
用户请求与 Envoy 代理的处理流程图

追踪可以通过为每个用户请求附加一个关联 ID,向开发人员提供完整的用户体验上下文。这个关联 ID 就像一根线,将跨越多个服务的追踪串联起来。

尽管所有请求都会经过 Envoy 代理,但 Envoy 无法独立提供完整的追踪信息。它只看到应用程序作为网络的一部分,无法洞察内部处理。这使得 Envoy 无法区分入站请求和出站请求是否来自同一个用户,因此无法自动转发追踪上下文。

服务网格中的请求上下文

Envoy 可以在 Istio 服务网格中作为 Sidecar 或 Waypoint 代理,下图展示了 Envoy 在服务网格中如何处理请求上下文的。

1. 用户请求的开始

追踪涉及通过多个服务跟踪路径,以理解用户体验的完整上下文。追踪从一个用户请求开始,该请求被分配了一个关联 ID。

image
用户请求的开始

2. 请求通过 Envoy 代理

Envoy 位于应用程序旁边,所有进入的请求都会经过 Envoy。

image
用户请求的开始

3. Envoy 附加额外的 Headers

Envoy 可以在请求中附加额外的 Headers,以收集关于应用程序内部发生情况的信息。

image
Envoy 附加额外的 Headers

4. 应用程序处理请求并调用后端服务

应用程序在处理请求的过程中,可能需要联系其他系统来处理该请求。比如外部的认证和授权服务。

image
应用程序处理请求并调用后端服务

5. 应用程序需要复制关联 ID

应用程序知道出站请求是代表哪个入站请求发起的(例如 Trace ID 为 1234 的请求)。但是,Envoy 并不知道这一点。因此,应用程序需要将关联 ID 等上下文从入站请求复制到出站请求中。

image
应用程序需要复制关联 ID

6. 多个请求的并发处理

在实际场景中,应用程序同时处理多个用户请求,这导致了并发性。由于 Envoy 只能看到网络层面的请求和响应,无法区分这些请求之间的因果关系。

image
多个请求的并发处理

7. Envoy 的局限性

因为 Envoy 无法看到应用程序内部的处理逻辑,它只能看到一系列的网络请求和响应,无法知道哪些出站请求是由哪些入站请求触发的。

image
Envoy 的局限性

需要应用程序的参与

由于 Envoy 无法自动转发追踪上下文,应用程序本身需要负责将入站请求的 Headers 复制到出站请求中,以保持追踪信息的完整性。

应用程序复制 Headers

应用程序在处理入站请求时,需要将必要的 Headers(如关联 ID、用户身份等)复制到任何出站请求中。

image
应用程序复制 Headers

响应返回给用户

应用程序完成对用户请求的处理后,将响应返回给用户。

image
响应返回给用户

解决方案与推荐

为了确保追踪信息的完整性,应用程序需要主动复制和传递追踪相关的 Headers。这可以通过集成如 Apache SkyWalking 的工具来实现,SkyWalking 不仅支持分布式追踪,还包括性能监控、日志分析等功能。利用 SkyWalking 的库和代理,可以简化 Headers 的复制和追踪信息的传递。

关于如何在 Istio 中使用 SkyWalking 实现分布式追踪详见这篇博客

总结

  • 追踪的重要性:追踪为开发人员提供了用户请求的完整上下文,帮助更好地理解和改进用户体验。
  • Envoy 的局限性:Envoy 只能看到网络层面的请求和响应,无法跟踪请求的因果关系,因此无法自动转发追踪上下文。
  • 应用程序的角色:应用程序需要主动复制和传递追踪相关的 Headers,以确保追踪信息的完整性。
  • 推荐的工具:使用 SkyWalking 等追踪工具的库,可以简化在应用程序中实现 Headers 复制的过程。

参考

最后更新于 2024/09/27