天天看点

Feign 服务调用使用 Zipkin 链路追踪

分布式微服务时代,方便了业务的快速增长和服务的稳定,但是系统出现问题后,面对同业务多服务排查起来令人头大。这时候领导就想着集成分布式追踪系统。Zipkin 是 Twitter 的一个开源项目,基于 Google Dapper 实现。可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提供了方便的 UI 组件帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。

Zipkin 服务依赖环境

Centos 7 Mysql 8

Zipkin 客户端项目版本

Springboot 2.2.5.RELEASE Springcloudalibaba 2.2.1.RELEASE

官方说明 如果服务器安装了 JDK8 以及更高的,那么 Jar 包方式启动是最快的入门方式。

可以本地下载好 Jar 然后上传服务器再执行,也可以服务器直接下载再执行

下载最新 Jar 包

服务器下载命令

Jar 服务启动

其他环境变量参数配置

属性

环境变量

描述

zipkin.collector.rabbitmq.concurrency

RABBIT_CONCURRENCY

并发消费者数量,默认为 1

zipkin.collector.rabbitmq.connection-timeout

RABBIT_CONNECTION_TIMEOUT

建立连接时的超时时间,默认为 60000 毫秒,即 1 分钟

zipkinzipkin.collector.rabbitmq.queue

RABBIT_QUEUE

从中获取 span 信息的队列,默认为 zipkin

zipkin.collector.rabbitmq.uri

RABBIT_URI

符合 RabbitMQ URI 规范 的 URI,例如 amqp://user:pass@host:10000/vhost

如果设置了 URL,则以下属性将被忽略

zipkin.collector.rabbitmq.addresses

RABBIT_ADDRESSES

用逗号分隔的 RabbitMQ 地址列表,例如 localhost:5672,localhost:5673

zipkin.collector.rabbitmq.password

RABBIT_PASSWORD

连接到 RabbitMQ 时使用的密码,默认为 guest

zipkinzipkinzipkin.collector.rabbitmq.username

RABBIT_USER

连接到 RabbitMQ 时使用的用户名,默认为 guest

zipkin.collector.rabbitmq.virtual-host

RABBIT_VIRTUAL_HOST

使用的 RabbitMQ virtual host,默认为 /

zipkin.collector.rabbitmq.use-ssl

RABBIT_USE_SSL

设置为 true 则用 SSL 的方式与 RabbitMQ 建立链接

注意: 存储介质由默认的内存改为 Mysql,需要先建数据库 Zipkin,然后导入 zipkin 的默认库,建完库后执行如下内容即可

项目集成使用 2 模块来说明,模块名为 consumer 和 provider。主要以 Rabbit 连接方式来介绍,也会注释说下 Web 的方式

Feign 服务调用使用 Zipkin 链路追踪

consumer

provider

分别启动 consumer、provider,然后浏览器调用 consumer 的测试接口

来看下上面的日志信息,==[consumer,dd07a4eaac415456,dd07a4eaac415456,true]== ,含义为[项目名, TraceId(相同视为一请求), SpanId(每个服务节点唯一), 是否被 Zipkin 收录]

这里使用的是 Springboot 自带的日志框架 Logback,如果使用 Log4j2,则需要修改 Pattern 添加链路信息,参考如下内容。

浏览器地址栏访问

Feign 服务调用使用 Zipkin 链路追踪
Feign 服务调用使用 Zipkin 链路追踪

可以看出来一个请求链路顺序为 consumer->provider,还可以看到调用花费的时间,到此就算配置成功了。

spring-cloud-alibaba-seata 2.2.0.RELEASE seata-spring-boot-starter 1.4.0

如果微服务中使用分布式事务 Seata,那集成 Zipkin 后, 就会出现问题服务调用服务失败的问题如下

主要原因是 pom 引入的 Zipkin 包含 Sleuth,而 Sleuth 的配置类 TraceFeignClientAutoConfiguration 和 Seata 的配置类 SeataFeignClientAutoConfiguration 都创建了 Bean:feignHystrixBuilder,冲突导致上面的错误。

每个服务工程配置 Seata 拦截器类 SetSeataInterceptor ,以拦截器的方式传递 XID

启动类排除 SeataFeignClientAutoConfiguration.class

记录如有不对烦请指出,先行感谢

继续阅读