spring Boot 链路追踪(sleuth+zipkin)
参考官网
springCloud的使用08——-服务链路追踪(sleuth+zipkin)(包含存入mysql数据库)
spring cloud sleuth 服务链路追踪(写的不错的帖子)
sleuth与Zipkin关系?
spring cloud提供了spring-cloud-sleuth-zipkin来方便集成zipkin实现(指的是Zipkin Client,而不是Zipkin服务器),该jar包可以通过spring-cloud-starter-zipkin依赖来引入。
介绍
sleuth主要功能是在分布式系统中提供追踪解决方案,并且兼容支持了zipkin(提供了链路追踪的可视化功能)
zipkin原理:在服务调用的请求和响应中加入ID,表明上下游请求的关系。
利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。
sleuth是对zipkin的封装,对应Span,Trace等信息的生成、接入http request,以及向Zipkin server发送采集信息等全部自动化完成。
目前主流的链路追踪组件有:google的Dapper,Twitter的zipkin和阿里的Eagleeye(鹰眼)。
现在 搭建 zipkin 服务器 现在都是 (官方推荐2.0之后)直接下载 jar 没必要和 eurkea 进行整合
原理:
Sleuth 默认采用 Http 方式将 span 传输给 Zipkin
那么问题就来了占用资源
我的github: https://github.com/tianliuzhen/springCloud
测试这里的位置是:已经实现了 rabbitmq 和 mysql 且版本比较新
zipkin | 服务器 |
---|---|
customer | 消费者 |
provider2 | 提供者 |
实战:
1、搭建 zipkin 服务器
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入的zipkinServer依赖-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.11.13</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.11.13</version>
</dependency>
启动器注解
@SpringBootApplication
@EnableZipkinServer
@EnableEurekaClient
public class ZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class, args);
}
}
yml配置
eureka:
client:
service-url:
defaultZone: http://localhost:7082/eureka/
#解决IllegalArgumentException: Prometheus requires that all meters with the same name have the same set of tag keys.
management:
metrics:
web:
server:
auto-time-requests: false
server:
port: 8094
spring:
application:
name: cloud-zipkin-demo
#解决The bean 'characterEncodingFilter', defined in class path resource [zipkin/autoconfigure/ui/ZipkinUiAutoConfiguration.class],
#could not be registered. A bean with that name has already been defined
#in class path resource [org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.class] and overriding is disabled.Action:
main:
allow-bean-definition-overriding: true
2、搭建 zipkin 客户端 (其他服务调用的)
pom依赖
<!-- 配置服务链路追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
或者,下面这个 spring-cloud-starter-zipkin 包含了 上面两个依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
yml配置
spring:
zipkin:
base-url: http://localhost:8094
注:有时候可能在zipkin服务器中看不到数据,那是因为默认sleuth收集信息的比率是0.1 ,针对于这个问题有两种解决方法:
a 在配置文件中配置 spring.sleuth.sampler.percentage=1
b 在代码中声明
//100%的来采集日志,和在配置文件中配置spring.sleuth.sampler.percentage=1是一样的@Bean
public AlwaysSampler defaultSampler(){
return new AlwaysSampler();
}
3、优化
针对以上的问题的解决方法:
a 采用socket或高效率的通信方式
b 采用异步方式发送信息数据
c 在客户端和zipkin之间增加缓存类的中间件,如redis,mq等,即时zipkin server重启过程中,客户端依然可以将数据发送成功
解决方案 地址如下:
下面三个帖子可结合,有我想要的效果,待测试,因为新的版本升级导致变化很大,而且springBoot建议
2.x 以上的版本,下载 服务器的jar启动部署
https://blog.csdn.net/liubenlong007/article/details/87885154 (推荐:新的方案)1(采用它的rabbitmq入库)
spring Cloud Sleuth 服务链路跟踪,集成RabbitMq(旧的方案:过时)(采用它的mysql入库)
https://www.520mwx.com/view/64733 (采用它的zipkin客户端配置)
mysql存储链路数据( 采用它的mysql入库)
优化一、 整合 rabbitMq(已经测试)
1、sleuth服务端修改 zipkin
1.1、在服务端增加原有的基础之上增加依赖
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>2.11.13</version>
</dependency>
1.2、修改服务端配置yml
zipkin:
collector:
rabbitmq:
addresses: 47.98.253.2:5672
password: guest
queue: zipkin
username: guest
2、sleuth客户端修改
2.1、在客户端增加原有的基础之上增加依赖
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
2.2、修改客户端配置yml
spring:
application:
name: xxxx
zipkin:
# base-url: http://localhost:9411 #http方式提交到zipkin
sender:
type: rabbit # 切换到rabbitmq
sleuth:
sampler:
#应采样的请求的概率。 例如。 应该对1.0 - 100%的请求进行抽样。 精度仅为整数(即不支持0.1%的迹线)。
probability: 1.0
rabbitmq:
host: 47.98.253.2
port: 5672
username: guest
password: guest
listener: # 这里配置了重试策略
direct:
retry:
enabled: true
simple:
retry:
enabled: true
优化二、 整合mysql 入库(已经测试)
zipkin +rabbit +mysql完整的依赖
<zipkin.version>2.11.13</zipkin.version>
<mysql-connector.version>8.0.13</mysql-connector.version>
<jooq.version>3.11.11</jooq.version>
########################################
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-collector-rabbitmq</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 一个新型的orm框架,zipkin需要依赖 -->
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>${jooq.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
yml配置
spring:
application:
name: cloud-zipkin-demo
#解决The bean 'characterEncodingFilter', defined in class path resource [zipkin/autoconfigure/ui/ZipkinUiAutoConfiguration.class],
#could not be registered. A bean with that name has already been defined
#in class path resource [org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.class] and overriding is disabled.Action:
main:
allow-bean-definition-overriding: true
datasource: #配置msyql 连接
#schema[0]: classpath:/zipkin.sql #数据库创建脚本,可以到官网下载
url: jdbc:mysql://localhost:3306/zipkin?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
zipkin:
collector:
rabbitmq:
addresses: 47.98.253.2:5672
password: guest
queue: zipkin
username: guest
storage:
type: mysql
4、测试成功的webui
采坑:
1、 spring.sleuth.sampler.percentage=1不生效问题
自己学习Spring-Cloud结合zipkin跟踪请求的例子,发现设置spring.sleuth.sampler.percentage=1之后没有生效,
后来百度发现需要设置为spring.sleuth.sampler.probability=1,这是由于我使用的spring-cloud版本太新的原因。