当前位置: > > > 分布式服务跟踪Spring Cloud Sleuth使用详解2(与Zipkin整合)

分布式服务跟踪Spring Cloud Sleuth使用详解2(与Zipkin整合)

    Zipkin Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。关于 Zipkin 更详细的介绍可以参考我之前写的文章(点击查看)。
    而 Spring Cloud Sleuth 在整合 Zipkin 时,不仅实现了以 HTTP 的方式收集跟踪信息,还实现了通过消息中间件来对跟踪信息进行异步收集的封装。下面分别对这两种方式进行介绍。

二、与 Zipkin 整合

1,以 Http 方式收集信息

(1)首先我们要启动个 Zipkin Server 服务,具体参考我之前写的文章:

(2)服务端搭建好后,我们还要对需要对具体应用做一些配置,以实现将跟踪信息输出到 Zipkin Server。这里我们对之前的 hello-serviceribbon-consumer 两个微服务做个改造,在它们的 pom.xml 文件中引入 spring-cloud-sleuth-zipkin 依赖:
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-sleuth</artifactId>
 </dependency>
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-sleuth-zipkin</artifactId>
 </dependency>
  • 当然我也可以直接引入 spring-cloud-starter-zipkin 依赖,该依赖包含了 spring-cloud-starter-sleuth spring-cloud-sleuth-zipkin 这两个依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

(3)接着在 hello-serviceribbon-consumer application.properties 中增加 Zipkin Server 地址信息,同时指定通过 Http 方式将数据发送到 Zipkin Server
spring.zipkin.base-url=http://192.168.60.133:9411
spring.zipkin.sender.type=web

2,通过消息中间件收集信息

(1)首先我们要启动个 Zipkin Server 服务,具体参考我之前写的文章,注意启动时要设置消息中间件(RabbitMQ 或者 Kafka)的连接信息:

(2)服务端搭建好后,我们还要对需要对具体应用做一些配置,让应用客户端将跟踪信息输出到消息中间件上,而 Zipkin 服务端从消息中间件上异步地消费这些跟踪信息。
  • 这里我们对之前的 hello-serviceribbon-consumer 两个微服务做个改造,在它们的 pom.xml 文件中增加引入 spring-cloud-sleuth-zipkin spring-cloud-starter-stream-rabbit 依赖(如果使用的是 kafka 则引入 spring-cloud-starter-stream-kafka):
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
  • 当然我也可以直接引入 spring-cloud-starter-zipkin 代替 spring-cloud-starter-sleuthspring-cloud-sleuth-zipkin 这两个依赖,因为它包含了后面二者:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

(3)接着在 hello-service ribbon-consumerapplication.properties 中配置 RebbitMQ 的连接信息,同时指定将数据发送到 RabbitMQZipkin Server 默认的监听队列为名为 zipkin Queue,数据通过 Direct 方式发送到该队列):
注意: 如果使用 Kafka 则将 spring.zipkin.sender.type 属性设置为 kafka,并配置 Kafka 连接信息。
spring.rabbitmq.host=192.168.60.133
spring.rabbitmq.port=5672
spring.rabbitmq.username=hangge
spring.rabbitmq.password=123

spring.zipkin.sender.type=rabbit

附:运行测试

(1)首先我们多次请求 ribbon-consumer 应用的 /hello-consumer 接口,可以看到该应用控制台输出如下,当日志中出现跟踪信息最后一个值为 true 的时候,说明该跟踪信息会输出给 Zipkin Server
(1)因为 Sleuth 默认会使用 zipkin brave ProbabilityBasedSampler 抽样策略,该策略以请求百分比的方式配置和收集跟踪信息,它的默认值为 0.1,代表收集 10% 的请求跟踪信息。也就是说默认有 10% 的几率将跟踪信息输出到 Zipkin Server
(2)我们也可以根据情况修改采集率(比如测试时想让所有跟踪数据都能发送到 Zipkin Server),具体方法可以参考我的另一篇文章:

(2)此时我们可以去 Zipkin Server 的管理页面中选择合适的查询条件后,点击查询,就可以查询出刚才在日志中出现的跟踪信息了(也可以根据日志中的 Trace ID,在页面的右上角输入框中来搜索):

(3)点击下方 ribbon-consumer 端点的跟踪信息,我们还可以得到 Sleuth 跟踪到的详细信息,其中包括了我们关注的请求时间消耗等:

(4)点击这个 trace 中具体的 span 则可以在右侧显示该 span 的详情:

(5)点击导航栏的依赖分析按钮,还可以查看查看 Zipkin Server 根据跟踪信息分析生成的系统请求链路依赖关系图:
评论0