Fork me on GitHub

Spring Cloud Sleuth与Zipkin配合使用

目录

Spring Cloud Sleuth入门

经过前文讲述,我们的微服务架构日趋完善,已可使用Spring Cloud构建一个非常健壮的系统!

但假设,你的项目一旦出现问题,如何才能快速定位出来呢?一般项目上要求我们快速定位两种问题:

  • 调用发生失败,快速定位出是哪个环节出了问题。是微服务问题,还是网络?
  • 调用慢,如何快速找到性能瓶颈?

这正是调用链监控要做的事情。Spring Cloud提供Sleuth来实现调用链监控。

简介

Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计。

TIPS

基本概念

(1) Span(跨度):

基本工作单元。span用一个64位的id唯一标识。除ID外,span还包含其他数据,例如描述、时间戳事件、键值对的注解(标签),span ID、span父ID等。

span被启动和停止时,记录了时间信息。初始化span被称为“root span”,该span的id和trace的id相等。

(2) Trace(跟踪):

一组共享“root span”的span组成的树状结构称为trace。trace也用一个64位的ID唯一标识,trace中的所有span都共享该trace的ID。

(3) Annotation(标注):

annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。

1
2
3
4
(1) cs(Client Sent 客户端发送):客户端发起一个请求,该annotation描述了span的开始。
(2) sr(Server Received 服务器端接收):服务器端获得请求并准备处理它。如果用sr减去cs时间戳,就能得到网络延迟。
(3) ss(Server Sent 服务器端发送):该annotation表明完成请求处理(当响应发回客户端时)。如果用ss减去sr时间戳,就能得到服务器端处理请求所需的时间。
(4) cr(Client Received 客户端接收):span结束的标识。客户端成功接收到服务器端的响应。如果cr减去cs时间戳,就能得到从客户端发送请求到服务器响应的所需的时间。

Spring Cloud Sleuth与Zipkin配合使用

快速入门

  • 加依赖:
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
  • 写配置:
1
2
3
4
logging:
level:
root: INFO
org.springframework.cloud.sleuth: DEBUG

其中,配不是必选的,这里加上日志,只是为了看到更多Sleuth相关的日志。

是不是非常简单!

测试

  • 启动 microservice-provider-user-sleuth
  • 访问 http://localhost:8000/users/1 ,可看到类似如下的日志:
1
2
3
4
5
6
7
2019-03-13 23:32:46.913  INFO [microservice-provider-user,,,] 14759 --- [nio-8000-exec-1] o.apache.tomcat.util.http.parser.Cookie  : A cookie header was received [1551574921,1551708812,1552142696] that contained an invalid cookie. That cookie will be ignored.Note: further occurrences of this error will be logged at DEBUG level.
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-03-13 23:32:46.975 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
2019-03-13 23:32:46.981 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2019-03-13 23:32:46.982 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]
2019-03-13 23:32:46.982 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]
2019-03-13 23:32:46.982 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
  • 从日志可以发现,此时日志多出来类似 [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 的内容。

一个良好的监控,应该有一个人类亲和的界面,这个界面就是Zipkin。

Zipin简介

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

TIPS

Zipkin官方网站:http://zipkin.io/

Zipkin Server搭建

1
java -jar zipkin-server-2.11.7-exec.jar
  • 访问http://localhost:9411 即可看到Zipkin Server的首页。

Zipkin UI

Zipkin UI首页:

Spring Cloud Sleuth与Zipkin配合使用

简单讲解图中各个查询条件的含义:

① Service Name表示服务名称,也就是各个微服务spring.application.name的值。

② 第二列表示span的名称,“all”表示所有span,也可选择指定span。

③ Lookback用于执行想要查看的之间段。

④ Duration表示持续时间,即span从创建到关闭所经历的时间。

⑤ Limit表示查询几条数据。类似于MySQL数据库中的limit关键词。

⑥ Annotations Query,用于自定义查询条件。

微服务整合Zipkin

在 Spring Cloud Sleuth入门 的基础上:

  • 加依赖
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
  • 加配置
1
2
3
4
5
6
7
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
# 采样率,模式0.1,也就是10%,为了便于观察效果,改为1.0,也就是100%。生产环境建议保持默认。
probability: 1.0

测试

  • 启动微服务,访问http://localhost:8000/users/1
  • 观察http://localhost:9411 ,可看到类似如下界面:

Spring Cloud Sleuth与Zipkin配合使用

  • 点击上图中标注的3,可看到类似如下的界面:

Spring Cloud Sleuth与Zipkin配合使用

  • 如图,已经展示了该次请求的耗时。如果你有多个应用,Zipkin将会展示每个应用消耗了多少时间,蓝色表示请求正常,红色表示请求失败。

配套代码

microservice-provider-sleuth-zipkin

相关文章