一.简介
微服务之间通过网络通信,服务之间的调用形成调用链路。在服务调用链上如何快速定位服务业务处理速度变慢、服务变为环形调用等。
SpringCloud提供了Sleuth 可以实现微服务的调用跟踪,形成调用线路。Sleuth 采集调用链路上的信息以Span描述,一个Span包含4个部分:
-CS(Client Sent 客户端发送):客户端发起请求,表示请求开始;
-SR(Server Received 服务器接收):服务器获取客户端请求,SR-CS 表示网络延迟;
-SS(Server Sent 服务端发送):服务端处理完成响应客户端,SS-SR 表示服务端处理时间;
-CR(Client Received 客户端接收):span 接收标志,表示客户端收到服务端响应。
Zipkin 是Twitter开源的分布式跟踪系统,Zipkin提供了可视化分析工具。
二.实现
1.新建zipkin-srever Server模块:增加如下依赖
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.12.3</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.12.3</version>
</dependency>
2.配置zipkin-server
server:
port: 8080
management:
metrics:
web:
server:
auto-time-requests: false # 否则可能会失败
3.@EnableZipkinServer 开启zipkin Server
package com.vincent.zipkin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;
@SpringBootApplication
@EnableZipkinServer
public class ZipkinApp {
public static void main(String[] args) {
SpringApplication.run(ZipkinApp.class,args);
}
}
4.启动zipkin-server 并访问 http://localhost:8080
5.需要跟踪的服务中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
service-user / consumer-user添加spring-cloud-starter-zipkin,并在配置文件中配置如下:
spring:
zipkin:
# 配置zipkin 收集地址
base-url: http://localhost:8080
sleuth:
sampler:
# 指定请求采用百分比(0-1),1表示所有请求都采样
percentage: 1.0
5.启动各微服务实例,并访问 http://localhost:8030/getUserById?id=1产生数据,zipkin web 控制台点击跟踪数据(find traces)。
点击每个trace 查看详细信息,可以清楚指定服务调用链路等信息:
三.Zipkin 注册到Eureka
1.添加Eureka client 注册到Eureka;
2.需要跟踪的微服务中修改spring.zipkin.base-url http://ip:port 为 http://<服务名>。
spring:
zipkin:
base-url: http://svc-zipkin
sender:
type: web
discovery-client-enabled: true
sleuth:
sampler:
probability: 0.1
四.Zipkin Server持久化数据到ES
zipkin 默认数据保存在内存中,不适用于生产环境,zipkin server增加依赖:
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-elasticsearch</artifactId>
<version>2.12.9</version>
</dependency>
application.yaml 增加ES配置:
zipkin:
storage:
type: elasticsearch
elasticsearch:
hosts: http://ip:port
index: zipkin