【问题标题】:spring-cloud-sleuth(boot) integration with spring-integrationspring-cloud-sleuth(boot) 与 spring-integration 的集成
【发布时间】:2017-09-13 23:29:44
【问题描述】:

当 Spring Integration(spring boot) 应用程序调用 Spring boot 应用程序对 traceID 和 spanID 进行侦探日志记录时,就会出现问题。

URL调用--> Facade(用spring集成编写,spring boot,支持sleuth)--> Spring boot微服务(支持Sleuth)

微服务一:spring集成Http调用

微服务 2:spring boot Rest 控制器

这是两个微服务的日志的详细信息。

微服务 1 调用微服务 2

微服务 1 日志:

2017-04-18 17:42:31.887[0;39m [32m INFO [CS Facade,ff711e7b275d03a7,b3f14f1a5cf6bd1d,true][0;39m [35m6280[0;39m [2m- --[0;39m [2m[

微服务 2 日志:

[2m2017-04-18 17:43:26.133[0;39m [32m INFO [-,32226de675c3a463,32226de675c3a463,false][0;39m [35m14184[0;39m [2m- --[0;39m [2m[nio-8083-exec-1][0;39m [36mc.t.cloud.resource.HelloResource

虽然两者都有相同的请求调用,但 traceID 是不同的。 当两个应用程序都是纯 spring boot 应用程序并且没有使用 http spring 集成时,它可以完美运行。

微服务 1 代码

<int-http:outbound-gateway id="getAccount"
        url="http://localhost:8083/rest/hello/micro2"
        request-channel="receiveChannel" reply-channel="publishsubscribechannel"
        http-method="GET" expected-response-type="java.lang.String">

</int-http:outbound-gateway>

微服务 2 代码

@GetMapping(value = "/micro2")
public String hello() {

    LOGGER.info("Reached micro2"+accessor.getCurrentSpan());
    return "HelloWorld";
}

【问题讨论】:

  • 欢迎来到 SO。你的问题到底是什么?
  • 更新了问题。谢谢

标签: spring spring-cloud-sleuth


【解决方案1】:

直到 Sleuth 2.1.0,spring-integration 不会自动传播 X-B3* 标头。

https://github.com/spring-cloud/spring-cloud-sleuth/issues/1333 有解决方法。

【讨论】:

    【解决方案2】:

    很抱歉,您格式化代码和编写文本的方式让我几乎无法理解问题所在。如果两个应用程序都是 Spring Boot 并且一切正常?这并不奇怪,因为 Sleuth 是一个基于引导的库。这意味着使用 Boot 和 Sleuth 注册所有必要的组件就足够了。对于非 Spring Boot 应用程序,您基本上必须自己完成所有工作。这意味着通过 HTTP 或消息传递跟踪标头。

    【讨论】:

    • 抱歉,我已经更新了问题。是的,如果没有spring集成http出站调用,一切正常。但是,通常在微服务架构中,在外观级别使用像 Spring 集成这样的 EAI 框架。当我使用通道拦截器记录通道时,我可以看到标头具有 traceID、spanID 和 URL 信息,但它没有传递给第二个微服务。我正在使用带有 spring 集成的 spring boot 来进行外观微服务。我会对http header做一些研究。
    • 在 http 和 amqp 标头中添加了 mapped-request-headers="http_requestUrl,X-B3-TraceId,X-B3-SpanId,X-Span-Name"。它运作良好。谢谢。