快速入门链路追踪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,一经查实,立即删除!

相关文章

mysql数据库安装_修改密码_忘记密码(修改)

mysql安装_ 忘记密码_找回密码 1.mysql安装 安装包准备好&#xff0c;删除cos7自带的 mysql rpm -qa | grep -i -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps2&#xff09;将安装包和JDBC驱动上传到/opt/module/mysql&#xff0c;共计**6 **个 01_mysql-community-…

SD-WAN与IPSec的对比

在现代企业中&#xff0c;随着网络环境的日益复杂&#xff0c;SD-WAN和IPSec作为两种关键的网络技术&#xff0c;各有其独特的优势和应用场景。那么&#xff0c;SD-WAN和IPSec究竟有什么不同&#xff1f;企业在不同情况下应该选择哪种技术呢&#xff1f; SD-WAN和IPSec的基本概…

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

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

php实现抖音小程序支付

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

cad图纸防泄密 :数据保护策略

在数字化时代&#xff0c;CAD图纸是工程设计行业的重要资产&#xff0c;它们承载了设计师的心血和创新成果同时也具有较大的经济价值。然而&#xff0c;随着网络技术的发展&#xff0c;图纸泄露的风险也日益增加&#xff0c;这不仅可能导致经济损失&#xff0c;还可能对企业的品…

QComboBox条目可选择状态

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

4线SPI和3线SPI的区别记录

SPI比较混乱&#xff0c;主要是没有标准的协议&#xff0c;只有moto的事实标准。所以衍生出多个版本&#xff0c;但没有本质的差异。 常见的SPI信号有&#xff1a;SS片选、SCK同步时钟、MISO、MOSI&#xff08;也有叫SDI、SDO的&#xff09;数据输入和输出&#xff0c;还的有包…

树莓派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;避免电脑磁盘数据泄露。在这里小编推荐使用文件夹只读…

【 k8s 标签与选择器 】

一、标签&#xff08;Label&#xff09; 用于给Kubernetes资源&#xff08;如Pod、Service、Deployment等&#xff09;打上自定义的键值对标识。以便更方便地管理和操作这些资源。 在各类资源的 metadata.labels 中进行配置。可以通过改配置文件的方式打标签。 apiVersion: v1…

python记录之元组

一、元组简介 元组&#xff08;Tuple&#xff09;是Python中的一个内置数据类型&#xff0c;用于存储一系列不可变&#xff08;immutable&#xff09;的元素。与列表&#xff08;List&#xff09;相似&#xff0c;元组也是有序的集合&#xff0c;但元组一旦创建就不能被修改&a…

10分钟Apache Kylin快速入门

Apache Kylin的入门教程可以分为以下几个主要步骤&#xff0c;下面将按照这些步骤进行详细的解释和归纳&#xff1a; 一、环境准备 操作系统&#xff1a;Kylin推荐在Linux系统上运行&#xff0c;尤其是CentOS 6.5或Ubuntu 16.0.4。Java环境&#xff1a;需要安装Java 1.8或更高…

Axios 源码中拦截器的实现

今天构建了一个新项目的架子&#xff0c;想着自己文章里好像没有对Axios源码的文章。今天对其中响应和请求的拦截器的Axios源码记录一下 Axios 的拦截器实现基于 Axios 的核心原理&#xff0c;即 Axios 实例是一个包含请求和响应拦截器堆栈的对象。当发出请求或接收响应时&…

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;安装源为/…

对换与覆盖

目录 多道程序环境下的对换技术 对换技术的基本思想 对换技术的目标 对换技术的实现 对换技术的挑战 对换技术的改进 对换区的管理 对换区的分配 对换区的位置 对换区的大小 对换策略 多层次对换区管理 进程的换出与换入 1. 换出&#xff08;Swapping Out&#xf…

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;定期执行 执行后目录效果