快速入门链路追踪sleuth整合zipkin(代码演示)

1、演示项目背景

2、pom.xml

3、启动项目

4、测试

5、保存数据到数据库

6、通过mq保存数据到mysql

7、通过mq保存数据到es


1、演示项目背景

下载zipkin,建议使用2.x版本的,3.x版本的要求jdk高版本。如果自己是1.8,就下载2.x

下载地址:Central Repository: io/zipkin/zipkin-server (maven.org)

使用consul作为注册配置中心,自己也可以使用nacos等其他的。

三个微服务(consumer和provider代码在上一篇文章)

新加个gateway是为了更能清楚查看链路信息

service-gateway代码

application.yml

server:port: 9092
spring:application:name: service-gatewaycloud:consul:host: localhostport: 8500discovery:register: true  #是否需要注册instance-id: ${spring.application.name}-01 #实例名称(必须唯一)service-name: ${spring.application.name} #服务名称port: ${server.port}  #服务端口prefer-ip-address: true #是否使用ip注册服务ip-address: ${spring.cloud.client.ip-address} #请求服务ip地址health-check-timeout: 5sgateway:routes:- id: service-consumeruri: lb://service-consumerpredicates:- Path=/service-consumer/**filters:- StripPrefix=1- id: service-provideruri: lb://service-providerpredicates:- Path=/service-provider/**filters:- StripPrefix=1zipkin:base-url: http://localhost:9411/ sender:type: web     #传输方式,web、rabbit、kafka、rocketmqsleuth:sampler:probability: 1.0   #应该采样的请求的概率。 
#例如。 1.0-应抽样100%的请求。 精度仅是整数(即不支持0.1%的迹线).    如果是1.0就会保存所有的请求。

启动类

package com.txd;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayApplication
{public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

pom

 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies>

service-consumer的yml

server:port: 9090
spring:application:name: service-consumercloud:consul:host: localhostport: 8500discovery:register: true  #是否需要注册instance-id: ${spring.application.name}-01 #实例名称(必须唯一)service-name: ${spring.application.name} #服务名称port: ${server.port}  #服务端口prefer-ip-address: true #是否使用ip注册服务ip-address: ${spring.cloud.client.ip-address} #请求服务ip地址zipkin:base-url: http://localhost:9411/ sender:type: web     #传输方式,web、rabbit、kafka、rocketmqsleuth:sampler:probability: 1.0    #应该采样的请求的概率。 
#例如。 1.0-应抽样100%的请求。 精度仅是整数(即不支持0.1%的迹线).    如果是1.0就会保存所有的请求。

service-provider的yml


spring:application:name: service-providercloud:consul:host: localhostport: 8500discovery:register: true  #是否需要注册instance-id: ${spring.application.name}-01 #实例名称(必须唯一)service-name: ${spring.application.name} #服务名称port: ${server.port}  #服务端口prefer-ip-address: true #是否使用ip注册服务ip-address: ${spring.cloud.client.ip-address} #请求服务ip地址config:enabled: true     #是否开启配置中心format: yaml      #配置文件格式,这里用的yamlprofile-separator: "-"  #例如: service-provider和dev中间的符号 用-就是service-provider-devdata-key: data    #默认的值就是data  是config的keyprefix: config    #默认的值就是config 是配置的前缀profiles:active: devzipkin:base-url: http://localhost:9411/  sender:type: web     #传输方式,web、rabbit、kafka、rocketmqsleuth:sampler:probability: 1.0    #应该采样的请求的概率。 
#例如。 1.0-应抽样100%的请求。 精度仅是整数(即不支持0.1%的迹线).    如果是1.0就会保存所有的请求。server:port: 9091

2、pom.xml

因为需要用sleuth和zipkin,依赖必须导。保证三个微服务都有

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId><version>2.2.1.RELEASE</version></dependency>

3、启动项目

保证consul和zipkin服务端都已经运行

zipkin启动:        java -jar zipkin....jar

consul启动:    consul.exe agent -dev

启动后分别访问:localhost:8500        localhost:9411 

启动三个微服务项目,查看consul都已经注册上去了

4、测试

接口逻辑1:通过gateway网关访问consumer服务,consumer服务调用provider服务

接口逻辑2:直接访问consumer服务,consumer服务调用provider服务

测试接口:访问localhost:9092/service-consumer/1

查看zipkin:

可以看到我们调用的方法,经过了三个服务的链路(其他的链路是consul的异步请求不用管)

点进去查看,我们可以看到每一个服务的耗时、地址等信息。

点击依赖:

我们可以看到每个服务之间的调用关系

直接访问consumer服务,不经过网关:localhost:9090/1

如果太多了,我们可以进行筛选:

现在的请求都是保存在内存中,如果我们重启zipkin这些链路数据就会全部丢失。

5、保存数据到数据库

不用改代码

新建数据库zipkin        建表语句(官方提供的,我复制到这里)

CREATE TABLE IF NOT EXISTS zipkin_spans (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL,`id` BIGINT NOT NULL,`name` VARCHAR(255) NOT NULL,`remote_service_name` VARCHAR(255),`parent_id` BIGINT,`debug` BIT(1),`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';CREATE TABLE IF NOT EXISTS zipkin_annotations (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';CREATE TABLE IF NOT EXISTS zipkin_dependencies (`day` DATE NOT NULL,`parent` VARCHAR(255) NOT NULL,`child` VARCHAR(255) NOT NULL,`call_count` BIGINT,`error_count` BIGINT,PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

重新启动zipkin,启动命令:

java -jar zipkin-server-2.24.1-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=123456 --MYSQL_DB=zipkin

可以发现数据已经存入到mysql中,当我们继续使用上面配置数据库命令启动时就会自动恢复数据库中的数据

链路信息是巨多的,长时间持续写入对数据库压力也是巨大的

6、通过mq保存数据到mysql

给三个微服务都添加rabbit依赖

        <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId></dependency>

修改配置文件:(三个都修改)


spring:application:name: service-providercloud:consul:host: localhostport: 8500discovery:register: true  #是否需要注册instance-id: ${spring.application.name}-01 #实例名称(必须唯一)service-name: ${spring.application.name} #服务名称port: ${server.port}  #服务端口prefer-ip-address: true #是否使用ip注册服务ip-address: ${spring.cloud.client.ip-address} #请求服务ip地址config:enabled: true     #是否开启配置中心format: yaml      #配置文件格式,这里用的yamlprofile-separator: "-"  #例如: service-provider和dev中间的符号 用-就是service-provider-devdata-key: data    #默认的值就是data  是config的keyprefix: config    #默认的值就是config 是配置的前缀profiles:active: devzipkin:base-url: http://localhost:9411/  #服务名称sender:#传输方式改为rabbittype: rabbit     #传输方式,web、rabbit、kafka、rocketmq#指定rabbitmq的传输队列rabbitmq:queue: zipkinsleuth:sampler:probability: 1.0#rabbitmq相关配置rabbitmq:addresses: 192.168.133.102port: 5672username: guestpassword: guestlistener:direct:retry:enabled: truemax-attempts: 5initial-interval: 5000simple:retry:enabled: truemax-attempts: 5initial-interval: 5000
server:port: 9091

启动rabbitmq。

为了更加清楚看到链路数据发送到mq中,我们先关掉zipkin服务端。

如果打开,消息发送到mq就会被直接消费掉。

并且清空数据库之前的链路数据,清空三个表的数据。

现在队列是没有任何东西的,我们重新启动三个服务

数据库zipkin表中也没有任何数据

启动微服务项目

可以看到zipkin队列已经自动创建出来了,而且也有了消息。(注册中心调用的异步请求)

我们再调用几次接口

启动zipkin(连接信息换成自己的)

java -jar zipkin-server-2.24.1-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306--MYSQL_USER=root --MYSQL_PASS=123456 --MYSQL_DB=zipkin --RABBIT_ADDRESSES=192.168.133.102:5672 --RABBIT_USER=guest --RABBIT_P
ASSWORD=guest --RABBIT_VIRTUAL_HOST=/ --RABBIT_QUEUE=zipkin

配置数据库信息和RabbitMQ连接信息

可以看到zipkin中已经有了链路数据

再查看数据库

数据也已经成功保存到mysql中

7、通过mq保存数据到es

不用修改代码,启动es服务   ,启动kibana

重新启动zipkin

启动命令:(换成自己的es地址和mq地址)

java -jar zipkin-server-2.24.1-exec.jar --STORAGE_TYPE=elasticsearch --ES_HOSTS=192.168.133.102:9200 --RABBIT_ADDRESSES=192.168.133.102:5672 --RABBIT_USER=guest --RABBIT_PASSWORD=guest --RABBIT_QUEUE=zipkin

启动微服务项目

查看rabbitmq界面(已经有数据被消费了)

这时候查看elasticsearch

打开192.168.133.102:5601

zipkin会自动根据当前年月日创建index

可以看到数据已经成功被存储到es中了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文看懂企业FTP服务器替代解决方案

FTP (File Transfer Protocol) 是一种用于在计算机网络上传输文件的协议。它基于客户端-服务器模型&#xff0c;用户可以通过一个支持FTP协议的客户端程序连接到远程FTP服务器&#xff0c;然后上传或下载文件。 FTP虽然是一种广泛使用的文件传输协议&#xff0c;但它也存在一些…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

QComboBox条目可选择状态

有时候下拉框需要根据情况&#xff0c;将某些条目设为不可点击状态&#xff0c;或者动态切换为可点击状态&#xff0c;可采用以下方法。 //item1可选ui->comboBox->setItemData(0, QVariant(-1), Qt::UserRole-1);//item2不可选ui->comboBox->setItemData(1, QVari…

树莓派4B_OpenCv学习笔记3: 系统自动更新时间_测试CSI摄像头_安装OpenCv_4.6(未成功编译源码)_备份树莓派镜像

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本文我只是安装了OpenCv 4.6&#xff0c;但编译源码失败了&#xff01;有关 OpenCv 部分仅做笔记暂存&#xff01; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令…

python ---使用python操作mysql ---> pymysql

本章内容: 1:能够完成从MySQL中读取出数据; [重点] 查询: execute()、fetchall() 2:能够将数据写入MySQL数据库。 [重点] 插入数据: execute() sql insert into xxx [掌握]pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和M…

怎么避免电脑磁盘数据泄露?磁盘数据保护方法介绍

电脑磁盘是电脑存储数据的基础&#xff0c;而为了避免磁盘数据泄露&#xff0c;我们需要保护电脑磁盘。下面我们就来了解一下磁盘数据保护的方法。 磁盘加密 磁盘加密可以通过专业的加密算法来加密保护磁盘数据&#xff0c;避免电脑磁盘数据泄露。在这里小编推荐使用文件夹只读…

E: Unable to locate package ros-kinetic-usb-cam

mkdir -p USB/src && cd USB/src catkin_init_workspace git clone https://github.com/bosch-ros-pkg/usb_cam.git cd .. catkin_make source devel/setup.bash echo "source ~/USB/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 编译过程报错&…

yum进阶——配置yum源

一、yum概述 yum的主要作用 解决依赖关系 自动安装 自动升级 各个系统中的安装软件服务 CentOS7 &#xff1a;yum -y 安装 rpm包 CentOS8 &#xff1a;dnf&#xff08;yum的升级版&#xff09;&#xff0c; Ubantu(22.04) &#xff1a;apt -y 安装&#xff0c;安装源为/…

vue面试题2-根据以下问题回答

以下是针对提供的关于Vue的问题的回答&#xff1a; Vue的基本原理&#xff1a; Vue.js是一个流行的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。其基本原理包括响应式数据、模板、组件系统、指令、生命周期钩子和虚拟DOM。 双向数据绑定的原理&#xff1a; Vue通…

【ROS2大白话】四、ROS2非常简单的传参方式

系列文章目录 【ROS2大白话】一、ROS2 humble及cartorgrapher安装 【ROS2大白话】二、turtlebot3安装 【ROS2大白话】三、给turtlebot3安装realsense深度相机 【ROS2大白话】四、ROS2非常简单的传参方式 文章目录 系列文章目录前言一、launch文件传参的demo1. 编写launch.py文…

MySQL8.3日志文件占用硬盘空间过大,释放方法

执行 reset master; 即可解决问题&#xff0c;我写了个任务&#xff0c;定期执行 执行后目录效果

基于python flask的旅游景点评论数据可视化大屏实现,包括数据采集

背景 在旅游行业中&#xff0c;了解游客对旅游景点的评论和评价对于景点管理和市场营销至关重要。通过采集旅游景点评论数据并进行可视化分析&#xff0c;可以帮助景点管理者更好地了解游客对景点的看法和体验&#xff0c;发现优劣势&#xff0c;优化服务和提升用户满意度。基…

Web3的应用场景分析

Web3&#xff0c;即基于区块链技术的去中心化互联网&#xff0c;正逐渐改变我们与数字世界的互动方式。以下是Web3的一些主要应用场景。Web3技术正在各个领域推动创新&#xff0c;创造更多透明、开放和去中心化的解决方案&#xff0c;为用户带来更高的自主权和安全性。北京木奇…

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(五)数据处理

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

性能级NVMe全闪存储系统开箱评测

近日&#xff0c;我们对一款备受瞩目的Infortrend普安科技推出更高性能的存储产品——性能级NVMe全闪存储系统GS 5024UE 进行评测&#xff0c;这款设备搭载第五代IntelXeon处理器&#xff0c;性能达到50GB/s、1.3M IOPS与0.3毫秒延迟。下面对此款设备从外观、配置、产品性能及适…

瑞鑫RK3588 画中画 OSD 效果展示

这些功能本来在1126平台都实现过 但是迁移到3588平台之后 发现 API接口变化较大 主要开始的时候会比较费时间 需要找到变动接口对应的新接口 之后 就比较好操作了 经过几天的操作 已实现 效果如下

ThinkPHP发邮件配置教程?群发功能安全吗?

ThinkPHP发邮件的注意事项&#xff1f;如何优化邮件发送的性能&#xff1f; 无论是用户注册、密码重置还是消息提醒&#xff0c;发送邮件都是一个常见的需求。AokSend将详细介绍如何在ThinkPHP框架中配置和发送邮件&#xff0c;帮助开发者轻松实现邮件功能。 ThinkPHP发邮件&…

【Linux驱动】【手把手配置3568寄存器】点亮RK3568的一颗LED

【硬件】 3568的LED9 &#xff1a;引脚 GPIO0 B7 【配置GPIO的复用】 找配置复用关系的寄存器基地址、偏移地址、对应配置的GPIO。 查找&#xff1a;io -r -4 0xfdc2000c 系统设置的默认值 结果为1&#xff0c;意思是只有bit 0是1&#xff0c;其他全都为0。所以系统默认就是…

资质升级路径:掌握建筑装饰乙级设计资质要求

建筑装饰乙级设计资质的升级路径及要求可以归纳如下&#xff1a; 一、基本要求 企业资历与信誉&#xff1a; 企业需具有独立法人资格。社会信誉良好&#xff0c;注册资本不少于100万元人民币。从事建筑设计业务4年以上&#xff0c;并独立承担过不少于3项工程等级为二级及以上的…

翻译《The Old New Thing》- What were ShellExecute hooks designed for?

What were ShellExecute hooks designed for? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080910-00/?p20933 Raymond Chen 2008年09月10日 ShellExecute 钩子是为什么设计的&#xff1f; 简要 ShellExecute钩子设计用于扩展可执行字…