随着分布式服务架构的流行,特别是微服务等设计理念在系统中的应用,业务的调用链越来越复杂。随着业务的发展,系统规模也会变得越来越大,各微服务间的调用关系也变得越来越复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或者错误都有可能引起请求最后的失败。同时,缺乏一个自上而下全局的调用id,对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来,这样我们就需要一个服务链路追踪系统。
分布式服务跟踪是整个分布式系统中跟踪一个用户请求的过程(包括数据采集、数据传输、数据存储、数据分析、数据可视化),捕获此类跟踪让我们构建用户交互背后的整个调用链的视图,这是调试和监控微服务的关键工具。Spring Cloud Sleuth是Spring Cloud为分布式服务跟踪提供的解决方案,有了它,我们可以:
1.提供链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。
2.可视化各个阶段耗时,进行性能分析
3.各个调用环节的可用性、梳理服务依赖关系以及优化
4.数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。
Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语。
将Span和Trace在一个系统中使用Zipkin注解的过程图形化
在spring Cloud为F版本的时候,已经不需要自己构建Zipkin Server了,只需要下载jar即可,下载地址:
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
下载完成jar 包之后,需要运行jar:java -jar zipkin-server-2.10.1-exec.jar
修改eureka-user,添加maven依赖
org.springframework.cloud
spring-cloud-starter-zipkin
在application.yml里添加:
spring:
zipkin:
base-url: http://localhost:9411
zipkin:
sender:
type: web #如果项目里引入了RabbitMQ依赖仍希望使用http方式发送数据,增加配置
sleuth:
sampler:
probability: 1 # 设置抽样采集为100%,默认为0.1,即10%
日志采集的越多,追踪越全面,但是消耗也越大;反之日志追踪不够多也就失去了意义。到底追踪多少日志才是平衡点?Spring Cloud Sleuth把这个问题交给了使用者,通过配置spring.sleuth.sampler.probability=0.1这个参数来决定了日志记录发送给采集器的概率,0-1交给使用者自己配置。开发阶段和运行初期,一般配置成1全量收集日志,到了上线后可以慢慢降低这一概率。
由于本项目已经整合了spring cloud config,所以上面的application.yml的zipkin配置,是在git上面的base-config-dev.yml里面。
修改eureka-points服务,添加和上面一样的配置。添加Controller,并且调用eureka-user的服务。
@Autowired
private UserMessageFeign UserMessage;
@RequestMapping("/getUserPoints")
public String getUserPoints(){
return "feign:"+UserMessage.getUserMessage();
}
eureka-user服务:
@Value("${server.port}")
private String port;
@Value("${base-name}")
private String foo;
@Autowired
private UserPointsFeign userPoints;
@Autowired
private UserMessageService userMessageService;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/getUserMessage")
public String getUserMessage(){
return port+":你好阳光";
}
启动eureka-points服务和eureka-user服务,执行java -jar zipkin-server-2.10.1-exec.jar打开zipkin。
访问eureka-points服务的getUserPoints请求http://localhost:8083/getUserPoints通过eureka-points调用eureka-user的服务
访问eureka-user服务的getConfig请求http://localhost:8082/getConfig通过eureka-user调用eureka-points的服务
访问zipkin http://localhost:9411