Zipkin实现分布式跟踪

一、Zipkin简介

Zipkin是Sleuth服务跟踪工具的一个扩展。是基于Sleuth实现的可视化服务跟踪数据处理工具。
执行原理
在这里插入图片描述
事件类型:
cs - client send 客户端发起请求
cr - client receive 客户端接收响应
ss - server send 服务端发送应答
sr - server receive 服务端接收请求

二、Zipkin实现过程

使用Zipkin来实现收集展示服务跟踪数据时,在默认情况下,Zipkin是使用内存作为跟踪数据存储的,而微服务应用系统中,跟踪数据是非常庞大的,使用内存存储明细不合适。Zipkin提供了若干种数据持久方式,在这里我们使用MySQL作为数据存储。
在整体微服务应用中,可以在微服务上使用Sleuth来收集跟踪数据,并直接发送给Zipkin,这种方式传输效率高,但是在Zipkin服务端宕机的情况下,有跟踪数据丢失的可能,那么使用RabbitMQ作为传输跟踪数据的中间容器就很有必要了。微服务上的Sleuth收集跟踪数据,并封装为消息发送到RabbitMQ,Zipkin服务端监听RabbitMQ并消费消息实现跟踪数据收集、存储、展示等功能,即使Zipkin服务端宕机,跟踪数据也会在RabbitMQ中存储,不会有数据丢失的可能,等Zipkin服务端重新恢复后,可以继续消费RabbitMQ中的跟踪数据消息,并提供后续处理。
结构图如下:
在这里插入图片描述

  1. 提供Zipkin的服务端应用

访问Zipkin提供的WEB UI时,推荐使用IP访问,不要使用localhost域名访问。因为Zipkin在使用localhost访问时,可以提供WEB UI,但是在查询服务跟踪数据的时候,可能会有查询不到的情况。
Zipkin技术在结合RabbitMQ和MySQL架构服务端时,需要的依赖如下:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 提供Zipkin视图 -->
		<dependency>
			<groupId>io.zipkin.java</groupId>
			<artifactId>zipkin-autoconfigure-ui</artifactId>
		</dependency>
		<!-- Sleuth启动器 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-sleuth</artifactId>
		</dependency>
		<!-- spring-cloud-stream中的RabbitMQ依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
		</dependency>
		<!-- Sleuth配合Zipkin实现RabbitMQ访问的依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
		</dependency>
		<!-- Zipkin使用数据库作为数据存储需要提供下述两个依赖。
			数据库访问的持久化操作由Zipkin组件实现,不需要编码
		 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
  1. 添加配置
spring.application.name=e-book-zipkin-server
# 端口,Zipkin推荐使用端口9411。不是必要的
server.port=9411

# RabbitMQ相关配置
spring.rabbitmq.host=192.168.1.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=123456

# 关闭Sleuth,这里是使用Zipkin实现服务端应用,不需要Sleuth介入
spring.sleuth.enabled=false
# 定义Zipkin的存储为MySQL,Zipkin也提供了其他的存储方式,如:ElasticSearch
zipkin.storage.type=mysql

# 提供Zipkin需要的数据库建表脚本,此脚本由Zipkin提供,具体jar包为:zipkin-storage-mysql-1.28.0.jar
spring.datasource.schema=classpath:/mysql.sql

# 配置数据库连接池,必须提供创建database。Zipkin可以自动建表,不能建库。
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.initialize=true
spring.datasrouce.continueOnError=true
  1. 添加启动类
/**
 * Zipkin服务端可以不在Eureka注册中心中注册服务,当然注册也没有问题。
 * @EnableZipkinStreamServer - 启动时初始化Zipkin服务端应用,并提供Stream相关支持。
 *  Stream相关支持包括:RabbitMQ访问和数据库访问。
 */
@EnableZipkinStreamServer
@SpringBootApplication
public class ZipkinApplication {
	public static void main(String[] args) {
		SpringApplication.run(ZipkinApplication.class, args);
	}
}
  1. 修改服务应用

使用Sleuth采集跟踪数据的服务应用不需要在代码层面做任何改动,Sleuth是一个高度封装的应用工具,提供依赖资源和配置信息即可。
在所有需要使用Sleuth采集跟踪数据的服务应用统一修改下述内容。
增加下述依赖:

	<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-sleuth</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-sleuth-stream</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
		</dependency>
  1. 添加配置文件
# 定义Sleuth采样比例,默认为0.1,即采样10%的跟踪数据,上线时可使用默认值,毕竟跟踪数据采样10%已经足够。
spring.sleuth.sampler.percentage=1
# RabbitMQ相关配置
spring.rabbitmq.host=192.168.1.122
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=123456
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值