【Spring Cloud】Spring Cloud Sleuth

Spring Cloud Sleuth 介绍

https://github.com/spring-cloud/spring-cloud-sleuth

在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。

Spring Cloud Sleuth 提供了一套完整的服务跟踪的解决方案。其在分布式系统中提供追踪解决方案并且兼容支持了zipkin。

img

Zipkin是 Twitter 的一个开源项目,基于 Google Dapper实现。可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它也提供了方便的 UI 组件帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。

img

sleuth
英 [sluːθ] 美 [sluːθ]
n. 侦探

Sleuth 之 zipkin 搭建安装

下载地址:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/

Spring Cloud 从 F 版起已不需要自己构建 Zipkin Server了,只需调用jar包即可:

1
java -jar zipkin-server-2.12.9-exec.jar

运行控制台:http://localhost:9411/zipkin/

请求链路,一条链路通过Trace ld唯一标识,Span标识发起的请求信息,各span通过parent id关联起来

img

—条链路通过Trace ld唯一标识,Span标识发起的请求信息,各span通过parent id关联起来。

img

整个链路的依赖关系如下:

img

名词解释

  • Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
  • span:表示调用链路来源,通俗的理解span就是一次请求信息

Sleuth 链路监控展现

服务提供者

在服务提供者 cloud-provider-payment8001 中添加 Sleuth 链路。

  1. 导入 Maven 依赖:
1
2
3
4
5
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  1. 配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
application:
name: cloud-payment-service

zipkin: #<------------------------------------- 关键
base-url: http://localhost:9411
sleuth: #<------------------------------------- 关键
sampler:
# 采样率值介于 0 到 1 之间,1 则表示全部采集
probability: 1

datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
  1. 业务类 PaymentController:
1
2
3
4
5
6
7
8
@RestController
@Slf4j
public class PaymentController {
@GetMapping("/payment/zipkin")
public String paymentZipkin() {
return "hi ,i'am paymentzipkin server fall back,welcome to here, O(∩_∩)O哈哈~";
}
}

服务消费者

修改服务消费者 cloud-consumer-order80,添加 Sleuth 链路。

  1. 导入 Maven 依赖:
1
2
3
4
5
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  1. 配置文件:
1
2
3
4
5
6
7
8
spring:
application:
name: cloud-order-service
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1
  1. 业务类 OrderController:
1
2
3
4
5
6
7
8
    ...
// ====================> zipkin+sleuth
@GetMapping("/consumer/payment/zipkin")
public String paymentZipkin() {
String result = restTemplate.getForObject("http://localhost:8001"+"/payment/zipkin/", String.class);
return result;
}
}

测试:依次启动eureka7001/8001/80 - 80调用8001几次测试下。

打开浏览器访问: http://localhost:9411

img