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 数据链路追踪-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

YAML

  • 添加 zipkinsleuth 配置
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
  • 启动 800180
  • 80 调用 8001 几次,通过访问 http://localhost:80/consumer/payment/zipkin 实现
  • 登录 http://localhost:9411
    • 点开可以看到每次分部调用的耗时
    • dependencies 可以以图的形式展现微服务间的依赖关系