链路追踪 trace:Spring Cloud Sleuth集成Zipkin用MQ通信
链路追踪是分布式中一个排查问题的重要方式,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的实现。下面将会改进两个客户端服务的配置,使得客户端服务异步发送追踪日志信息。
- 点赞
- 收藏
- 关注作者
评论(0)