概述
将一次请求分布式调用,使用GPS定位串起来,记录每个调用的耗时、性能等日志,并通过可视化工具展示。
AlibabaCloud全家桶没有对应的链路追踪系统,使用Sleuth和Zipking(内部使用的鹰眼)
Sleuth生成的一个ID,叫Trace ID,用来标识一条请求链路路,一条请求链路路中包含一个Trace ID,多个Span ID
zipkin
大规模分布式系统的APM工具,和Sleuth结合可以提供可视化的Web界面分析调用链路耗时情况。
同类产品
- 鹰眼(EagleEye)
- CAT
- twitter开源zipkin,结合sleuth
- Pinpoint,运用JavaAgent字节码增强技术
- StackDriver Trace (Google)
组成
- Collector
- Storage
- Restful Api
- Web UI
Zipkin+Sleuth
- Sleuth收集跟踪信息通过http请求发送到Zipkin server
- zipkin server存储跟踪信息、提供api
- UI调用api进行展示,默认存储到内存,可以修改成mysql或es
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin地址
discovery-client-enabled: false #不不⽤用开启服务发现
sleuth:
sampler:
probability: 1.0 #采样百分⽐比
默认为0.1,即10%,这里配置1,是记录全部sleuth信息,是为了收集到更多的数据(仅供测试用)。
在分布式系统中,过于频繁的采样会影响系统性能所以这里配置需要采用一个合适的值。
原理
RestTemplate每次发起请求时,拦截器会在http请求header中放入如下信息:
x-b3-traceid = 11111111111 #表示当前调用链的trace id
x-b3-spanid = 1111222222 #表示span id
x-b3-parentspanid = 11111333333 #调用链中前一个服务的span id
x-b3-sampled = 1 #表示是否取样,1表示要将调用信息发送到zipkin
当服务访问完毕后,sleuth会将之前添加到MDC的数据再清理掉
- 首先sleuth创建TraceFilter,对所有的网络请求进行拦截,如果请求的header中没有span信息,则创建Span对象,生成span id、trace id等,如果header中有,则直接使用header中的数据创建Span对象
- 之后将span id、trace id设置到sl4j的MDC中。当使用RestTemplate发送请求RestTemplateInterceptorInjector拦截器对请求拦截,将新生成的span id、trace id等信息设置到请求的header中。这样服务端收到请求后就可以从header中解析出Span信息