zipkin-server整合springboot,在整合的过程中,发现一直启动都是报错,度娘查了下,原来是zipkin再做版本的升级过程中做了很大的改动,导致引用springboot会有冲突
。本人解决了很久依旧没有效果。
后来发现从spring Cloud为F版本开始,已经不需要
自己构建Zipkin Server了,只需要下载jar运行即可。
java -jar zipkin-server-2.12.9-exec.jar
springcloud整合sleuth、zipkin进行链路跟踪
sleuth主要功能是在分布式系统中提供追踪解决方案,并且兼容支持了zipkin(提供了链路追踪的可视化功能)
zipkin原理:在服务调用的请求和响应中加入ID,表明上下游请求的关系。
利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。
sleuth是对zipkin的封装,对应Span,Trace等信息的生成、接入http request,以及向Zipkin server发送采集信息等全部自动化完成。
目前主流的链路追踪组件有:google的Dapper,Twitter的zipkin和阿里的Eagleeye(鹰眼)。
一、zipkin服务搭建
不用自己手动搭建直接下载jar进行启动即可
cd ./
java -jar zipkin-server-2.19.2-exec.jar
二、服务搭建,进行模拟链路调用
项目目录结构
cz-spring-cloud-nacos
|—order-service
|—pay-service
|—user-service
项目用的是阿里的nacos作为服务的注册中心,当然也是可以用erueka、zookeeper等,如需要可以自行组装。
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- 依赖链路跟踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
关键配置:
zipkin:
service:
name: ${spring.application.name}@${spring.cloud.client.ip-address}:${server.port}
sender:
type: web
sleuth:
sampler:
probability: 1
配置说明:
- zipkin.service.name:服务名称
- zipkin.sender.type:
- sletuh.sampler.probability:采样的百分比,默认的为0.1,在默认的时候偶尔在zipkin服务员界面中会采集不到数据,需要改为100%采样。
除了改上面的配置还可以用代码的形式进行更改采样的百分比,代码如下:
//100%的来采集日志,和在配置文件中配置spring.sleuth.sampler.percentage=1是一样的
@Bean
public AlwaysSampler defaultSampler(){
return new AlwaysSampler();
}
但这样每个请求都会向zipkin server发送http请求,通信效率低,造成网络延迟。
而且所用的追踪信息都在内存中保存,重启zipkin server后信息丢失
针对以上的问题的解决方法:
a 采用socket或高效率的通信方式
b 采用异步方式发送信息数据
c 在客户端和zipkin之间增加缓存类的中间件,如redis,mq等,即时zipkin server重启过程中,客户端依然可以将数据发送成功
3、启动,访问
http://127.0.0.1:18985/pay/order/do
会看到控制台输出的多了不少信息
2019-12-26 15:11:17.263 INFO [pay-service@192.168.220.1:18985,f98f2250df0a1c78,e16a043df64fde19,false] 20420 --- [io-18985-exec-1] s.c.a.AnnotationConfigApplicationContext : Refreshing SpringClientFactory-user-service: startup date [Thu Dec 26 15:11:17 CST 2019]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@39a2bb97
主要包含4部分信息:
[pay-service@192.168.220.1:18985,f98f2250df0a1c78,e16a043df64fde19,false]
这一串数据里包含四个部分
appname - 应用程序名称
traceId - 追踪系统中的唯一标识
spanId - 具体操作的唯一标识
exportable - 是否日志要导出到Zipkin,这里是false信息将不会输出到zipkin中
改进:
由于上面改为100%采样会存在一些问题,故要进行相应的改进,采用rabbitmq中间件作为媒介。
一、zipkin服务器
java -jar zipkin-server-2.19.2-exec.jar --RABBIT_ADDRESSES=localhost:5672 --RABBIT_USER=guest --RABBIT_PASSWORD=guest --RABBIT_VIRTUAL_HOST=/
二、客户端,
1、修改依赖,只需要添加rabbitmq的依赖即可,网上有人说要依赖spring-cloud-sleuth-zipkin-stream
,这个只在以前的版本是可以,但是在最新版本已经不推荐使用了。
<!-- 配置服务链路追踪 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
2、yml配置,其他项目的配置都是一样的。
spring:
rabbitmq: #配置mq消息队列
host: localhost
port: 5672
username: guest
password: guest
zipkin:
service:
name: ${spring.application.name}@${spring.cloud.client.ip-address}:${server.port}
sender:
type: rabbit
sleuth:
sampler:
probability: 1