分布式服务跟踪Spring Cloud Sleuth使用详解2(与Zipkin整合)
Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。关于 Zipkin 更详细的介绍可以参考我之前写的文章(点击查看)。
(3)接着在 hello-service 和 ribbon-consumer 的 application.properties 中增加 Zipkin Server 地址信息,同时指定通过 Http 方式将数据发送到 Zipkin Server:
(3)接着在 hello-service 和 ribbon-consumer 的 application.properties 中配置 RebbitMQ 的连接信息,同时指定将数据发送到 RabbitMQ(Zipkin Server 默认的监听队列为名为 zipkin 的 Queue,数据通过 Direct 方式发送到该队列):
而 Spring Cloud Sleuth 在整合 Zipkin 时,不仅实现了以 HTTP 的方式收集跟踪信息,还实现了通过消息中间件来对跟踪信息进行异步收集的封装。下面分别对这两种方式进行介绍。
二、与 Zipkin 整合
1,以 Http 方式收集信息
(1)首先我们要启动个 Zipkin Server 服务,具体参考我之前写的文章:
(2)服务端搭建好后,我们还要对需要对具体应用做一些配置,以实现将跟踪信息输出到 Zipkin Server。这里我们对之前的 hello-service、ribbon-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-service 和 ribbon-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-service、ribbon-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-sleuth 和 spring-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-consumer 的 application.properties 中配置 RebbitMQ 的连接信息,同时指定将数据发送到 RabbitMQ(Zipkin 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),具体方法可以参考我的另一篇文章:
(2)此时我们可以去 Zipkin Server 的管理页面中选择合适的查询条件后,点击查询,就可以查询出刚才在日志中出现的跟踪信息了(也可以根据日志中的 Trace ID,在页面的右上角输入框中来搜索):
(3)点击下方 ribbon-consumer 端点的跟踪信息,我们还可以得到 Sleuth 跟踪到的详细信息,其中包括了我们关注的请求时间消耗等:
(4)点击这个 trace 中具体的 span 则可以在右侧显示该 span 的详情:
(5)点击导航栏的依赖分析按钮,还可以查看查看 Zipkin Server 根据跟踪信息分析生成的系统请求链路依赖关系图: