一直没弄明白sleuth的tracerContext是如何创建和传递的,闲来无事研究了一下。由于对sleuth的源码不熟悉,准备通过debug brave.Tracer的nextId()方法,查看方法调用栈来找来龙去脉。
首先创建两个service A和B,记作srvA、srvB,在srvA中添加testA controller,sevB中添加testB controller,testA中通过Feign调用testB。
先看当用户通过浏览器调用srvA的时候,srvA是作为server的。
configuration:
TraceWebServletAutoConfiguration==>TracingFilter
TraceHttpAutoConfiguration==>HttpTracing
TraceAutoConfiguration==>Tracing
SleuthLogAutoConfiguration.Slf4jConfiguration==>CurrentTraceContext
配置中,TracingFilter在实例化时需要一个HttpTracing:
HttpTracing Builder模式构造时接收一个Tracing:
Tracing实例化:
下面看TracingFilter的doFilter:
在SleuthLogAutoConfiguration中如果有slfj的包,则注入CurrentTraceContext:
Slf4jCurrentTraceContext中,delegate就是CurrentTraceContext.Default.inheritable():
Slf4jCurrentTraceContext的delegate使用的就是一个InheritableThreadLocal,InheritableThreadLocal在创建子线程的时候,会将父线程的inheritableThreadLocals继承下来。这样就实现了TraceContext在父子线程中的传递。
看一下CurrentTraceContext的maybeScope:
TracingFilter中HttpServerHandler解析Request:请输入代码
2.srvA请求到servB时作为Client。
TraceLoadBalancerFeignClient-->LoadBalancerFeignClient-->FeignLoadBalancer-->LazyTracingFeignClient-->Client
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
原文链接:https://segmentfault.com/a/1190000018115247