我正在研究多个微服务架构,其中入口点来自 Kafka。 例如,假设我们有三个微服务micro1、micro2和micro3,micro1中的请求来自kafka消息队列,并通过Rest客户端进一步与micro2和micro3通信。
micro1 收到的消息包含 requestId ,我需要将其放在 spring sleuth 中的 TraceId 位置,并且应该在所有微服务中传播。
我已经通过 MDC 尝试过此操作,但在这种情况下,traceId 不会传播到其他微服务。
是否有其他方法可以在 sleuth 中实现自定义 TraceId 而不是自动生成?
谢谢!!
最佳答案
我认为这不是一个好主意。保留生成的跟踪 ID 并创建另一个生成的字段,该字段将作为行李传播。
如果您确实需要更改 ID 的生成方式,那么您必须更改此 bean
@Bean
@ConditionalOnMissingBean
Propagation.Factory sleuthPropagation(SleuthProperties sleuthProperties) {
if (sleuthProperties.getBaggageKeys().isEmpty() && sleuthProperties.getPropagationKeys().isEmpty()) {
return B3Propagation.FACTORY;
}
ExtraFieldPropagation.FactoryBuilder factoryBuilder = ExtraFieldPropagation
.newFactoryBuilder(B3Propagation.FACTORY);
if (!sleuthProperties.getBaggageKeys().isEmpty()) {
factoryBuilder = factoryBuilder
// for HTTP
.addPrefixedFields("baggage-", sleuthProperties.getBaggageKeys())
// for messaging
.addPrefixedFields("baggage_", sleuthProperties.getBaggageKeys());
}
if (!sleuthProperties.getPropagationKeys().isEmpty()) {
for (String key : sleuthProperties.getPropagationKeys()) {
factoryBuilder = factoryBuilder.addField(key);
}
}
return factoryBuilder.build();
}
关于java - 从 Kafka 消息中将 TraceId 注入(inject) spring sleuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53007132/