Sleuth+Zipkin 服务链路追踪

发布于:2025-04-20 ⋅ 阅读:(36) ⋅ 点赞:(0)

微服务架构中,为了更好追踪服务之间调用,实现时间分析,性能瓶颈分析,故障排查,因此有必要搭建链路追踪。下面简单介绍下实现的过程。

一.引入依赖

<!-- 链路追踪 zipkin已经集成有sleuth,不需要再单独引入sleuth-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zipkin</artifactId>
	<version>2.2.1.RELEASE</version>
</dependency>

 如果各个微服务都需要追踪,项目中拥有comon模块,各个微服务都引入common依赖,可以将上面的依赖配置在common模块的maven配置文件中,否则各个微服务都需要引入上面的依赖。

二.在application.properties或application.yml配置sleuth和zipkin

# 配置zipkin进行服务链路追踪
spring.zipkin.base-url=http://192.168.56.10:9411/
spring.zipkin.sender.type=web
# # 关闭服务发现,否则 Spring Cloud 会把 zipkin 的 url 当做服务名称
spring.zipkin.discovery-client-enabled=false
# 设置抽样采集率为100%,默认为 0.1,即10%
spring.zipkin.sender.sampler.probability=1

完成配置,启动项目后,控制台出现类似这样的3个逗号:INFO [gulimall-product,,,]  则表示配置成功,访问项目各个节点服务,打开zipkin,就可以看到调用链路详情了。

如果引入了zipkin启动失败,提示下面的异常enableRedisKeyspaceNotificationsInitializer

则是引入的spring-boot-starter-data-redis和spring-cloud-starter-zipkin不兼容。

ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration: Invocation of init method failed; nested exception is org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException:  io.lettuce.core.tracing.BraveTracing$BraveTracer.nextSpan(BraveTracing.java:259) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at io.lettuce.core.tracing.BraveTracing$BraveTracer.nextSpan(BraveTracing.java:266) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:392) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE] at io.lettuce.core.protocol.CommandHandler.write(CommandHandler.java:353) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]

解决办法,将spring-boot-starter-data-redis中的lettuce-core剔除掉,使用jedis来操作redis:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<exclusions>
		<exclusion>
			<groupId>io.lettuce</groupId>
			<artifactId>lettuce-core</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
</dependency>

zipkin 默认是将数据存储在内存中,在生产环境上如果想实现数据持久化,可考虑将数据存储在mysql数据库,Cassandra,或Elasticsearch 中,考虑链路数据的特殊性或日后数据量庞大,存储在mysql查询缓慢,推荐存储到Elasticsearch 。

(一)Zipkin 数据持久化相关的官方文档地址如下:https://github.com/openzipkin/zipkin#storage-component。

(二)使用 Elasticsearch 作为Zipkin 的存储数据库的官方文档如下: elasticsearch-storage: https://github.com/openzipkin/zipkin/tree/master/zipkin-server#elasticsearch-storage zipkin-storage/elasticsearch https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/elasticsearch

通过 docker 的方式 docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200 openzipkin/zipkin-dependencies


网站公告

今日签到

点亮在社区的每一天
去签到