- Java工程师的进阶之路
- 1 - SpringCloud简介与工程构建
- 2 - 服务注册中心:Eureka、Zookeeper、Consul
- 3 - 服务负载均衡:Ribbon
- 4 - 服务接口调用:OpenFeign
- 5 - 服务的断路器:Hystrix
- 6 - 服务的路由器:GateWay
- 7 - 服务配置中心:SpringCloud Config
- 8 - 服务消息驱动:SpringCloud Stream
- 9 - 服务链路跟踪:SpringCloud Sleuth
十四、Sleuth
14.1、简介
1、为什么需要使用Sleuth
在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。
2、解决
- 官方文档
- Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案
- 在分布式系统中提供追踪解决方案并且兼容支持了zipkin
14.2、Sleuth之zipkin搭建安装
1、使用Docker进行安装
docker run --name zipkin \
-p 9411:9411 \
-d openzipkin/zipkin
2、访问 - http://localhost:9411/zipkin/
14.3、完整的调用链路
1、请求链路,一条链路通过Trace ld唯一标识,Span标识发起的请求信息,各span通过parent id关联起来
2、—条链路通过Trace ld唯一标识,Span标识发起的请求信息,各span通过parent id关联起来。
3、整个链路的依赖关系如下
名词解释
- Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
- span:表示调用链路来源,通俗的理解span就是一次请求信息
14.4、Sleuth链路监控展现
14.4.1、服务提供者
1、新增- cloud-provider-payment8001
2、POM - 新增
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3、YML - 新增
server:
port: 8001
spring:
application:
name: cloud-payment-service
zipkin: #<-------------------------------------关键
base-url: http://120.76.55.55:9411
sleuth: #<-------------------------------------关键
sampler:
#采样率值介于 0 到 1 之间,1 则表示全部采集
probability: 1
eureka:
client:
# 表示是否将自己注册进Eureka server默认为true。
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
4、控制层
@RestController
@Slf4j
public class PaymentController {
@GetMapping("/payment/zipkin")
public String paymentZipkin() {
return "Hello zipkin";
}
}
14.4.2、服务消费者
1、修改 - cloue-consumer-order80
2、POM
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3、YML
server:
port: 80
spring:
application:
name: cloud-order-service
zipkin: #<-------------------------------------关键
base-url: http://120.76.55.55:9411
sleuth: #<-------------------------------------关键
sampler:
#采样率值介于 0 到 1 之间,1 则表示全部采集
probability: 1
eureka:
client:
# 表示是否将自己注册进Eureka server默认为true。
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
4、业务类
@Slf4j
@RestController
public class OrderController {
@Resource
private RestTemplate restTemplate;
// ====================> zipkin+sleuth
@GetMapping("/consumer/payment/zipkin")
public String paymentZipkin() {
String result = restTemplate.getForObject("http://localhost:8001"+"/payment/zipkin/", String.class);
return result;
}
}
5、测试
启动 - eureka7001、8001、80
访问 - http://localhost/consumer/payment/zipkin
几次测试下
访问 - http://120.76.55.55:9411
并追踪 cloud-order-service