我正在尝试将traceId从一个服务传播到由休息模板/Web客户端调用的另一个服务
我希望 TraceId 会相同,但实际上会生成新的。
服务1:
@Bean
public WebClient webClient() {
return WebClient.create("http://localhost:8080");
}
简单地拨打服务2:
webClient.get().retrieve().bodyToMono(String.class).block();
我在这两个服务中都有这些依赖项:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
我使用休息模板得到了相同的行为。 根据文档,应该传播
traceparent
标头,但事实并非如此。
我正在使用 Spring Boot 3.0.5
当您从头开始构建 WebClient 时,不会发生自动配置。您应该更改 WebClient bean 方法并注入 WebClient.Builder。
@Bean
public WebClient webClient(WebClient.Builder builder) {
return builder.baseUrl("....").build();
}
尽管例外的解决方案有效,但如果我们也使用发现服务器,我发现会有例外。在这种情况下,您可以执行以下操作:
@Bean
@LoadBalanced
public WebClient.Builder webClient(ObservationRegistry observationRegistry){
return WebClient.builder().observationRegistry(observationRegistry);
}
然后您可以自动装配构建器而不是 webClient 并在使用时构建它:
@Autowire
WebClient.Builder webClientBuilder;
//usage
String result = webClientBuilder
.build()
.get()
.uri("http://Discovered-service/api/child")
.retrieve()
.bodyToMono(String.class)
.block();