在上一节《spring-cloud-sleuth+zipkin追踪服务实现(一)》中,我们使用zipkin-server、provider、consumer三个程序实现了使用http方式进行通信,数据持久化到数据库中的服务调用链路追踪实现。针对其中存在的影响性能和可能丢失数据的缺陷,在这一节我们使用spring-cloud的为我们提供的实现的方式来测试这种情况。

我们还是使用之前上一节中的三个程序做修改,方便大家看到对比不同点。

一、zipkin-server

要将http方式改为通过MQ通信,我们要将依赖的原来依赖的io.zipkin.java:zipkin-server换成spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit,并且移除zipkin-autoconfigure-storage-mysql,因为spring-cloud-sleuth-zipkin-stream会自动为我们引入,全部maven依赖如下:

        <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--zipkin依赖-->
<!--此依赖会自动引入spring-cloud-sleuth-stream并且引入zipkin的依赖包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<scope>runtime</scope>
</dependency>
<!--保存到数据库需要如下依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>

添加以上maven依赖后,我们将启动类ZipkinServer中@EnableZipkinServer注解替换成@EnableZipkinStreamServer

@SpringBootApplication
@EnableDiscoveryClient //注册到eureka
@EnableZipkinStreamServer //使用Stream方式启动ZipkinServer
public class ZipkinServer {
public static void main(String[] args) {
SpringApplication.run(ZipkinServer.class, args);
}
}

点击@EnableZipkinStreamServer注解的源码我们可以看到它也引入了@EnableZipkinServer注解,同时还创建了一个rabbit-mq的消息队列监听器。

以方便接收从消息客户端收集发过来的mq消息。由于使用了消息中间件rabbit-mq,所以我们还需要在配置文件中配置我们的MQ连接配置

#rabbitmq配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

为了避免http通信的干扰,我们将原来的监听端口有9411更改为9412,启动程序,未报错且能够看到rabbit连接日志,说明程序启动成功。

二、provider和consumer
与上一节中的配置一样,客户端的配置也非常简单,maven依赖只需要将原来的spring-cloud-starter-zipkin替换为如下两个依赖即可

        <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

此外,在配置文件中也加上连接MQ的配置

#rabbitmq配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在第一节中,客户端连接zipkin-server是使用的配置
spring.zipkin.base-url=http://127.0.0.1:9411, 由于不再使用这种方式,我们将它取消掉。同时,我们将数据库中的数据也清空。

我们如上一节《spring-cloud-sleuth+zipkin追踪服务实现(一)》中一样,访问consumer的外部http地址("http://127.0.0.1:10001/add/被加数/加数") 。然后我们访问zipkin-server的地址“http://127.0.0.1:9412/” ,我们可以看到如下的效果,说明rabbit-mq方式通信的sleuth功能已经生效了。

我们多次访问consumer的地址可以看到日志中,请求的耗时时间不会再次出现突然耗时特长的情况。

为了体验MQ通信给我们带来的数据不丢失的特点,我们将数据库中的数据清空,然后刷新zipkin-server的界面,可以看到不再有数据

然后我们将zipkin-server程序想关闭,然后再多次访问consumer的地址,之后,我们重启zipkin-server程序,启动成功后访问UI界面

很快看到Span Name选项有数据可以选择了,同时数据库中的记录条数也不再是之前的0条了

如此说明我们的zipkin重启后,从MQ中成功获取出了在关闭这段时间里provider和consumer产生的信息数据。这样我们使用spring-cloud-sleuth-stream+zipkin方式的rest服务调用追踪功能就OK了。

注意:
测试时请将consumer访问地址中的“被加数”和“加数”替换为两个整数。

**参考文档:
**
https://github.com/spring-cloud/spring-cloud-sleuth

Spring Cloud Sleuth Zipkin - (2)的更多相关文章

  1. Spring Cloud Alibaba学习笔记(23) - 调用链监控工具Spring Cloud Sleuth + Zipkin

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求陷入性能瓶颈或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何 ...

  2. 分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程!

    大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第九篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...

  3. Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin

    前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...

  4. Spring Cloud Sleuth+ZipKin+ELK服务链路追踪(七)

    序言 sleuth是spring cloud的分布式跟踪工具,主要记录链路调用数据,本身只支持内存存储,在业务量大的场景下,为拉提升系统性能也可通过http传输数据,也可换做rabbit或者kafka ...

  5. Spring Cloud Sleuth + Zipkin 链路监控

    原文:https://blog.csdn.net/hubo_88/article/details/80878632 在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变 ...

  6. Spring Cloud Sleuth Zipkin - (1)

    最近在学习spring cloud构建微服务,很多大牛都提供很多入门的例子帮助我们学习,对于我们这种英语不好的码农来说,效率着实提高不少.这两天学习到追踪微服务rest服务调用链路的问题,接触到zip ...

  7. 全链路spring cloud sleuth+zipkin

    http://blog.csdn.net/qq_15138455/article/details/72956232 版权声明:@入江之鲸 一.About ZipKin please google 二. ...

  8. springcloud --- spring cloud sleuth和zipkin日志管理(spring boot 2.18)

    前言 在spring cloud分布式架构中,系统被拆分成了许多个服务单元,业务复杂性提高.如果出现了异常情况,很难定位到错误位置,所以需要实现分布式链路追踪,跟进一个请求有哪些服务参与,参与的顺序如 ...

  9. spring boot 2.0.3+spring cloud (Finchley)7、服务链路追踪Spring Cloud Sleuth

    参考:Spring Cloud(十二):分布式链路跟踪 Sleuth 与 Zipkin[Finchley 版] Spring Cloud Sleuth 是Spring Cloud的一个组件,主要功能是 ...

随机推荐

  1. ganglia安装 by frank

    作者是frank. 1.安装epelrpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm2. ...

  2. flowable 中task的相关操作

    1 获取任务列表 1)获取候选人的任务列表 TaskService taskService = processEngine.getTaskService(); List<Task> tas ...

  3. 微信小程序 confirm(删除提示)提示框,询问框,小程序操作成功提示后跳转

    微信小程序删除处理 没有 confrim 那怎么实现这个效果呢 可以使用小程序里的模态框 代码: wx.showModal({ title: '提示', content: '确定要删除吗?', suc ...

  4. Atitit 转移特效attilax总结

    Atitit 转移特效attilax总结 总结一般从按钮,转移到大点的方框上回比较好看点.. <!--jq ui--> <style type="text/css" ...

  5. css3实现画对号动画

    目标:实现对号动画,慢慢画出来的感觉: 原理:外层div的背景是一个对号图片,用一个div做遮罩,让遮罩div层从左到右做运动一次即可实现动画,需要注意的是遮罩div的初始位置应该在外层div的外面: ...

  6. RSA公钥加密,私钥解密的程序示例

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;u ...

  7. 机器学习 之 SVM VC维度、样本数目与经验风险最小化的关系

    VC维在有限的训练样本情况下,当样本数 n 固定时.此时学习机器的 VC 维越高学习机器的复杂性越高. VC 维反映了函数集的学习能力,VC 维越大则学习机器越复杂(容量越大). 所谓的结构风险最小化 ...

  8. HTML5学习笔记(十七):访问器和class关键字

    访问器 在ECMAScript5中,提供了Object.defineProperty的方法,我们可以通过该方法来控制属性的更多权限. 属性类型 我们先看一段定义属性的代码: var person = ...

  9. spark-architecture

    https://0x0fff.com/spark-architecture-shuffle/ https://0x0fff.com/spark-memory-management/ https://0 ...

  10. [Windows Azure] Windows Azure Identity

    Windows Azure Identity Managing identity is just as important in the public cloud is it is on premis ...