我有多个使用 Spring Boot 2.7 运行的服务,并且我开始使用 Spring Boot 3.0 创建新服务。我遇到了与另一个问题相同的问题,但接受的解决方案和附加的迁移指南都不起作用。 请求期间的行为如下:
Service (2.7 - TraceId-X) -> Service (3.0 - TraceId-X) => OK
Service (3.0 - TraceId-X) -> Service (3.0 - TraceId-Y) => TraceId-X lost
Service (3.0 - TraceId-X) -> Service (2.7 - TraceId-Y) => TraceId-X lost
简而言之,当请求启动或通过 3.0 版本的服务时,
traceId
会丢失(已被新的替换)。
application.yml(2.7):
spring.sleuth.propagation.type: w3c,b3
spring.sleuth.traceId128: true
spring.sleuth.supportsJoin: false
application.yml(3.0):
logging.pattern.level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"
主要依赖的版本有: 2.7版本的服务:
3.0版本服务:
我可以理解不同版本的服务之间存在集成问题,但Spring 3.0服务之间也存在集成问题。 配置中我可能缺少什么?
我不想回答自己的问题,但我找到了解决方案,也许它会对将来的某人有所帮助。
我没有意识到,在互联网上的大多数指南和教程中,他们使用
RestTemplate
在服务之间进行通信。就我而言,我正在使用 Feign
客户端。他们需要一个特定的库来 micrometer
。
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-micrometer</artifactId>
</dependency>
参考:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#micrometer-support
您还必须更新 Spring Boot 3 项目中的
propagation.type
属性。
management.tracing.propagation.type=b3
并且确保添加这些依赖项。
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
以下解决方案对我有用。
应用程序 A 使用 Spring boot 3.x 来使用使用 Spring boot 2.7/x 的应用程序 B
应用程序 A 使用 RestClient 对应用程序 B 进行 HTTP 调用。
Spring boot 3.x 不直接支持 Sleuth,但可以通过 Micrometer Brave Tracing 来实现。
Micrometer 跟踪默认支持格式为 w3c,Spring Sleuth 支持格式为 b3。
为了正确的分布式跟踪,要在两个应用程序(应用程序 A 和应用程序 B)中添加相关属性
在应用程序A中, 依赖关系
应用程序属性
管理.跟踪.采样.概率=1.0
management.tracing.propagation.type=b3
management.tracing.brave.span-joining-supported=true
确保创建一个像下面这样的bean
@Bean public RestClient restClient(RestClient.Builder builder){ return builder.build();}
RestClient.Builder 应该位于 arg 中才能使其正常工作。不喜欢 RestClient.builder().build,因为它无法在传播过程中在标头中添加跟踪属性。
在应用程序B中, 应用程序属性 文件应具有
上述配置可以很好地将跟踪 ID 从应用程序 A 传播到应用程序 B。
这不会中断,如果您有应用程序 C,它使用 2.7 来使用应用程序 B。
并且,如果应用程序 A 要调用也使用 3.x 的应用程序 D。建议更新App A属性management.tracing.propagation.type=b3,w3c(或)更新App D配置为management.tracing.propagation.type=b3