中小企业的链路追踪-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin

1,390 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

1.背景与选型

1.1 背景

在现在阶段,微服务已经普遍的应用在中小企业了,那么出现了一个问题,当下图D服务出现错误时,你不知道是B、C、D那个服务出现了错误。所以需要使用微服务链路追踪准确快速的定位到错误位置。 在这里插入图片描述

1.2 选型

对于中小企业来说我认为有以下要求:

  1. 开源/免费
  2. 低耦合,不侵入代码
  3. 整合与使用简单,吞吐量适中

在以上场景下,放弃代码侵入性较强的mycat和兼容性较差、依赖较多的skywalking和pinpoint。选择了更为简单易用的Spring Cloud Sleuth + Zipkin,虽然提供的功能较为简单,但是对于中小企业完全满足日常需求。

1.3 Sleuth简单原理

如果你想知道在微服务调用链中那个服务出现问题,就需要将这些服务串起来,得知上游服务和下游服务。 在这里插入图片描述 当所有调用、返回请求携带图中这些参数后,通过携带信息就能得到服务间的链路、调用服务名、返回结果、服务的耗时等信息。就能完成链路追踪的效果。

如果想了解详细原理可以仔细阅读:www.cnblogs.com/pingyeaa/p/…

2.集成Sleuth

2.1 集成

在所有微服务项目的pom.xml文件中加入以下代码即可。

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

2.2 验证

当日志出现下文样式代表成功。 在这里插入图片描述 其中图中为Sleuth提供的四个参数。

  1. flowable-resource指当前微服务的application.name
  2. trace(跟踪):为下文跨度的集合,可以理解为当前服务一个接口需要调用多个服务,用trace id来表示所有调用的集合
  3. Span(跨度):为当前服务调用其他微服务发送一次http请求的唯一id
  4. true是否将数据传到Zipkin中,由于这里连接了Zipkin所以为true

2.3 查看

在这里插入图片描述 在这里插入图片描述 通过上图可以看到,flowable-resource调用systemportal的对应关系,可以获悉错误是在哪个服务中,但是,在日志较多的情况只通过观察日志是非常麻烦和复杂的,所以接下来引入Zipkin将日志可视化输出方便日常查看。

3.集成Zipkin

3.1 搭建

访问官网:github.com/openzipkin/… 点击下文链接即可下载。 在这里插入图片描述

3.2 启动

java -jar zipkin-server-2.23.16-exec.jar

下载完毕后,执行上文命令启动jar包,访问http://localhost:9411/zipkin即可访问页面。

3.3 集成项目

在所有微服务项目pom.xml中加入下文代码。

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

在所有微服务项目application。yml中加入以下配置。

  zipkin:
    base-url: http://127.0.0.1:9411/ #zipkin地址
    discovery-client-enabled: false  #不用开启服务发现
  sleuth:
    sampler:
      rate: 10000 #每秒数据采集量,多余将丢弃
      probability: 1.0 #采样百分比:收集请求书数量的百分比。(默认为0.1,如果100次访问只将10次上传给zipkin )

3.4 展示信息

访问主页可以看到微服务调用情况的列表,可以看到调用是否成功、发送http请求数量、调用时间、调用 在这里插入图片描述 也可以点击show查看调用的具体情况。可以看到发送请求是否成功、失败原因、调用时间等。 在这里插入图片描述 在这里插入图片描述

3.5 使用数据库

在使用Zipkin时,默认使用的内存存储,如果服务断掉的话,记录会全部丢失,所以我们可以使用Mysql保存调用数据。

下载数据库脚本后执行下文命令即可。 数据库脚本地址:github.com/openzipkin/…

java -jar zipkin-server-2.23.16-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=ip --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_DB=zipkin

MYSQL_HOST:数据库地址
MYSQL_TCP_PORT:数据库端口
MYSQL_USER:用户名
MYSQL_PASS:密码

根据官方文档来看,Mysql只建议在测试与演示时使用,生产环境建议ElasticSearch。