原文地址:https://blog.csdn.net/z8414/article/details/78600646

Zipkin是一个链路跟踪工具,可以用来监控微服务集群中调用链路的通畅情况

前提:SpringCloud解决方案下,存在两个子项目,并在一个项目中使用RestTemplate或者Feign等方法调用另外一个项目中的接口

我这里有三个子项目分别为:gateway,user,blog;其中gateway的hello接口通过RestTemplate调用了user的hello接口,user的hello接口通过Feign调用blog的hi接口

创建子项目zipkin,pom.xml中加入依赖:

<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

启动类:

@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {

public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class, args);
}
}
在gateway和user项目的pom.xml中分配加入zipkin的依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
在gateway和user项目的application.yml中分配加入zipkin地址配置:

spring:
zipkin:
base-url: http://localhost:9998
启动zipkin项目,浏览器输入:http://localhost:9998,这里9998是我配置文件的端口号

分别在user项目启动和停止的情况下,在浏览器中调用gateway的hello接口

蓝色的表示在user项目启动的情况下通过gateway成功调用了user的接口,红色的表示user停止的情况下,gateway不能成功调用

user接口。点击红色条目,可以看到调用情况图

点击红色栏目,可以看到错误信息

Dependencies菜单下可以看到项目依赖关系:

默认的采样比率为0.1,不能看到所有请求数据,可以在每个客户端的application.yml中加入下面的配置,更改采样比率为1,就能看到所有的请求数据了,但是这样会增加接口调用延迟

spring:
sleuth:
sampler:
percentage: 1 #zipkin采样率,默认为0.1,改为1后全采样,但是会降低接口调用效率

通过http.host过滤条件搜索出所有从gateway到user的调用请求,也可以用http.path=/user/hello/zyc过滤某个具体的请求

(改造一)通过数据库存储数据,参考了这篇文章https://www.cnblogs.com/shunyang/p/7011303.html

zipkin项目的pom.xml中加入依赖:

<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
HikariCP连接池可选,如果不用连接池去掉这个依赖,并把application.yml中的datasource.type属性去掉

application.yml中加入配置:
spring:
application:
name: zipkin
sleuth:
enabled: false
datasource:
name: zipkin
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.11.11:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: 123456
schema[0]: classpath:/zipkin.sql
initialize: true
continue-on-error: true
zipkin:
storage:
type: mysql
resources目录下放入zipkin.sql,此文件最新地址https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/src/main/resources/mysql.sql
然后在数据库中创建一个名为zipkin的数据库,然后启动zipkin项目,这时会根据zipkin.sql脚本创建数据库;再启动两个存在调用关系的项目gateway和user,调用gateway的接口,然后就会发现数据库的表中有数据库了。zipkin页面上也可以显示数据,重启zipkin后数据也不会消失。

(改造二)通过kafka队列来异步传输数据

首先搭建一个kafka的集群,参考我的另外一篇文章kafka集群搭建

在改造一的基础上,在zipkin、gateway、user项目中加入下列依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<!--也可以使用spring-cloud-stream-binder-kafka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
原来zipkin中的zipkin-server、gateway和user中的spring-cloud-starter-zipkin依赖可以移除了
在三个项目的yml配置文件中spring节点下加入kafka配置

spring:
cloud:
stream:
kafka:
binder:
brokers: 192.168.1.2,192.168.1.3 #ip地址根据实际kafka集群地址
zkNodes: 192.168.1.2,192.168.1.3
配置完成后启动gateway和user,先不启动zipkin,然后调用gateway的hello接口,然后在启动zipkin,发现马上就有调用记录了,而且数据库也有数据了,说明通过kafka传输数据成功了。

性能分析:

这里使用jmeter工具进行测试,使用了10个线程循环10次,配置如下:

(1)不使用zipkin的情况

这里jmeter平均请求时间391ms

(2)使用zipkin,不使用数据库和kafka中间件的情况:

采样率为0.1的时候:

这里总共100次请求,在采样率为0.1的情况下记录了10次,jmeter平均请求时间为371ms

采样率为1的时候:

这里总共100次请求,在采样率为1的情况下记录了100次,jmeter平均请求时间为427ms

(3)使用zipkin,使用mysql数据库存储数据的情况:

采样率为0.1的时候:

这里总共100次请求,在采样率为0.1的情况下记录了10次,jmeter平均请求时间为357ms

采样率为1的时候:

这里发现高采样率的情况下,请求时间波动变大,jmeter平均请求时间为412ms。

(4)使用zipkin,使用mysql存储数据,使用kafka传输数据的情况:

采样率为0.1的情况:

这里总共100次请求,在采样率为0.1的情况下记录了10次,jmeter平均请求时间为390ms

采样率为1的情况:

这里总共100次请求,在采样率为1的情况下记录了100次,jmeter平均请求时间为392ms

通过上述分析得出结论:

① 在内存存储数据时不适合使用高采样比率;

② 通过数据库存储时可以用高采样比率,对服务本身影响不大,但是如果zipkin服务端down掉,期间就不能存储数据了

③ 通过数据库和kafka等中间件异步传输数据基本对服务无影响,而且就算zipkin服务端down掉,重启后依然会从kafka中取出数据存储在数据库中,不会有数据丢失

另,在网上看到有说mysql保存链路调用信息,数据量大后会卡死,推荐使用elasticsearch保存数据,具体没有试过。

关于zipkin源码分析,这个博客写的不错https://my.oschina.net/mozhu/blog
---------------------
作者:Juoon
来源:CSDN
原文:https://blog.csdn.net/z8414/article/details/78600646
版权声明:本文为博主原创文章,转载请附上博文链接!

SpringCloud Zipkin的更多相关文章

  1. 分布式链路监控与追踪系统Zipkin

    1.分布式链路监控与追踪产生背景2.SpringCloud Sleuth + Zipkin3.分布式服务追踪实现原理4.搭建Zipkin服务追踪系统5.搭建Zipkin集成RabbitMQ异步传输6. ...

  2. 最新java学习路线:含阶段性java视频教程完整版

    最新java学习路线:带阶段性java视频教程版本 第一阶段:Java基础 学习目标: 掌握基本语法.面向对象.常用类.正则.集合.Io流.多线程.Nio.网络编程.JDK新特性.函数式编程 知识点细 ...

  3. Java web现在流行用什么框架?

    Java是开源的,框架很多,这些框架都能解决特定的问题,提高开发效率.简化我们的代码复杂度,现在除了很多大家通用的一些主流框架外,很多公司针对自己的业务会自定义一些公司内部的框架,当然作为学习者我们首 ...

  4. 分布式服务追踪与调用链 Zikpin

    分布式服务追踪与调用链系统产生的背景 在为服务中,如果服务与服务之间的依赖关系非常复杂,如果某个服务出现了一些问题,很难追查到原因,特别是服务与服务之间调用的时候. 在微服务系统中,随着业务的发展,系 ...

  5. 2019年Java Web最流行的开发框架总结

    ORM型框架:对数据进行持久化操作,例如:基于SQL的MyBatis框架和Hibernate框架. MVC型框架:从逻辑上分为视图层,控制层,模型层,各层各司其职,之间是相互调用的关系,而不是相互依赖 ...

  6. SpringCloud学习之sleuth&zipkin

    一.调用链跟踪的必要性 首先我们简单来看一下下单到支付的过程,别的不多说,在业务复杂的时候往往服务会一层接一层的调用,当某一服务环节出现响应缓慢时会影响整个服务的响应速度,由于业务调用层次很“深”,那 ...

  7. 每天学点SpringCloud(十四):Zipkin使用SpringCloud Stream以及Elasticsearch

    在前面的文章中,我们已经成功的使用Zipkin收集了项目的调用链日志.但是呢,由于我们收集链路信息时采用的是http请求方式收集的,而且链路信息没有进行保存,ZipkinServer一旦重启后就会所有 ...

  8. 每天学点SpringCloud(十二):Zipkin全链路监控

    Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件,使用它我们可以得知每一个请求所经过的节点以及耗时等信息,并且它对代码无任何侵入,我们先来看一下Zipkin给我们提供的UI界面都 ...

  9. springcloud 分布式服务跟踪sleuth+zipkin

    原文:https://www.jianshu.com/p/6ef0b76b9c26 分布式服务跟踪需求 随着分布式服务越来越多,调用关系越来越复杂,组合接口越来越多,要进行分布式服务跟踪监控的需求也越 ...

随机推荐

  1. CF140CNew Year Snowmen

    CF140C 题目大意:堆雪人,需要三个大小不同的雪球,现有\(n\)个给定大小的雪球,问最多堆多少个雪人 一个很明显的思路是把每种雪球出现的个数记录下来,然后直接扔到大根堆里面,每次选择剩下出现次数 ...

  2. 空气质量管理系统ssm(mybatis+spring+springMVC)框架+前后端分离

    1.目录结构: 2.需要注意的地方 2.1在WEB-INFO下新建 2.1.1 springMVC-servlet.xml <?xml version="1.0" encod ...

  3. 选择合适的最短路--hdu3499

    [题目链接](http://acm.hdu.edu.cn/showproblem.php?pid=3499) 刚看见题目,哦?不就是个最短路么,来,跑一下dijkstra记录最长路除个二就完事了 ,但 ...

  4. 洛谷$P4318$ 完全平方数 容斥+二分

    正解:容斥/杜教筛+二分 解题报告: 传送门$QwQ$ 首先一看这数据范围显然是考虑二分这个数然后$check$就计算小于等于它的不是讨厌数的个数嘛. 于是考虑怎么算讨厌数的个数? 看到这个讨厌数说, ...

  5. $HDU1848\ Fibonacci\ again\ and\ again$ 博弈论

    正解:博弈论 解题报告: 传送门! 首先按照套路显然是考虑先预处理出所有数的$SG$函数值然后全局的$SG$就是$SG(n)$^$SG(m)$^$SG(p)$,这儿应该麻油问题$QwQ$? 然后就考虑 ...

  6. $Loj10155$ 数字转换(求树的最长链) 树形$DP$

    loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...

  7. $ZOJ\ 2432\ Greatest\ Common\ Increasing\ Subsequence$

    传送门 $Description$ 求两个序列的最长公共上升子序列 $Solution$ $f[i][j]$表示$a$序列匹配到$i$和$b$序列匹配到$j$的最长上升序列的长度,这里并不要求$a[i ...

  8. 聊聊Python中的描述符

    描述符是实现描述符协议方法的Python对象,当将其作为其他对象的属性进行访问时,该描述符使您能够创建具有特殊行为的对象. 通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法所 ...

  9. OAuth2.0概念以及实现思路简介

    一.什么是OAuth? OAuth是一个授权规范,可以使A应用在受限的情况下访问B应用中用户的资源(前提是经过了该用户的授权,而A应用并不需要也无法知道用户在B应用中的账号和密码),资源通常以REST ...

  10. MySQL保存 emoji 表情(微信昵称表情)

    问题分析 在微信开发过程中,总是会遇到带有emoji表情昵称的微信用户无法自动登录的问题. 后台代码抛出类似下面的异常信息. java.sql.SQLException: Incorrect stri ...