0

我们有一个非常分布式的系统。用户在站点上的请求可能涉及对多个服务的调用。例如,当用户登录网站时,会调用广告服务、个性化服务、相关新闻服务等,以构建登录时显示所需的数据。高级设计:对 URL 的请求被映射到 Spring MVC 控制器,并且该控制器对不同的服务进行调用(大多数使用 HttpClient)。

我们正在使用 Logstash、ElasticSearch、Kibana、Log4j/SLF4J 实施集中式日志解决方案。当网站上报告问题时,我们希望能够更改日志级别以进行调试并查看所有服务中特定请求的日志消息。我们在 Log4j MDC 中填充请求 ID,因此我们能够识别 webapp 服务器上该特定请求的日志消息。如何关联来自对其他服务的调用的消息?

流程:用户登录 --> 请求映射到 Spring MVC 控制器,该控制器通过在 Log4j MDC 中填充请求 id 来记录消息 --> http 客户端调用服务 1、服务 2、服务 3

如何将来自 service1、service2、service3 的消息与 MVC 控制器记录的消息相关联。一种解决方案是在 http 客户端调用中传递请求 ID。有很多应用程序遵循这种范式,因此到处更改代码并不是一个理想的解决方案。

更新1:

我对jvm代理了解不多,但我想知道是否可以开发自定义代理来拦截网络调用并添加参数。接收方的客户代理将检测到参数并将其添加到 ThreadLocal 变量中。Dynatrace PurePath 技术以某种方式关联跨 JVM 的调用——它们需要注入他们的 jvm 代理,所以我猜他们正在拦截代理中的调用。看看这个视频

4

1 回答 1

2

您将不得不硬着头皮将请求 ID 添加到 HTTP 客户端调用中。如果您不想污染您的 API,请将其添加为自定义 HTTP 标头,然后在服务端使用某种 HTTP 拦截器提取它(取决于您使用的 Web 服务堆栈),然后重新添加它到 MDC。

于 2013-04-03T15:19:36.020 回答