一、请求跟踪基本原理
现在的很多应用都是由很多系统系统在支持,这些系统还会部署很多个实例,用户的一个请求可能在多个系统的部署实例之间流转。为了跟踪一个请求的完整处理过程,我们可以给请求分配一个唯一的 ID traceID
,当请求调用到另一个系统时,我们传递这个 traceID
。在输出日志时,把这个 traceID
也输出到日志里,这样,根据日志文件,提取出现这个 traceID
的日志就可以分析这个请求的完整调用过程,甚至进行性能分析。
当然,在一个系统内部,我们不希望每次调用一个方法时都要传递这个 traceID
,因此在 Java 里,一般把这个 traceID
放到某种形式的 ThreadLocal
变量里。
日志类库在输出日志时,就从这个 ThreadLocal
变量里取出 traceID
,跟要输出的日志信息一起写入日志文件。
这样对于应用的开发者来说,基本不需要关注这个 traceID
。
二、远程调用间传递跟踪信息
如何使用的是自定义的 RPC 实现,这些 RPC 一般都预留了扩展机制来传递一些自定义的信息,我们可以把 traceID
作为自定义信息进行传递。
对于 Hessian 这种基于 HTTP 协议的 RPC 方法,它把序列化后的调用信息作为 POST
的请求体。如果我们不想去修改 Hessian 的调用机制,可以把 traceID
放到 HTTP 的请求头里。
在客户端只需要提供封装好的 RPC 调用代理。
在服务端通过 Filter
得到 traceID
放入 ThreadLocal
变量。