Java调用链跟踪关键技术一总体介绍

8次阅读

共计 939 个字符,预计需要花费 3 分钟才能阅读完成。

一、调用链跟踪的作用

调用链跟踪包括

1. 前端到后端的调用链

2. 单个服务内部方法之间的调用链

3. 微服务之间的调用链

4. 应用服务和数据库之间的调用链

5. 应用服务和第三方服务中间的调用链,例如 Redis,MQ

调用链跟踪的作用有:

1. 定位多个微服务调用故障时哪个是故障点。

2. 性能分析

3.SQL 分析

4. 方法或服务调用合理性分析

5. 调用逻辑和数据流分析,这点对于新人特别有用,看了调用链和执行 SQL 就知道具体做了啥

二、调用链跟踪的需求

那么调用链跟踪涉及到需求有哪些,看图:

1. 前端到后端以及多个微服务之间需要将调用信息传递过去,否则调用链会断掉

2. 每个微服务要能获取到调用栈,注意调用栈和调用顺序不同,仅仅获取调用顺序是不够的,试比较:

左图只体现了调用顺序,没有体现调用栈信息,而右图既体现了调用顺序又体现了调用栈信息。

3. 微服务内部的调用信息要能传递,并且做到无侵入

4. 和数据库交互的微服务要能获取到调用的 SQL

三、Java 调用链跟踪涉及的关键技术

  1. 调用信息传递,这个信息可以通过 http 消息头传递

1) 前端只要在发送请求时设置就好。不过通常一般不跟踪前端的调用耗时,因为那样会多一次网络交互。

2) 对于微服务需要拦截 request 请求将调用链信息设置到消息头中,在 spring 中可以通过写 RestTemplate 拦截器和 Fegin 拦截器来实现。

  1. 微服务中调用栈的获取,使用 spring 的开发者会很自然想到用 AOP 来拦截,但是 spring AOP 拦截同一个类的多个方法之间的调用很不方便,有侵入性,因此并不适合。最好的方式是使用 javaagent,通过代码注入的方式来拦截。
  2. 微服务内部调用信息传递需要通过线程范围的变量来传递,Java 中的 ThreadLocal 已经提供了这个能力。
  3. 调用栈的跟踪 Java 也提供了这个能力,可以获得当前方法的调用栈信息。
  4. SQL 监控,对于使用 mybatis 的会想到用 mybatis 的拦截器,这种方式有的情况下会不工作(原因未明),并且依赖 mybatis,因此应用更底层的方法去拦截 SQL,一种方式是自行实现 JDBC 代理类,另一种方式是使用第三方开源的 SQL 监控工具。

end.


加入《Java 栈实战营》知识星球,参与讨论,更多实战代码分享,不就是几斤苹果,几个荣耀道具的事吗!

正文完
 0