【问题标题】:Spring cloud sleuth with Webservicetemplate带有 Webservicetemplate 的 Spring Cloud sleuth
【发布时间】:2017-06-26 15:16:42
【问题描述】:

Spring cloud sleuth 支持 WebserviceTemplate 吗?我的意思是 - 我有一个服务调用 2 个服务 - 一个使用 RestTemplate,另一个使用 Webservicetemplate。 Rest 调用显示在 Zipkin 中,而使用 Webservicetemplate 的 Soap 调用则没有。我必须将@NewSpan 添加到我所有的肥皂电话中吗?不是像 Resttemplate 那样自动完成吗?

【问题讨论】:

    标签: spring-cloud zipkin spring-cloud-sleuth


    【解决方案1】:

    没有 - 我们没有在 Webservicetemplate 周围添加任何工具。您必须添加一个类似于我们为 RestTemplate 添加的拦截器。您必须将所有跟踪标头传递给请求,以便对方可以正确解析它。

    【讨论】:

    • 我使用 Webservicetemplate 对 Web 服务进行了两次调用。我注释了使用@NewSpan 进行网络服务调用的两种方法。我看到只有一个服务调用被发送到 zipkin。有关跟踪信息,请参见下文。在第二个 Web 服务调用中,父跨度为空。我犯错了吗?第一次调用的跟踪 - $[Trace: ca919fe522d78d9f, Span: 2d1c34fa53ac7fa6, Parent: ca919fe522d78d9f, exportable:true], 对于第二次调用 - [Trace: ca919fe522d78d9f, Span: ca919fe522d78d9f, Parent: null, exportable:true]
    • 没有样品我帮不了你。我不知道你在做什么
    • 我在同一个班级中有 2 个 @NewSpan 注释。我想这就是问题所在。我看到你的其他帖子之一,你说它不起作用。我将其中一个 NewSpan 移到另一个班级,它开始工作
    • 很高兴知道。感谢您写这篇文章!
    【解决方案2】:

    这里是一个如何使用带有Webservicetemplate的spring cloud sleuth的例子,

    如果服务 A 向服务 B 发送请求,

    首先,您将通过以下代码在已发送请求的标头中发送跟踪 id

    @Service
    public class WebServiceMessageCallbackImpl implements WebServiceMessageCallback {
    
    @Autowired
    private Tracer tracer;
    
    public void doWithMessage(WebServiceMessage webServiceMessage) throws TransformerException {
        Span span = tracer.currentSpan();
        String traceId = span.context().traceId();
        SoapMessage soapMessage = (SoapMessage) webServiceMessage;
        SoapHeader header = soapMessage.getSoapHeader();
        StringSource headerSource = new StringSource("<traceId>" + traceId + "</traceId>");
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(headerSource, header.getResult());
    }
    }
    

    然后在服务 B 中,您将创建一个拦截器,然后从即将到来的请求的标头中读取跟踪 id,然后将此跟踪 id 放入 MDC 中,如下面的代码所示

    @Slf4j
    @Component
    public class HttpInterceptor2 extends OncePerRequestFilter {
    
    private final String traceId = "traceId";
    @Autowired
    private Tracer tracer;
    
    
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
    
    
        String payload = new String(request.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
    
        String traceId = traceId(payload);
        MDC.put("traceId", traceId);
    
        try {
            chain.doFilter(request, response);
        } finally {
            MDC.remove(traceId);
        }
    
    }
    
    private String traceId(String payload) {
        StringBuilder token = new StringBuilder();
    
        if (payload.contains(traceId)) {
    
            int index = payload.indexOf(traceId);
    
            while (index < payload.length() && payload.charAt(index) != '>') {
                index++;
            }
            index++;
    
            for (int i = index; ; i++) {
                if (payload.charAt(i) == '<') {
                    break;
                }
                token.append(payload.charAt(i));
            }
        }
        if (token.toString().trim().isEmpty()) {
            token.append(traceId());
        }
        return token.toString().trim();
    
    }
    
    private String traceId() {
        Span span = tracer.currentSpan();
        String traceId = span.context().traceId();
        return traceId;
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2016-11-23
      • 2021-06-07
      相关资源
      最近更新 更多