SpringCloud框架搭建(八)服务链路追踪

随着分布式服务架构的流行,特别是微服务等设计理念在系统中的应用,业务的调用链越来越复杂。随着业务的发展,系统规模也会变得越来越大,各微服务间的调用关系也变得越来越复杂。通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟过高或者错误都有可能引起请求最后的失败。同时,缺乏一个自上而下全局的调用id,对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来,这样我们就需要一个服务链路追踪系统。

分布式服务跟踪是整个分布式系统中跟踪一个用户请求的过程(包括数据采集、数据传输、数据存储、数据分析、数据可视化),捕获此类跟踪让我们构建用户交互背后的整个调用链的视图,这是调试和监控微服务的关键工具。Spring Cloud Sleuth是Spring Cloud为分布式服务跟踪提供的解决方案,有了它,我们可以:

1.提供链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。

2.可视化各个阶段耗时,进行性能分析

3.各个调用环节的可用性、梳理服务依赖关系以及优化

4.数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。

 

Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语。

  • Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,Trace是用另一个64位ID唯一标识的,Span还有其他数据信息,比如摘要、时间戳事件、Span的ID、以及进度ID。
  • Trace:一系列Span组成的一个树状结构。请求一个微服务系统的API接口,这个API接口,需要调用多个微服务,调用每个微服务都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace。
  • Annotation:用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:
    • cs - Client Sent -客户端发送一个请求,这个注解描述了这个Span的开始
    • sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络传输的时间。
    • ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳减去sr时间戳,就可以得到服务器请求的时间。
    • cr - Client Received (客户端接收响应)-此时Span的结束,如果cr的时间戳减去cs时间戳便可以得到整个请求所消耗的时间。

将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

 

SpringCloud框架搭建(八)服务链路追踪_第1张图片

 

SpringCloud框架搭建(八)服务链路追踪_第2张图片

 

源码下载:https://github.com/cxsummer/springcloud

你可能感兴趣的:(spring,cloud)