Version: Next
Sleuth 概述
要解决的问题
- 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协调产生最终的请求结果
- 每个前端请求都会形成分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最终失败
Spring Cloud Sleuth
提供了一套完整的服务跟踪解决方案,且支持兼容zipkin
(展示端)Sleuth
将链路信息发送给Zipkin
,通过Zipkin
进行展示
zipkin 搭建
http://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
- 选择
2.12.9
版本下载zipkin-server-2.12.9-exec.jar
- 终端进入
jar
包所在路径,使用java -jar zipkin-server-2.12.9-exec.jar
命令运行即可- 访问
http://localhost:9411/zipkin/
- 一条链路由一个
Trace ID
唯一标识Span
标识发起的请求- 各个
Span
通过Parent ID
关联起来- 说白了就跟个
树
差不多名词解释
Trace
:类似于树结构的Span
集合,表示一条调用链路,存在唯一标识Span
:标识调用链路来源,通俗的理解Span
就是一次请求
整合 Sleuth
cloud-provider-payment8001
POM
- Sleuth Zipkin 依赖
- 8001 完整依赖
<!-- 包含了sleuth zipkin 数据链路追踪-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
YAML
- 添加
zipkin
、sleuth
配置
server:
port: 8081
spring:
application:
name: cloud-payment-service
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
#采样取值介于 0到1之间,1则表示全部收集
probability: 1
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true #驼峰映射
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #调试打印SQL
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
#集群版
#defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#单机版 入驻到这个地址(就是注册中心地址)
defaultZone: http://127.0.0.1:7001/eureka/
instance: # 用来修改服务名称,防止暴露当前服务器主机
instance-id: payment8001
prefer-ip-address: true # 可以预览 ip 地址
#lease-renewal-interval-in-seconds: 1 # Eureka 客户端向服务端发送心跳信号的时间间隔
#lease-expiration-duration-in-seconds: 2 # Eureka 服务端在受到最后一次心跳后等待的时间上线
controller
随便写一个接口,让微服务能被访问,从而可以被监控到链路调用
@GetMapping(value="/payment/zipkin")
public String paymentZipkin() {
return "hello,i am paymentZipkin server fallback,O(∩_∩)O哈哈~";
}
cloud-consumer-order80
POM
引入 zipkin Maven 坐标
YAML
相同的配置
server:
port: 80
spring:
application:
name: cloud-order-service
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
#采样取值介于 0到1之间,1则表示全部收集
probability: 1
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
# 单机版本
defaultZone: http://localhost:7001/eureka
# 集群版
# defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
controller
- RestTemplate 远程调用
payment8001
@GetMapping(value = "/consumer/payment/zipkin")
public String paymentZipkin() {
return restTemplate.getForObject( "http://localhost:8081/payment/zipkin/", String.class);
}
测试
- 启动注册中心
7001
- 启动
8001
、80
80
调用8001
几次,通过访问http://localhost:80/consumer/payment/zipkin
实现- 登录
http://localhost:9411
- 点开可以看到每次分部调用的耗时
dependencies
可以以图的形式展现微服务间的依赖关系