微服务系统中,一个http请求从开始到结束可能会经历很多微服务的处理,如果这个请求出错,很难从众多日志中找到该请求的前后调用链,问题排查起来比较困难。
通过使用Sleuth,为每次请求都生成一个全局唯一的Trace ID,可以很清楚的追踪一个请求的调用链路。
Sleuth 有两个任务:
- 使用Trace ID标记出一次调用请求中的所有日志
Trace ID 是用来标记调用链的全局唯一 ID。
- 使用Span ID梳理日志间的前后关系
Span ID 和 Parent Span ID,用来表示调用的前后顺序关系。
Span是 Sleuth 下面的一个基本工作单元,当服务请求抵达当前单元时,Sleuth 就会为这个单元分配一个独一无二的 Span ID。
Sleuth 还有一个特殊的数据结构,叫做 Annotation,被用来记录一个具体的“事件”。
Annotation名称 | 作用 |
---|---|
Client Sent(cs) | 客户端发起一个请求的时间 |
Server Received(sr) | 服务端收到用户请求并开始处理的时间 |
Server Send(ss) | 服务端将请求结果返回给客户端的时间 |
Client Received(cr) | 客户端成功接收到来自服务响应的时间 |
1. 集成 Sleuth 实现链路打标
集成了 Sleuth 之后,项目打印日志会自动生成Trace ID 和 Span ID。
- 添加依赖
<!-- Sleuth依赖项 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
- 配置文件
spring:
sleuth:
sampler:
# 采样率的概率,100%采样
probability: 1.0
# 每秒采样数字最高为100
rate: 1000
probability,它应该是一个 0 到 1 的浮点数,用来表示采样率。设置的 probability 是 1,就表示对请求进行 100% 采样。
rate,代表每秒最多可以对多少个 Request 进行采样,这有点像一个“限流”参数,如果超过这个阈值,服务请求仍然会被正常处理,但调用链信息不会被采样。
这样配置之后,服务打印出来的日志,就会有TraceID 和 SpanID。
2. 使用 Zipkin 收集并查看链路数据
Zipkin 是一个分布式的 Tracing 系统,它可以用来收集时序化的链路打标数据。通过 Zipkin 内置的 UI 界面,可以根据 Trace ID 搜索出一次调用链所经过的所有访问单元,并获取每个单元在当前服务调用中所花费的时间。
我们通过消息队列把日志发送到Zipkin。
- 搭建 Zipkin 服务器
直接下载 Jar 包,这是官方推荐的标准集成方式。
- 启动
java -jar zipkin-server-2.23.9-exec.jar --zipkin.collector.rabbitmq.addresses=localhost:5672
在命令行中设置了 zipkin.collector.rabbitmq.addresses 参数,所以 Zipkin 在启动阶段将尝试连接 RabbitMQ。
Zipkin 已经内置了 RabbitMQ 的默认连接属性,如果没有特殊指定,那么 Zipkin 会使用 guest 默认用户登录 RabbitMQ。
如果想要切换用户、指定默认监听队列或者设置连接参数,那么可以在命令行中添加以下参数进行配置。
![]()
安装RabbitMQ参考:https://python.iitter.com/other/170428.html
3. 传送链路数据到 Zipkin
完成这步配置之后,链路数据会通过消息队列发送到 Zipkin。
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
- 配置文件
spring:
zipkin:
sender:
type: rabbit
rabbitmq:
addresses: 127.0.0.1:5672
queue: zipkin
除了 RabbitMQ 以外,Zipkin 适配器还支持 ActiveMQ、Kafka 和直连的方式。
4. 查看链路追踪信息
在浏览器中打开 localhost:9411 进到 Zipkin 的首页就可以查看了
5. 使用ELK
ELK 的每个字母都来自一个技术组件,它们分别是 Elasticsearch(简称 ES)、Logstash 和 Kibana。取这三个组件各自的首字母,就组成了所谓的 ELK。
- 分别下载ELK并启动
- 服务添加依赖
提供了对接 Logstash 的日志输出组件
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
- 添加logback配置文件
<appender name="logstash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 这是Logstash的连接方式 -->
<destination>127.0.0.1:5044</destination>
<!-- 日志输出的JSON格式 -->
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "${applicationName:-}",
"trace": "%X{traceId:-}",
"span": "%X{spanId:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
这样启动之后日志就会发到ES了。
网友评论