java - 从 Kafka 消息中在 spring sleuth 中注入 TraceId
问题描述
我正在研究多个微服务架构,其中入口点来自 Kafka。例如,假设我们在 micro1 中有三个微服务 micro1、micro2 和 micro3 请求来自 kafka 消息队列,并通过 Rest 客户端进一步与 micro2 和 micro3 通信。
micro1 收到的消息包含 requestId ,我需要在 Spring sleuth 中将其替换为 TraceId ,并且应该在所有微服务中传播。
我已经通过 MDC 尝试过,但在这种情况下,traceId 不会传播到其他微服务。
有没有其他方法可以在侦探中实现自定义 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 - Micronaut RxHttpClient 响应处理
- python-3.x - 使用 Python 的 Identity Server4
- javascript - Firebase 中的“0923”仅占用 923
- java - 如何从 Android 中的 API 检索日期数据?
- laravel - 中间件问题
- node.js - 如何在sails.js 中从cronjobs 设置授权令牌标头
- python - Python:引用类属性
- r - R错误:(所有(xi <= xj)&& any(xi < xj)){:需要TRUE / FALSE的缺失值
- r - 如何在闪亮中打开链接
- mysql - 关系数据库列类型性能