正文
一、产生背景
在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了。Spring Cloud Sleuth+zipkin 提供了分布式服务链路监控的解决方案。
二、Sleuth&zipkin介绍
Sleuth
1、基本术语
Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,Trace是用另一个64位ID唯一标识的,Span还有其他数据信息,比如摘要、时间戳事件、Span的ID、以及进度ID。例如在微服务中我们的一个服务。
root span:开始一个 Trace 的初始Span,root span的ID的值等于trace ID。
Trace:一系列Span组成的一个树状结构。请求一个微服务系统的API接口,这个API接口,需要调用多个微服务,调用每个微服务都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace。可以理解为就是微服务中的一条请求链,如订单服务→支付服务→积分服务就是一个trace,其中的每个服务都可以是一个span。
Annotation:用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:
cs - Client Sent -客户端发送一个请求,这个注解描述了这个Span的开始。
sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络传输的时间。
ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳减去sr时间戳,就可以得到服务器请求的时间。
cr - Client Received (客户端接收响应)-此时Span的结束,如果cr的时间戳减去cs时间戳便可以得到整个请求所消耗的时间。
2、微服务间传递跟踪信息
当一个请求被跟踪时,在传播中会添加spanid或者traceid到请求头header。比如spanId,traceId等,但是不会传输详细信息,比如操作名称,传输数据。
在请求头信息中多了 4 个属性:
x-b3-spanid:一个工作单元(rpc 调用)的唯一标识。
x-b3-parentspanid:当前工作单元的上一个工作单元,Root Span(请求链路的第一个工作单元)的值为空。
x-b3-traceid:一条请求链条(trace) 的唯一标识。
x-b3-sampled:是否被抽样被导出(采样)的标志,1 为需要被导出,0 为不需要被导出。
Zipkin
Zipkin是Twitter的一个开源项目,我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的API接口来辅助查询跟踪数据,或者通过UI组件可视化地展示服务调用链路中各个服务节点的是否异常和处理耗时。
Reporter: 应用程序中向zipkin发送跟踪数据的组件。
Transport: Reporter发送数据给zipkin收集器的传输方式,三种主要传输方式:HTTP、Kafka 和 Scribe
Storage:zipkin将跟踪数据保存至Storage中。
API 将查询存储以向UI提供数据。
zipkin的4个组件:
Collector(收集器组件):主要负责收集外部系统跟踪信息,跟踪数据到达Zipkin收集器守护进程后,将对其进行验证、存储和索引,以便Zipkin收集器进行查找。
Storage(存储组件):主要负责收到的跟踪信息的存储,默认为存储在内存中,同时支持存储到Mysql、Cassandra以及ElasticSearch。
API(Query): 负责查询Storage中存储的数据,提供简单的JSON API获取数据,这个API主要提供给web UI使用。
Web UI(展示组件):提供简单的web界面,方便进行跟踪信息的查看以及查询,同时进行相关的分析。
工作流程
更多内容请看官网OpenZipkin · A distributed tracing system
三、安装
下载jar包然后启动
java -jar zipkin.jar
java -jar zipkin.jar
下载地址
链接:https://pan.baidu.com/s/1ohHc_7ybNy0V41MpBRcibw
提取码:r9tm
访问地址 your ip :9411
四、整合springboot
maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> <version>3.0.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-sleuth-zipkin --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> <version>3.0.5</version> </dependency>
application.yml配置
server: port: 8085 spring: application: name: xiaojie-sso cloud: nacos: server-addr: 127.0.0.1:8848 discovery: enabled: true zipkin: base-url: http://127.0.0.1:9411 #一定要加前面的http sender: type: web #以http形式发送 service: name: xiaojie-sso sleuth: sampler: probability: 1.0 #采集所有 rate: 10 #每秒采集数量
完整demo参考spring-boot: Springboot整合redis、消息中间件等相关代码 中zipkin模块
五、简单使用
执行查询可以查看调用的服务,然后有路径,调用服务消耗时间,报错信息等
还有支持下载具体的json数据如下面这个样子。
[{ "traceId": "2751e7f7bb8c2a11", "parentId": "2751e7f7bb8c2a11", "id": "c06891d9b13ebd18", "kind": "SERVER", "name": "get /send/{name}", "timestamp": 1651306249672816, "duration": 27835, "localEndpoint": { "serviceName": "xiaojie-message", "ipv4": "192.168.1.3" }, "remoteEndpoint": { "ipv4": "192.168.1.3", "port": 55399 }, "tags": { "http.method": "GET", "http.path": "/send/admin", "mvc.controller.class": "MessageServiceImpl", "mvc.controller.method": "send" }, "shared": true }, { "traceId": "2751e7f7bb8c2a11", "parentId": "2751e7f7bb8c2a11", "id": "c06891d9b13ebd18", "kind": "CLIENT", "name": "get", "timestamp": 1651306249618939, "duration": 90664, "localEndpoint": { "serviceName": "xiaojie-sso", "ipv4": "192.168.1.3" }, "tags": { "http.method": "GET", "http.path": "/send/admin" } }, { "traceId": "2751e7f7bb8c2a11", "id": "2751e7f7bb8c2a11", "kind": "SERVER", "name": "get /login", "timestamp": 1651306249533616, "duration": 197531, "localEndpoint": { "serviceName": "xiaojie-sso", "ipv4": "192.168.1.3" }, "remoteEndpoint": { "ipv4": "127.0.0.1", "port": 57738 }, "tags": { "http.method": "GET", "http.path": "/login", "mvc.controller.class": "LoginServiceImpl", "mvc.controller.method": "login" } }]