一个由微服务构成的应用系统通过服务来划分问题域,通过REST请求服务API来连接服务来完成完整业务。对于入口的一个调用可能需要有多个后台服务协同完成,链路上任何一个调用超时或出错都可能造成前端请求的失败。服务的调用链也会越来越长,并形成一个树形的调用链。随着服务的增多,对调用链的分析也会越来越复杂。
针对服务化应用全链路追踪的问题,Google发表了Dapper论文,介绍了他们如何进行服务追踪分析。其基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系。利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。
对应Dpper的开源实现是Zipkin,支持多种语言包括JavaScript,Python,Java, Scala, Ruby, C#, Go等。其中Java由多种不同的库来支持。
Spring Cloud Sleuth是对Zipkin的一个封装,对于Span、Trace等信息的生成、接入HTTP Request,以及向Zipkin Server发送采集信息等全部自动完成。
1. Server 端
1)pom.xml中引入
io.zipkin.java
zipkin-server
io.zipkin.java
zipkin-autoconfigure-ui
io.zipkin.java
zipkin-autoconfigure-storage-mysql
2)主类开启监控:@EnableEurekaClient,@EnableZipkinServer
3)配置 eureka.instance.client.serviceUrl.defaultZone
4)创建zipkin的db实例,配置用户权限,创建相关表 zipkin_annotations,zipkin_dependencies,zipkin_spans
5)配置zipkin存储的db内容:
zipkin:
ui:
environment: zipkin
storage:
type: mysql
mysql:
host: localhost
port: 3306
db: zipkin
username: username
password: password
2. Client 端
1)pom.xml中引入
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-starter-zipkin
2)配置连接的server端地址及采样率
spring:
zipkin:
enabled: true
base-url: http://localhost:9411
sleuth:
sampler:
#采样率, 默认0.1
percentage: 1.0
注意:
1. db实例,表,需手工创建,否则zipkin-server虽然不会报错,但无法采集数据
2. 每1次request生成一个traceId,中间有N个service层,则生成N个spanId,写入spans,annotaions