美文网首页
微服务链路追踪-Sleuth 的简单使用

微服务链路追踪-Sleuth 的简单使用

作者: 侧耳倾听y | 来源:发表于2022-02-14 13:33 被阅读0次

微服务系统中,一个http请求从开始到结束可能会经历很多微服务的处理,如果这个请求出错,很难从众多日志中找到该请求的前后调用链,问题排查起来比较困难。

通过使用Sleuth,为每次请求都生成一个全局唯一的Trace ID,可以很清楚的追踪一个请求的调用链路。

Sleuth 有两个任务:

  1. 使用Trace ID标记出一次调用请求中的所有日志

Trace ID 是用来标记调用链的全局唯一 ID。

  1. 使用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。

  1. 分别下载ELK并启动
  2. 服务添加依赖

提供了对接 Logstash 的日志输出组件

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.0.1</version>
</dependency>
  1. 添加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了。

相关文章

网友评论

      本文标题:微服务链路追踪-Sleuth 的简单使用

      本文链接:https://www.haomeiwen.com/subject/mciclrtx.html