在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延迟时或错误都会引起整个请求最后的失败。
Spring Cloud Sleuth 提供了一套完整的服务跟踪解决方案,在分布式系统中提供追踪解决方案并且兼容支持了 zipkin,官方源码。
下图是产品调用库存模块,发送 trace 数据, Zipkin dashboard 提供网页展现。
搭建链路监控步骤(Sluth 负责收集整理,zipkin 负责展现)
1.zipkin
SpringCloud从F版起已不需要自己构建Zipkin server了,只需要调用jar包即可。zipkin 下载链接:Central Repository: io/zipkin/zipkin-server
这里采用的版本是:zipkin-server-2.23.9-exec.jar
在 cmd 中运行 zipkin:java -jar zipkin-server-2.23.9-exec.jar
一条链路通过 Trace Id 唯一标识,Span 标识发起的请求信息,各 span 通过 parent id 关联起来
个人理解:Span Id 标识一个微服务,Parent Id 标识调用它的那个微服务的 Span Id
整个的链路依赖关系如下:
Trace:类似于树结构中的Span 集和,表示一条调用链路,存在唯一标识
Span:表示调用链路来源,通俗的理解 Span 就是依次请求信息
2.服务提供者
这里采用 cloud-provider-payment8001 作为服务的提供者
2.1、在 cloud-provider-payment8001 的 POM文件中添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2.2、修改其 application.yml 配置文件
server:
port: 8001
spring:
application:
name: cloud-payment-service
# 配置 zipkin 和 sleuth 相关的配置
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
# 采样率值介于 0 到 1 之间,1 表示全部采集
probability: 1
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: com.mysql.cj.jdbc.Driver # mysql 驱动包
url: jdbc:mysql://服务器IP地址:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: MySQL123456MySQL
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.atyixuan.springcloud.entities # 所有的 entity 别名类所在包
eureka:
instance:
instance-id: payment8001
prefer-ip-address: true
# Eureka 客户端向服务器发送心跳的时间间隔,单位为秒(默认是 30秒)
lease-renewal-interval-in-seconds: 30
# Eureka 服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是 90秒),超时将剔除服务
lease-expiration-duration-in-seconds: 90
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka # , http://eureka7002.com:7002/eureka
2.3、业务类:在 Controller 中添加方法,com.atyixuan.springcloud.controller.PaymentController
添加的业务方法如下,直接追加到 PaymentController 的结尾:
@GetMapping("/payment/zipkin")
public String paymentZipkin()
{
return "hi ,i'am paymentzipkin server fall back,welcome to atguigu,O(∩_∩)O哈哈~";
}
3.服务消费者(调用方)
这里采用 cloud-consumer-order80 作为服务的消费者
3.1、在 cloud-provider-payment8001 的 POM文件中添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
3.2、修改其 application.yml 配置文件
server:
port: 80
spring:
application:
name: cloud-order-service
# zipkin 和 sleuth 的相关配置
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
# defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
3.3、业务类:在 Controller 中添加方法,com.atyixuan.springcloud.controller.OrderController
添加的业务方法如下,直接追加到 OrderController 的结尾:
// ====================> zipkin+sleuth
@GetMapping("/consumer/payment/zipkin")
public String paymentZipkin()
{
return restTemplate.getForObject("http://localhost:8001"+"/payment/zipkin/", String.class);
}
测试
依次启动:
cloud-eureka-server7001、cloud-provider-payment8001 和 cloud-consumer-order80
浏览器中输入:http://localhost/consumer/payment/zipkin
浏览器输入:http://localhost:9411/zipkin/
跳转到依赖这一栏:单击搜索框,左边的下拉菜单显示当前使用的服务名称
在下拉框中选中一个服务:这里以 cloud-payment-service 为例,下图显示 23次访问,访问出错 0 次,单击 TRACES 可以显示每一次访问的细节
单击 TRACES 之后,单击 RUN QUERY 查询最近访问的 10 条结果
这里显示访问持续的时间是 9.047 ms,标签显示是 GET 请求,请求路径是 /consumer/payment/zipkin ,发出请求的Controller 类是 OrderController,请求的方法是paymentZipkin()