2016-03-17 52 views
1

我正在开发几种通过HTTP相互通信的服务。 Logback被用作日志框架。跟踪服务间通话的方法

如果在一个服务中发生错误,通过查看服务日志来定义错误原因并不困难。但是,如果我们有一个下游的呼叫影响多项服务:

服务A - >服务B - >服务C - >服务d

最后服务失败,出现错误,我需要一些意味着追踪呼叫到服务A解决问题。

是否有任何针对该问题的现成解决方案?我应该添加一些额外的属性来记录每条下游呼叫唯一的消息吗?

回答

0

实际上有一种基于弹簧的服务的解决方案:request correlation spring cloud starter

过滤器为每个请求添加唯一的请求标识符作为标头(如果没有这种标头)。人们可以将该ID设置为MDC并将其添加到具有服务ID的日志条目中。

1

如果你想跟踪执行流程,你需要在每条消息上添加一些标签。你将需要:

  • 请求标识符
  • 服务标识符。

当一个流程开始时,您用请求标识符和服务标识符标记第一个调用。在处理呼叫并且需要进行其他呼叫的每个服务上,对于其他服务,您保留请求标识符并将当前服务标识符添加到您收到的请求中的一个。

基本上,请求标识符允许您标识呼叫流,而服务标识符允许您查看流中的跳数。

对于你的榜样,服务A - >服务B - >服务C - >服务d,你可能有这样的事情:

  1. 服务一开始呼叫 “123-A”;
  2. 服务B收到此消息并需要打电话给服务C,因此它使用“123-A”并且广告其标识符:“123-A,B”;
  3. 服务C收到此消息并需要打电话给服务D,因此它使用“123-A,B”并且广告他的标识符:“123-A,B,C”;
  4. 如果服务D中的请求发生某些事情,您知道要查找的服务日志(A,B,C)以及要查找的内容(123)。

您可以在HTTP消息或HTTP标头中包含这些内容,但是当您记录某些内容时,想法会以某种方式将它们添加到日志消息中。

当然上面的例子只是一个简单的例子,所以它可以扩展到其他情况。这个想法是把这些调用当作一种堆栈。在每一跳中,您都会将某些标识“推”到消息中。

+0

非常感谢!我找到了类似于您的建议的现成解决方案。 – Aliaxander