链路追踪 trace:Spring Cloud Sleuth集成Zipkin用MQ通信

举报
李路的路 发表于 2021/08/10 22:03:45 2021/08/10
【摘要】 链路追踪是分布式中一个排查问题的重要方式,Spring Cloud中的多个组件,利用这些组件构建一个微服务系统。本系列文章将会介绍Spring Cloud提供的链路监控组件Spring Cloud Sleuth。Spring Cloud Sleuth 提供了分布式链路追踪的解决方案,用以追踪微服务系统中的某一次的请求完整过程。针对上篇文章所提出的问题,相应的改进措施是:首先,客户端数据的发送...

链路追踪是分布式中一个排查问题的重要方式,Spring Cloud中的多个组件,利用这些组件构建一个微服务系统。本系列文章将会介绍Spring Cloud提供的链路监控组件Spring Cloud Sleuth。Spring Cloud Sleuth 提供了分布式链路追踪的解决方案,用以追踪微服务系统中的某一次的请求完整过程。

针对上篇文章所提出的问题,相应的改进措施是:

首先,客户端数据的发送尽量减少业务线程的时间消耗,采用异步等方式发送收集信息;
其次,客户端与zipkin-server之间增加缓存类的中间件,例如redis、MQ等,在zipkin-server程序挂掉或重启过程中,客户端依旧可以正常的发送自己收集的信息。

集成Zipkin用MQ通信

在上文中,我们使用http方式进行通信,数据持久化到内存中的服务调用链路追踪实现。在整合Zipkin时,还可以通过消息中间件来对日志信息进行异步收集。

本文可以做两点改动,首先是数据从保存在内存中改为持久化到数据库;其次是将http通信改为mq异步方式通信,通过Spring Cloud Stream,让zipkin客户端将信息输出到MQ中,同时Zipkin Server从MQ中异步地消费链路调用信息。

Zipkin Server

我们新建一个zipkin-stream-server的项目。所需要的依赖如下:

    <dependencies>
        <!--stream jars-->
        <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>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    </dependencies>

这里引入了zipkin-stream和基于jdbc存储的依赖。

配置文件将需要配置stream 和 jdbc存储的相关属性字段。

server:
  port: 9411

spring:
  application:
      name: microservice-zipkin-stream-server
  rabbitmq:
    host: ${RABBIT_ADDR:192.168.1.204}
    port: ${RABBIT_PORT:5672}
    username: guest
    password: guest
  sleuth:
    enabled: false
  datasource:
    url:  jdbc:mysql://loclahost:3306/zipkin?autoReconnect=true&useSSL=false
    continue-on-error: false
    initialize: true
    username: user
    password: root
    schema[0]: classpath:/zipkin.sql

zipkin:
  storage:
    type: mysql

在如上的配置中,stream使用了rabbitmq进行异步通信;指定了存储的方式为mysql,还用到了zipkin 数据库的初始化sql语句,读者可以参见本书的配套代码。

@SpringBootApplication
@EnableZipkinStreamServer
public class ChapterZipkinStreamServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(ChapterZipkinStreamServerApplication.class, args);
	}
}

zipkin-stream的入口类中,使用的是@EnableZipkinStreamServer,该注解的实现如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableBinding({SleuthSink.class})
@EnableZipkinServer
@Import({ZipkinMessageListener.class})
public @interface EnableZipkinStreamServer {
}

看过前面Spring Cloud Stream文章的读者应该很熟悉,这里进行了SleuthSink的默认配置,并且引入了ZipkinMessageListener消息消费的配置类。当然,该注解包含了使用http通信方式的@EnableZipkinServer注解。

如上完成了Zipkin Stream Server的实现。下面将会改进两个客户端服务的配置,使得客户端服务异步发送追踪日志信息。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。