springcloud提供了一个组件Sleuth,可以为分布式系统系统提供链路追踪。
为什么需要Sleuth
一个微服务系统通常有很多个服务单元,业务比较复杂,如果出现了错误或者异常,不容易定位。因为一个请求可能调用多个服务,服务之间有可能存在比较复杂的调用关系,这就导致了问题难以定位。
为了解决这个问题,就需要进行链路追踪,跟踪一个请求有哪些服务参与,这些服务参与的顺序是什么样的,做到每一个请求的步骤都清晰可见,这样出了错误就比较容易定位出多的地方了。
twitter开源了一个链路追踪组件zipkin,可以集成到springcloud Sleuth里面。
专业术语
- Span:基本工作单元:比如调用一个微服务单元就会产生一个新的Span
- Trace:由一系列的Span组成,比如请求一个微服务系统的API接口,会调用多个服务,调用每一个微服务都会产生一个新的Span,所有这个请求产生的Span组成了Trace,是一个树状结构。
- Annotation:用于记录一个事件,可以用来定义一个请求的开始和结束:
- cs——Client Sent:客户端发送一个请求,表示一个Span的开始
- sr——Server Received:服务端收到请求并准备开始处理。如果用Server Received减去Client Sent的时间戳,就可以得到网络传输的时间。
- ss——Server Sent:服务端发送响应,表明服务端已经完成了处理。用Server Sent减去server Received,得到服务端的处理时间。
- cr——Client Received:客户端接收响应,此时Span结束。用Client Received的时间戳减去Client Sent的时间戳,就得到了请求的时间戳。
具体使用
首先引入sleuth的pom依赖,引入spring-cloud-starter-sleuth
安装启动zipkin,使用docker方式,docker run -d -p 9411:9411 openzipkin/zipkin
然后访问地址localhost:9411
就可以看到展示页面
在项目中添加依赖spring-cloud-starter-zipkin
注意这一个依赖包含了sleuth和zipkin的依赖。
添加配置
zipkin:
base-url: http//localhost:9411/
sleuth:
sampler:
percentage: 1
这里暂时把抽样百分比设置为1,也就是百分之百,方便观察,可以在展示页面,选择对应的Service Name,看到一次请求访问量几个接口,分别好多长时间,很清楚。