1.背景与选型

1.1 背景

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

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_微服务

1.2 选型

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

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

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

1.3 Sleuth简单原理

如果你想知道在微服务调用链中那个服务出现问题,就需要将这些服务串起来,得知上游服务和下游服务。

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_java_02


当所有调用、返回请求携带图中这些参数后,通过携带信息就能得到服务间的链路、调用服务名、返回结果、服务的耗时等信息。就能完成链路追踪的效果。


2.集成Sleuth

2.1 集成

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

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

2.2 验证

当日志出现下文样式代表成功。

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_spring cloud_03


其中图中为Sleuth提供的四个参数。

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

2.3 查看

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_微服务_04


中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_spring cloud_05


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

3.集成Zipkin

3.1 搭建

访问官网:https://github.com/openzipkin/zipkin 点击下文链接即可下载。

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_微服务_06

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请求数量、调用时间、调用

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_链路追踪_07


也可以点击show查看调用的具体情况。可以看到发送请求是否成功、失败原因、调用时间等。

中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_数据库_08


中小企业的链路追踪解决方案-Spring Cloud alibaba+Spring Cloud Sleuth + Zipkin_链路追踪_09

3.5 使用数据库

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

下载数据库脚本后执行下文命令即可。
数据库脚本地址:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

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。