链路监控zipkin的安装与使用
ZipKin是什么?
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。分布式跟踪系统还有其他比较成熟的实现,例如:Naver的Pinpoint、Apache的HTrace、阿里的鹰眼Tracing、京东的Hydra、新浪的Watchman,美团点评的CAT,skywalking等。
(1)下载安装
ZIPKIN官网
https://zipkin.io/
windows版下载
https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec
第一步:从官网下载zipkin,默认下载依赖是一个jar文件,网址如下:
https://github.com/openzipkin/zipkin
(2)启动
Java -jar zipkin-server-2.23.2-exec.jar
打开浏览器访问
http://localhost:9411
ZipKin链路监控应用实践
(1)添加依赖
第一步:在父工程01-sca添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
(2)启动微服务并访问
第二步:启动微服务项目进行链路监控(多次访问)
Zipkin底层会基于sleuth进行链路监控,但sleuth默认只对10%的链路请求进行监控,所以访问时多刷新几次。
(3)检测链路信息
直接点击run Query按钮
第三步:访问zipkin检测链路信息,如图所示:
(4)配置信息
zipkin配置信息,配置要写在cloud同级下
zipkin:
base-url: http://localhost:9411 #zipkin要部署到其他机器,此语句不可省略
sleuth:
sampler:
probability: 1.0 #采样率,这里的1标识100%的数据都要进行采样
全部配置信息
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务发现,同时当前服务注册到nacos
gateway:
discovery:
locator:
enabled: true #开启通过服务名(id)查找服务实例的这个特性
routes:
- id: route01 #随意指定的一个值,路由的唯一标识
##uri: http://localhost:8081/ #一个服务的地址
uri: lb://nacos-provider
predicates: ###谓词对象(定义访问规则)
- Path=/nacos/provider/echo/**
- Before=2021-06-30T00:00:00.000+08:00
- Method=GET
#- Query=name,tony
filters: ##gateway 作为一个入口处理所有请求,底层通过filter实现
- StripPrefix=1 #去掉url中path部分的第一部分内容(前面两个“/”及之间的内容)
#- AddRequestHeader=tedu, CGB
#- AddRequestParameter=page, 10
sentinel: #限流设置(gateway 元素内部写sentinel,注意缩进关系)
eager: true #启动时注册
transport:
dashboard: http://localhost:8180 #sentinel 控制台
port: 8719 #sentinel 客户端端口
zipkin:
base-url: http://localhost:9411 #zipkin要部署到其他机器,此语句不可省略
sleuth:
sampler:
probability: 1.0 #采样率,这里的1标识100%的数据都要进行采样
logging:
level:
org.springframework.cloud.gateway: info
相关属于应用说明
traceId
一次请求全局只有一个traceId。用来在海量的请求中找到同一链路的几次请求。比如servlet服务器接收到用户请求,调用微服务,然后将结果返回给用户,整条链路只有一个traceId。开始于用户请求,结束于用户收到结果。
spanId
一个链路中每次请求都会有一个spanId。例如一次rpc,一次sql都会有一个单独的spanId从属于traceId。
cs
Clent Sent 客户端发起请求的时间,比如微服务调用端开始执行远程调用之前。
cr
Client Receive 客户端收到处理完请求的时间。
ss
Server Receive 服务端处理完逻辑的时间。
sr
Server Receive 服务端收到调用端请求的时间。
例如:
sr - cs = 请求在网络上的耗时。
ss - sr = 服务端处理请求的耗时。
cr - ss = 回应在网络上的耗时。
cr - cs = 一次调用的整体耗时。
ZipKin 工作过程分析
当用户发起一次调用时,Zipkin 的客户端会在入口处为整条调用链路生成一个全局唯一的 trace id,并为这条链路中的每一次分布式调用生成一个 span id。span 与 span 之间可以有父子嵌套关系,代表分布式调用中的上下游关系。span 和 span 之间可以是兄弟关系,代表当前调用下的两次子调用。一个 trace 由一组 span 组成,可以看成是由 trace 为根节点,span 为若干个子节点的一棵树。
Zipkin 会将 trace 相关的信息在调用链路上传递,并在每个调用边界结束时异步的把当前调用的耗时信息上报给 Zipkin Server。Zipkin Server 在收到 trace 信息后,将其存储起来。随后 Zipkin 的 Web UI 会通过 API 访问的方式从存储中将 trace 信息提取出来分析并展示。