微服务调用中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飙升问题,提高系统性能和用户体验。
494 1
Springboot整合es
Springboot整合es
395 1
|
Java Spring
Springboot starter开发之traceId请求日志链路追踪
能标识一次请求的完整流程,包括日志打印、响应标识等,以便于出现问题可以快速定位并解决问题。
2248 0
Springboot starter开发之traceId请求日志链路追踪
|
SQL XML 安全
mybatis批量更新数据三种方法效率对比【Mysql】
mybatis批量更新数据三种方法效率对比【Mysql】
4948 0
mybatis批量更新数据三种方法效率对比【Mysql】
|
11月前
|
监控 Java API
基于trace_id实现SpringCloudGateway网关的链路追踪
通过上述步骤,我们可以在 Spring Cloud Gateway 中基于 `trace_id` 实现链路追踪。引入必要的依赖,配置 Zipkin,自动生成和传递 `trace_id`,并通过测试验证追踪功能。这种机制能够有效地帮助我们监控分布式系统中的请求流,快速定位问题和瓶颈。
763 13
|
8月前
|
消息中间件 存储 设计模式
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
2716 21
RocketMQ原理—5.高可用+高并发+高性能架构
|
存储 监控 Java
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
该文章讲述了OpenFeign中的请求拦截器组件RequestInterceptor的原理及其常见使用场景。
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
|
缓存 负载均衡 Java
OpenFeign第一个可扩展组件通信Client详解
这篇文章详细分析了OpenFeign框架中的第一个可扩展组件——通信Client,包括其默认实现`feign.Client.Default`,以及如何使用`LoadBalancerFeignClient`集成负载均衡能力,并探讨了如何替换默认的`HttpURLConnection`通信组件为`OkHttpClient`或`ApacheHttpClient`。
OpenFeign第一个可扩展组件通信Client详解
|
负载均衡
OpenFeign重试组件Retryer原理
该文章主要讲解了OpenFeign中的重试组件Retryer的工作原理及其实现细节。
OpenFeign重试组件Retryer原理
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
453 0

热门文章

最新文章