微服务调用中TraceId是如何传递的?

简介: 由于网络原因,我暂时无法解析提供的网页链接。请检查链接是否有效,或稍后再试。如果您有其他问题或需要帮助,请随时告诉我。

背景

最近脉脉上比较多脉友关注的技术面试题目“微服务调用中TraceId是怎么传递的?”,有比较多的同学关注并发表了自己的见解。

image.png

TraceId是可以串连一个完整请求的唯一记录id,通过traceId可以关联到整个请求过程中涉及到的上下游通信,包括网关,rpc通信,mq通信链路。traceId总体来说会在两种场景中传递。

TraceId还是很有用的,日常开发中,我们经常通过TraceId来捞服务日志,通过TraceId查看整个请求链路耗时,异常等信息,可以说是日常开发运维中不可缺少的排障手段。

image.png

总体来说,traceId会在两种场景中传递。 image.png

**

应用内传递TraceId

**

第一种是应用内部传递,这种传递我们一般通过ThreadLocal,InheritableThreadLocal传递,这个不是本文重点,不做具体分析。

跨进程的应用间传递TraceId

第二种是跨进程的应用间传递,这种会涉及到远程rpc通信,mq通信,数据库通信等,这种一般我们需要借助中间件的扩展机制来实现传递TraceId,这个也是本文分析的重点。

OpenFeign调用传递

64145B9A-9034-4593-8F40-1DF54C58D376.png

由于openfeign底层使用http协议作为通信协议,而http的请求报文包含header和body,body一般是用于业务数据交换,而header一般用于交换非业务数据,TraceId就非常适合在header中传输,那么openfeign的header我们需要怎么增加自定义属性呢?这个时候就需要看openfeign的扩展机制了。上文(面试官:OpenFeign十大可扩展组件你知道哪些?)分析openfeign扩展点的文章就提到了feign.RequestInterceptor, 这个机制能够实现修改请求对象的目的,那么可以利用他来传输traceId。下面是一个写traceId拦截器的例子。

EE08C55C-4877-4571-AC18-E5D1C4A5EBC1.png

通过实现feign.RequestInterceptor接口就可以在发起feign请求前注入traceId并透传给下游服务,是不是超简单。

image.png

Dubbo调用传递TraceId

dubbo不像openfeign, dubbo支持多种通信协议,下图是dubbo官方的通信协议图谱,默认有自己的dubbo通信协议,dubbo协议默认使用netty作为通信框架

CFC5A8E2-3521-4EEC-95D0-47E766EE94CC.png

Dubbo协议虽然是Dubbo框架自定义的协议,但是dubbo协议也有请求头和请求体,Dubbo协议可以使用Attachments对象传输非业务数据,相信使用过dubbo的同学应该会知道这个。通过RpcContext.getContext()拿到当前执行请求的上下文信息,再通过setAttachment方法进行传递。下面是结合Dubbo的过滤器机制统一实现rpc传递。

843E3095-D350-48A3-9961-F79893B7651A.png

RocketMq通过消息传递traceId

要知道rocketmq怎么传递traceId,同样需要看下他的消息体,通过org.apache.rocketmq.common.message.Message可知properties属性最适合传递。

6CE3518A-0A91-46B5-AC8E-15FE95EDA8C4.png

生产者最终将在发送消息前会将properties传入requestHeader进行传输,我们也可以写一个拦截器,拦截所有的消息生产者,在properties里加入TraceId。

462BA52C-C457-4568-BA00-4E52E8E637FA.png

总结

本文分析了TraceId传输的场景以及在应用间传输的部分实现,通过应用间的传输实践,我们知道了通信框架一般都是可以通过请求报文的请求头来传输TraceId的,而且会使用拦截器来实现通用的传输TraceId。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
设计模式 监控 安全
如何定位当生产环境CPU飙升的时候的问题
在当今的信息化时代,计算机系统在各行各业都发挥着重要的作用。然而,当生产环境中的CPU飙升时,系统性能会受到影响,甚至导致整个系统瘫痪。这不仅会对企业造成经济损失,还会对用户体验造成严重影响。因此,如何定位并解决生产环境中CPU飙升的问题,已成为众多企业和开发人员亟待解决的问题之一。本文旨在探讨如何定位生产环境中CPU飙升的问题,并提供相应的解决方案。通过了解CPU飙升的原因、定位方法以及解决方案,企业和开发人员可以更好地应对生产环境中出现的CPU飙升问题,提高系统性能和用户体验。
663 1
|
消息中间件 缓存 NoSQL
热点账户高并发记账方案
热点账户高并发记账方案
2141 0
热点账户高并发记账方案
|
Java Spring
Springboot starter开发之traceId请求日志链路追踪
能标识一次请求的完整流程,包括日志打印、响应标识等,以便于出现问题可以快速定位并解决问题。
2598 0
Springboot starter开发之traceId请求日志链路追踪
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
870 2
|
监控 Java API
基于trace_id实现SpringCloudGateway网关的链路追踪
通过上述步骤,我们可以在 Spring Cloud Gateway 中基于 `trace_id` 实现链路追踪。引入必要的依赖,配置 Zipkin,自动生成和传递 `trace_id`,并通过测试验证追踪功能。这种机制能够有效地帮助我们监控分布式系统中的请求流,快速定位问题和瓶颈。
1096 13
|
存储 Prometheus Cloud Native
分布式系统架构6:链路追踪
本文深入探讨了分布式系统中的链路追踪理论,涵盖追踪与跨度的概念、追踪系统的模块划分及数据收集的三种方式。链路追踪旨在解决复杂分布式系统中请求流转路径不清晰的问题,帮助快速定位故障和性能瓶颈。文中介绍了基于日志、服务探针和边车代理的数据收集方法,并简述了OpenTracing、OpenCensus和OpenTelemetry等链路追踪协议的发展历程及其特点。通过理解这些概念,可以更好地掌握开源链路追踪框架的使用。
1550 41
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
273 3
|
存储 监控 Java
一文看懂分布式链路监控系统
本文通过阿里的Eagleeye(鹰眼)和开源的Skywalking,从数据模型、数据埋点以及数据存储三个方面介绍分布式链路监控系统的实现细节,其中将重点介绍Skywalking字节码增强的实现方案。
92302 6
|
Dubbo Java 应用服务中间件
Dubbo日志链路追踪TraceId选型
开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助全链路追踪ID把上下文串联起来,本文主要分享基于Spring Boot + Dubbo框架下日志链路追踪ID的实现方案选型思路
5364 0
Dubbo日志链路追踪TraceId选型
|
存储 自然语言处理 Dubbo
几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
新项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,那这个 traceId 如何跨系统传递呢?
1505 0