在分布式系统中使用过滤器对请求进行链路追踪:Span ID和Trace ID的作用和处理流程
目录
- 场景
- 介绍
- 背景知识——Span ID 和 Trace ID
- 过滤器操作
RequestStatsFilter
ResponseStatsFilter
RequestTraceGatewayFilterFactory
- 过滤器执行顺序
- 处理流程
- 总结
1. 场景
假设我们在操作一个电商应用的订单过程中,订单的创建可能涉及"用户服务" ,“库存服务”,“订单服务"以及"支付服务"这四个服务。当用户发起一个创建订单的请求,请求首先到达"用户服务”,“用户服务"通过RequestStatsFilter
在请求头部添加Span ID和Trace ID,然后发送给下一个"库存服务”,如此下去,每个服务都会以此类推,直至请求结束。在订单创建请求的生命周期内,不同的服务都能通过Span ID和Trace ID来准确追踪请求的具体路径和状态。
2. 介绍
在微服务架构中,一个请求可能需要经过多个服务。为了更好地理解和跟踪一个请求在各个服务之间的运行情况,我们通常需要使用链路追踪。这篇博客将会解释如何利用过滤器来实现这一功能,重点关注Trace ID和Span ID的作用及其处理流程。
3. 背景知识——Span ID 和 Trace ID
在链路追踪中,有两个关键的概念:Span ID和Trace ID。
-
Span ID:在分布式系统中,一个请求在一个特定的服务中的处理阶段被标记为一个"span",而Span ID是这个"span"的唯一标识符。专注于标记和追踪一个单独的请求在一个微服务中的处理情况,用来追踪一个请求在单个微服务内的子操作。
-
Trace ID:对于整个请求链路,无论它穿越了多少个服务,都会有一个唯一的Trace ID来标识,被保存在
TRACE_ID_HEADER
中。它保存的是Trace ID,这是一次请求在所有微服务中的唯一标识。无论这次请求经过多少个微服务处理,其Trace ID都是不变的。
4. 过滤器操作
我们利用三个过滤器来进行链路追踪:RequestStatsFilter
,ResponseStatsFilter
,RequestTraceGatewayFilterFactory
。
RequestStatsFilter
:在请求处理链的开始处添加链路追踪信息,即生成新的追踪ID和Span ID,加入请求头信息。ResponseStatsFilter
:在请求处理链的结束处,清理并记录链路追踪信息。将从请求头提取出的TraceId
添加到响应头后,清除掉对应的链路信息。RequestTraceGatewayFilterFactory
:捕踪并记录请求相关信息以及链路追踪信息,在对应处理请求的服务处,从请求头提取出Span ID和其他请求相关的信息并进行记录。
5. 过滤器执行顺序
当本服务接收到一个请求时,首先经过RequestStatsFilter
,生成Span ID和Trace ID,并将这两个信息添加到请求头。然后,RequestTraceGatewayFilterFactory
从请求头提取出这两个信息,并记录相关日志。上述过程结束后,请求才会进入具体的业务处理模块。在请求处理结束后,即将响应返回给调用方之前,ResponseStatsFilter
将被触发,从请求头提取TraceId
添加到响应头,然后清除这些信息。
6. 处理流程
处理开始,RequestStatsFilter
会为请求生成新的追踪ID和Span ID,添加到请求头中。然后,在RequestTraceGatewayFilterFactory
中,会从请求头部中提取出这些信息,并且将这些信息通过请求的Metadata继续传递给下一个过滤器。最后,当响应要发回给客户端时,ResponseStatsFilter
将Span ID信息写入响应头部,并将其从服务器中删除。
7. 总结
利用过滤器进行链路追踪是跟踪微服务中请求处理状态的一种高效方式。正确使用与理解Span ID和Trace ID对于分析和优化微服务性能至关重要。