服务链路跟踪:Sleuth+Zipkin

配套资料,免费下载
链接:https://pan.baidu.com/s/1la_3-HW-UvliDRJzfBcP_w
提取码:lxfx
复制这段内容后打开百度网盘手机App,操作更方便哦

第一章 Sleuth+Zipkin介绍

1.1、什么是Sleuth

我们已经接触过几种微服务的监控方式,比如:Spring Boot Actuator监控微服务,Spring Boot Admin也是监控微服务,他是把Actuator的数据用可视化的方式呈现出来,Hystrix Dashboard监控Hystrix服务,Hystrix Turbine聚合多个Hystrix服务的监控信息等,接下来我们要讨论的是微服务的“跟踪"。

对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:

  • 如何串联整个调用链路,快速定位问题?
  • 如何理清各个微服务之间的依赖关系?
  • 如何进行各个微服务接口的性能分折?
  • 如何跟踪整个业务流程的调用处理顺序?

Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计,帮我们解决像上面提到的问题。Spring Cloud Sleuth可以追踪10种类型的组件:async、Hystrix,messaging,WebSocket,rxjava,scheduling,Web(Spring MVC Controller,Servlet),WebClient(Spring RestTemplate)、Feign/OpenFegin、Zuul;

Spring Cloud Sleuth对于分布式链路的跟踪仅仅是生成一些数据,这些数据不便于人类阅读,所以我们一般把这种跟踪数据上传给Zipkin Server,由Zipkin通过UI页面统一进行数据的展示。

官方文档地址:https://docs.spring.io/spring-cloud-sleuth/docs/2.2.6.RELEASE/reference/html/

我们通过一张图来了解一个简单的微服务的调用链路:

span(跨度)

span(跨度)是一个基本工作单元,span用一个64位的id唯一标识。除id外,span还包含其他数据,例如描述、时间戳事件、键值对的注解(标签), spanId、parentId等。span被启动和停止时,记录了时间信息。初始化 span被称为"rootspan",该span的id和trace的id相等。

trace(跟踪)

trace(跟踪)是一组共享"rootspan"的span组成的树状结构,trace也用一个64位的id唯一标识,trace中的所有span都共享该trace的id。

annotation(标注)

annotation(标注)用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。

CS(Client Sent客户端发送)

客户端发起一个请求,该annotation描述了span的开始。

SR(Server Received服务器端接收)

服务器端获得请求并准备处理它。如果用SR减去CS时间戳,就能得到网络延迟。

SS(Server Sent服务器端发送)

该annotation表明完成请求处理(当响应发回客户端时)。如果用SS减去SR时间戳,就能得到服务器端处理请求所需的时间。

CR(Client Received客户端接收)

客户端发起一个请求,该annotation描述了span的结束。客户端成功接收到服务器端的响应。如果CR减去CS时间戳,就能得到从客户端发送请求到服务器响应的所需的时间。

1.2、什么是Zipkin

Zipkin是Twitter开源的分布式实时数据跟踪系统(Distributed Tracking System),基于Google Dapper的论文设计而成,Google开源了 Dapper链路追踪组件,并在2010年发表了论文《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》,这篇文章是业内实现链路追踪的标杆和理论基础,具有非常大的参考价值。

Zipkin它的主要功能是收集系统的时序数据,从而追踪微服务架构的系统延时等问题,从而达到链路调用监控跟踪作用,另外Zipkin还提供了一个非常友好的UI界面,来帮助分析追踪数据。除此之外,Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。

Zipkin官网地址:http://zipkin.io

分布式跟踪系统有一些成熟的开源产品,比如:韩国Naver的Pinpoint,Apache的HTrace,阿里的鹰眼EagleEye,京东的Hydra等,这些产品我们也把他们叫做APM(应用性能管理)工具。

下图展示了Zipkin的基础架构,它主要由4个核心组件构成:

  • Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。
  • Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
  • RESTful API:API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息或是外接系统访问以实现监控等。
  • Web UI:UI 组件,基于 API 组件实现的上层应用,通过 UI 组件用户可以方便而有直观地查询和分析跟踪信息。

Zipkin分为两端,一个是Zipkin服务端,一个是Zipkin客户端,客户端也就是微服务的应用。客户端会配置服务端的URL地址,一旦发生服务间的调用的时候,会被配置在微服务里面的Sleuth的监听器监听,并生成相应的Trace和Span信息发送给服务端。发送的方式主要有两种,一种是HTTP报文的方式,还有一种是消息总线的方式如:RabbitMQ。

最终我们可以总结出来,Sleuth和Zipkin的关系就好比Spring Boot Actuator和Spring Boot Admin之间的关系,一个用于产生数据,一个用于展示数据。

第二章 Sleuth+Zipkin入门案例

2.1、项目准备与启动

我们接下来的所有操作均是在Config最后完成的工程上进行操作,相关代码请到配套资料中寻找。

我们需要依次启动如下服务:(eureka-server7001会报错,不用管,等eureka-server7002启动后,过一会就恢复正常了)

  1. eureka-server7001
  2. eureka-server7002

打开浏览器输入指定的地址:http://localhost:7001/login,登录账号:root,登录密码:123456

2.2、搭Zipkin服务端

(1)到官网下载Zipkin Server,下载地址:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/

(2)我们下载2.12.9这个最新的版本,点击进去后,选择第一个,如果你下载失败,可以到配套资料中寻找该jar包。

(3)输入启动命令启动该jar包:java -jar zipkin-server-2.12.9-exec.jar

(4)打开浏览器输入Zipkin的web界面地址:http://localhost:9411/zipkin/

(5)要想查看更加详细的配置和命令请参考:

  • 有关zipkin的启动命令可以配置的参数可以看这里:https://github.com/apache/incubator-zipkin/tree/master/zipkin-server
  • 有关zipkin配置mysql基础建表语句可以看这里:https://github.com/apache/incubator-zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
  • 有关zipkin本身配置文件可以看这里:https://github.com/apache/incubator-zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml

2.3、搭Zipkin客户端

(1)服务提供者service-provider8001service-provider8002、服务消费者service-consumer9002service-consumer9003,全部添加以下依赖:

pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

(2)服务提供者service-provider8001service-provider8002、服务消费者service-consumer9002service-consumer9003,全部添加以下配置:

application.yaml

spring:
  zipkin:
    base-url: http://localhost:9411
    sender:
      type: web

(3)服务提供者service-provider8001service-provider8002、服务消费者service-consumer9002service-consumer9003,从左向右依次启动:

Eureka:

Console:

2.4、链路跟踪的测试

访问地址:http://localhost:9002/consumer/product/findAll

链路跟踪:http://localhost:9411/zipkin

点击查找:

点击链路:

查看依赖:

相关文章

Nacos 中的参数有很多,如:命名空间、分组名、服务名、保护...
Nacos 支持两种 HTTP 服务请求,一个是 REST Template,另一...
Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提...
Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决...
在 Nacos 的路由策略中有 3 个比较重要的内容:权重、保护阈...
前两天遇到了一个问题,Nacos 中的永久服务删除不了,折腾了...