spring-cloud-sleuth+zipkin追踪服务实现(二)

简介: 在上一节《spring-cloud-sleuth+zipkin追踪服务实现(一)》中,我们使用zipkin-server、provider、consumer三个程序实现了使用http方式进行通信,数据持久化到数据库中的服务调用链路追踪实现。

在上一节《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的消息队列监听器。
screenshot
以方便接收从消息客户端收集发过来的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功能已经生效了。
screenshot
我们多次访问consumer的地址可以看到日志中,请求的耗时时间不会再次出现突然耗时特长的情况。

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

然后我们将zipkin-server程序想关闭,然后再多次访问consumer的地址,之后,我们重启zipkin-server程序,启动成功后访问UI界面
screenshot
很快看到Span Name选项有数据可以选择了,同时数据库中的记录条数也不再是之前的0条了
screenshot

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

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

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

菜鸟学文,望大侠指正。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
Web App开发 监控 Java
|
3月前
|
Dubbo Java 应用服务中间件
Spring Boot Dubbo 构建分布式服务
Spring Boot Dubbo 构建分布式服务
47 0
|
6月前
|
网络协议 安全 前端开发
springcloud服务连接超时
springcloud服务连接超时的原因竟然是linux的参数设置原因
|
6月前
|
存储 SpringCloudAlibaba Nacos
SpringCloud Alibaba核心组件Nacos【服务多级存储模型&配置集群】第2章(上)
SpringCloud Alibaba核心组件Nacos【服务多级存储模型&配置集群】第2章
SpringCloud Alibaba核心组件Nacos【服务多级存储模型&配置集群】第2章(上)
|
4月前
|
负载均衡 Cloud Native Java
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
329 0
|
6月前
|
Java Nacos Spring
Nacos spring-cloud 版本没找到共享配置文件的说明,Nacos服务中共享,并且可以被多个应用获取和使用。这个在官网哪里有说明啊
Nacos spring-cloud 版本没找到共享配置文件的说明,Nacos服务中共享,并且可以被多个应用获取和使用。这个在官网哪里有说明啊
35 1
|
30天前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
80 0
|
30天前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
773 0
|
30天前
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(三)Eureka服务注册中心
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(三)Eureka服务注册中心
44 1
|
1月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️