热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

这也太简单了!轻松操作Feign服务调用使用Zipkin链路追踪!

0、介绍分布式微服务时代,方便了业务的快速增长和服务的稳定,但是系统出现问题后,面对同业务多服务排查起来令人头大。这时候领导就想着集成分布式追踪系统。Zipkin是T

0、介绍

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

1、环境准备

Zipkin 服务依赖环境

Centos 7
Mysql 8

Zipkin 客户端项目版本

Springboot 2.2.5.RELEASE
Springcloudalibaba 2.2.1.RELEASE

2、Zipkin 服务安装

2.1、Docker 安装

#拉取镜像
docker pull openzipkin/zipkin

#1、Web 连接方式启动 
docker run --name zipkin-web -d -p 9411:9411 openzipkin/zipkin

#2、Rabbit 连接方式启动 注意 RABBIT_ADDRESSES 的 Ip 要实际 Ip 
docker run -d --name zipkin-rabbitmq -p 9411:9411 -e RABBIT_ADDRESSES=192.168.1.105:5672 -e RABBIT_USER=guest -e RABBIT_PASSWORD=guest openzipkin/zipkin

#3、Rabbit 连接方式启动,存储介质由内存改为 Mysql (暂时有问题)
 docker run -d --name zipkin-rabbit-mysql -p 9411:9411 -e RABBIT_ADDRESSES=192.168.1.105:5672 -e RABBIT_USER=guest -e RABBIT_PASSWORD=guest -e STORAGE_TYPE=mysql -e MYSQL_HOST=192.168.1.105 -e MYSQL_TCP_PORT=13306 -e MYSQL_USER=root -e MYSQL_PASS=123456 -e MYSQL_DB=zipkin openzipkin/zipkin

2.2、Jar 安装

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

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

  1. 下载最新 Jar 包,地址
  2. 服务器下载命令
curl -sSL https://zipkin.io/quickstart.sh | bash -s

Jar 服务启动

#1、Web 连接方式启动  
java -jar zipkin.jar

#2、Rabbit 连接方式启动 
java -jar zipkin-server-2.23.1-exec.jar --zipkin.collector.rabbitmq.addresses=localhost
#后面的 --zipkin.collector.rabbitmq.addresses=localhost 就是 RabbitMQ 的配置,这是默认的,如果要自己指定的用户名和密码可以参考下面的启动命令:
nohup java -jar zipkin-server-2.23.1-exec.jar > zipkin.log --zipkin.collector.rabbitmq.addresses=localhost:5672 --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest 2>&1 &

#3、Rabbit 连接方式启动,修改存储介质,默认为内存,现在改为 Mysql,也可以使用 Elasticsearch 持久化
nohup java -jar zipkin-server-2.23.1-exec.jar > zipkin.log 
       --zipkin.collector.rabbitmq.addresses=localhost:5672 
       --zipkin.collector.rabbitmq.username=guest 
       --zipkin.collector.rabbitmq.password=guest  
       --zipkin.storage.type=mysql 
       --zipkin.storage.mysql.host=localhost 
       --zipkin.storage.mysql.port=3306 
       --zipkin.storage.mysql.username=root 
       --zipkin.storage.mysql.password=root 
       --zipkin.storage.mysql.db=zipkin 
       2>&1 &

其他环境变量参数配置

属性环境变量描述zipkin.collector.rabbitmq.concurrencyRABBIT_CONCURRENCY并发消费者数量,默认为 1zipkin.collector.rabbitmq.connection-timeoutRABBIT_CONNECTION_TIMEOUT建立连接时的超时时间,默认为 60000 毫秒,即 1 分钟zipkinzipkin.collector.rabbitmq.queueRABBIT_QUEUE从中获取 span 信息的队列,默认为 zipkinzipkin.collector.rabbitmq.uriRABBIT_URI符合 RabbitMQ URI 规范 的 URI,例如 amqp://user:pass@host:10000/vhost

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

属性环境变量描述zipkin.collector.rabbitmq.addressesRABBIT_ADDRESSES用逗号分隔的 RabbitMQ 地址列表,例如 localhost:5672,localhost:5673zipkin.collector.rabbitmq.passwordRABBIT_PASSWORD连接到 RabbitMQ 时使用的密码,默认为 guestzipkinzipkinzipkin.collector.rabbitmq.usernameRABBIT_USER连接到 RabbitMQ 时使用的用户名,默认为 guestzipkin.collector.rabbitmq.virtual-hostRABBIT_VIRTUAL_HOST使用的 RabbitMQ virtual host,默认为 /zipkin.collector.rabbitmq.use-sslRABBIT_USE_SSL设置为 true 则用 SSL 的方式与 RabbitMQ 建立链接摘抄自 地址

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

https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

3、项目集成 zipkin

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

3.1、模块工程分别引入 pom


org.springframework.cloudspring-cloud-starter-zipkin2.2.6.RELEASEorg.springframework.bootspring-boot-starter-amqp
这也太简单了!轻松操作Feign 服务调用使用 Zipkin 链路追踪!
image.png

3.2、application.yml 添加配置

consumer

spring:
  zipkin:
#    base-url: http://192.168.1.105:9411 #Web 连接方式使用
    service:
      name: consumer
    sender:
#      type: web #Web 连接方式使用
      type: rabbit # 还有 activemq、kafka
  sleuth:
    sampler:
      probability: 1 #跟踪信息收集采样比例,默认 0.1,为 1 即 100%,收集所有 注意之前的版本是 percentage 新版本中更换为 probability
#      rate: 50 # 每秒速率,即每秒最多能跟踪的请求,rate 优先

  #Sleuth 使用 Rabbitmq 来向 Zipkin 发送数据
  rabbitmq:
    host: 192.168.1.105
    port: 5672
    username: guest
    password: guest

provider

spring:
  zipkin:
#    base-url: http://192.168.1.105:9411 #Web 连接方式使用
    service:
      name: provider
    sender:
#      type: web #Web 连接方式使用
      type: rabbit # 还有 activemq、kafka
  sleuth:
    sampler:
      probability: 1 #跟踪信息收集采样比例,默认 0.1,为 1 即 100%,收集所有 注意之前的版本是 percentage 新版本中更换为 probability
#      rate: 50 # 每秒速率,即每秒最多能跟踪的请求,rate 优先

  #Sleuth 使用 Rabbitmq 来向 Zipkin 发送数据
  rabbitmq:
    host: 192.168.1.105
    port: 5672
    username: guest
    password: guest

4、测试

4.1、启动服务

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

4.2、看日志

#consumer
2021-01-03 13:18:48.647  INFO [consumer,dd07a4eaac415456,dd07a4eaac415456,true] 6556 --- [nio-8081-exec-8] cn.songo.controller.ConsumerController   : consumer111>>>>>>:port:8081,age:25

#provider
2021-01-03 13:18:48.652  INFO [provider,dd07a4eaac415456,75c232c4616558ce,true] 596 --- [io-18080-exec-6] cn.songo.controller.ProviderController   : send---->age:261,port:18080

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

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

%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] [%X{X-B3-TraceId},%X{X-B3-ParentSpanId},%X{X-B3-SpanId},%X{X-Span-Export}] - %msg%n

4.3、Zipkin UI 查看

浏览器地址栏访问

这也太简单了!轻松操作Feign 服务调用使用 Zipkin 链路追踪!
image.png
这也太简单了!轻松操作Feign 服务调用使用 Zipkin 链路追踪!
image.png

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

5、与 Seata 集成的冲突问题

5.1、问题详情

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

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

com.netflix.client.ClientException: Load balancer does not have available server for client:ip

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

5.2、问题解决

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

import com.bpmaxx.common.utils.StringUtils;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.stereotype.Component;

/**
 * @Description: 解决 seata 与 zipkin 整合时因 SeataFeignClientAutoConfiguration 和 TraceFeignClientAutoConfiguration 都创建 Bean:feignHystrixBuilder 冲突问题
 */
@Component
@ConditionalOnClass({RequestInterceptor.class,GlobalTransactional.class})
public class SetSeataInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate request) {
        String xid = RootContext.getXID();
        if (StringUtils.isNotEmpty(xid)) {
            request.header(RootContext.KEY_XID, xid);
        }
    }
}

启动类排除 SeataFeignClientAutoConfiguration.class

@SpringBootApplication(exclude = {SeataFeignClientAutoConfiguration.class})

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

作者:charmsongo
链接:https://juejin.cn/post/6913764188561244167
来源:掘金


推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
author-avatar
123454ewefewf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有