微服务调用中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版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6月前
|
Dubbo Java 应用服务中间件
微服务框架(十一)Dubbo调用拦截及参数校检扩展
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   使用Dubbo框架时,面对自身的业务场景,需根据定制的需求编写SPI拓展实现,再根据配置来加载拓展点。
|
18天前
|
监控 Java 微服务
微服务调用失败时常用处理手段
【10月更文挑战第27天】在微服务架构中,服务调用面临诸多不确定性,如服务提供者的硬件故障、网络问题等。因此,需要采取超时、重试、双发和熔断等策略来确保服务的稳定性和可靠性。超时机制避免长时间等待,重试机制应对偶发错误,双发机制提高成功率,熔断机制防止故障扩散。这些策略共同作用,保障了系统的高可用性。
|
3月前
|
NoSQL 关系型数据库 MySQL
你了解微服务的超时传递吗?
你了解微服务的超时传递吗?
|
6月前
|
数据采集 存储 监控
如何监控微服务调用
【2月更文挑战第2天】搭建一个服务监控系统,涉及数据采集、数据传输、数据处理、数据展示等多个环节。
|
6月前
|
Dubbo Java 应用服务中间件
微服务框架(十八)Dubbo领域模型、调用链及调用方式
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。本文为Dubbo领域模型、调用链及调用方式 Protocol是服务域,它是 Invoker 暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域
|
前端开发 Java 微服务
微服务之间调用的异常应该如何处理
在分布式服务的场景下,业务服务都将进行拆分,不同服务之间都会相互调用,如何做好异常处理是比较关键的,可以让业务人员在页面使用系统报错后,很清楚的看到服务报错的原因,而不是返回代码级别的异常报错,比如NullException、IllegalArgumentException、FeignExecption等异常报错,这样就会让非技术人员看到了一头雾水,从而很降低用户的体验感。
|
监控 Dubbo Cloud Native
MSE 自治服务帮你快速定位解决 Dubbo 重复订阅导致 RPC 服务注册失败问题
不正确的 Dubbo 使用姿势可能会导致 Dubbo 应用以及 ZooKeeper 注册中心出现稳定性问题,本文将探讨由于 Dubbo Reference 重复初始化,导致 ZooKeeper 出现不可用的解决方法。
MSE 自治服务帮你快速定位解决 Dubbo 重复订阅导致 RPC 服务注册失败问题
|
存储 IDE API
业务代码参数透传满天飞?(一)
业务代码参数透传满天飞?(一)
108 0
|
Android开发 Kotlin
业务代码参数透传满天飞?(二)
业务代码参数透传满天飞?(二)
142 0
|
Dubbo Java 应用服务中间件
Dubbo日志链路追踪TraceId选型
开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助全链路追踪ID把上下文串联起来,本文主要分享基于Spring Boot + Dubbo框架下日志链路追踪ID的实现方案选型思路
4750 0
Dubbo日志链路追踪TraceId选型