十五、微服务跟踪之Spring Cloud Sleuth与Zipkin配合使用

Zipkin简介

ZipkinTwitter开源的分布式跟踪系统,基于Dapper的论文设计而来。它的主要功能是收集系统的时序数据,从而跟踪微服务架构的系统时序等问题。Zipkin还提供了一个非常友好的界面,来帮助分析追踪数据。


编写Zipkin Server

  1. 新建项目,pom添加依赖:
1
2
3
4
5
6
7
8
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
  1. 启动类添加@EnableZipkinServer注解。

  2. application.yml中配置:

1
2
server:
port: 9411
  1. 启动Zipkin服务:
    zipkin

微服务整合Zipkin

  1. 客户端添加依赖:
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
  1. application.yml中配置:
1
2
3
4
5
6
7
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
# 采样百分比,默认0.1(10%)
sampler:
percentage: 1.0
  1. 启动服务并访问:
    zipkin
    zipkin
    zipkin

使用消息中间件收集数据

使用消息中间件有以下优点:

  • 微服务与Zipkin Server解耦,微服务无需知道Zipkin Server的网络地址。
  • 在一些场景下,Zipkin Server与微服务网络可能不同,使用 HTTP 直接收集的方式无法工作,此时可借助消息中间件实现数据收集。

如图:
zipkin使用mq

改造Zipkin Server
  1. pom修改依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<!--mq收集数据-->
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.3.1</version>
</dependency>
  1. application.yml配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 9411
spring:
application:
name: zipkin-server
zipkin:
collector:
rabbitmq:
# 多个地址使用,分隔
addresses: localhost:5672
username: guest
password: guest
queue: zipkin

这样,Zipkin Server就改造完成。

改造微服务
  1. pom修改依赖:
1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>1.7.5.RELEASE</version>
</dependency>
  1. application.yml配置文件:
1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: micorservice-provider-user
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
zipkin:
rabbitmq:
queue: zipkin

这样,微服务就改造完成。


使用Elasticsearch存储跟踪数据

Zipkin Server是将数据存储在内存中的。一旦Zipkin Server重启或者发生崩溃,就会导致历史数据的丢失。

Zipkin Server支持多种后端存储,如MYSQLElasticsearchCassandra等等。

  1. pom修改依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<!--mq收集数据-->
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<!--支持elasticsearch 2.x - 6.x-->
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>
<version>2.3.1</version>
</dependency>
  1. application.yml配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
zipkin:
collector:
rabbitmq:
# 多个地址使用,分隔
addresses: localhost:5672
username: guest
password: guest
queue: zipkin
storage:
type: elasticsearch
elasticsearch:
cluster: elasticsearch
hosts: http://localhost:9200
index: zipkin
index-shareds: 5
index-replicas: 5
  1. 启动微服务,访问后,访问http://localhost:9200/_search,可以看到如下结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"took":5,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":7,
"max_score":1,
"hits":[
{
...
}
]
}
}

说明能够正常将数据存储在elasticsearch中。重启Zipkin Server,仍可以查询历史数据。

依赖关系图

使用elasticsearch存储数据后,单击Zipkin Server导航栏上的Dependencies,会发现一片空白。

要想分析微服务之间的依赖关系,需借助zipkin-denpendencies(https://github.com/openzipkin/zipkin-dependencies)组件,该工具本质上是一个`Spark job`。


该文章摘自《Spring Cloud 与 Docker 微服务架构实战(第二版)》

以上

LeoQin wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
0%